2015年7月19日 星期日

淺談 IoT 和 ThingSpeak.com

ThingSpeak 是一個專為物聯網而產生的應用程式平台,它允許你使用網路設備即時地將數據上傳到雲端使之聚集在一起(成為資料)。
而頻道(Channel)是 ThingSpeak 心臟之所在,您可以切換不同的頻道以存取不同的資料。

下列圖片是您可以在 ThingSpeak 達成的事情之一,將住家的光線數據上傳到雲端:





Thingspeak 官網 https://thingspeak.com/

想要瞭解 Thingspeak 能為您做什,我們來看影片比較快,影片網址 https://www.youtube.com/watch?v=JsHGxe6lRSY

建議在使用 Thingspeak.com 之前要先註冊,註冊網址 https://thingspeak.com/users/sign_up

ThingSpeak 所提供的API,下載網址 https://github.com/iobridge/ThingSpeak



將光線數據上傳到雲端(ThingSpeak)

Thingspeak.com 允許你使用網路設備即時地將數據上傳到雲端使之聚集在一起(成為資料),所以我決定要用一個簡單的光線感測器來測試這個系統。而 Processing 應用軟體剛好符合我的需求,可以透過它操控網路攝影機來偵測人的移動,然後將結果上傳到  ThingSpeak 頻道。


開始前的測試

首先,下載這個簡單的程式,你可以透過它和 ThingSpeak.com 從事簡單的聯繫:

https://drive.google.com/file/d/0B2ZbLCPalrgEZWZjNWMxYjYtZTZmYS00YTExLThkNWYtYzI0ZjYxYWY4YzRm/view?ddrp=1&hl=en#

你可以用鍵盤隨便打幾個數字,這些數字將會被上傳到 ThingSpeak.com,如果出現下列畫面表示可以正常工作。




上傳光線感測數據

在這兒我們會使用 LDR 去偵測光線的強度,請依照下列電路圖在麵包板上插妥零件與接線。


底下這個程式很簡單,它單純地只是把 A0 腳位的值透過序列埠傳送出去,程式如下:

void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.println(analogRead(0));
  delay(2000);
}

請您將上述程式複製並貼到 Arduino IDE 裡,並上傳到板子。


接收數據

我們要用 Processing 來接收這些數據,需要變更一些程式碼,如下:

/**
 * Tests the thinkspeak channel by sending any numeric
 * keypress using the specified APIKEY and FIELD
 */

import processing.serial.*;
import processing.net.*;

//CONFIGURATION
String APIKEY = "YOURAPI"; //your api key
String FIELD = "field1";
int PORTNUM = 0; //port number of your arduino
//END CONFIGURATION

Serial arduino;
Client c;
String data;
int number; //read from arduino

void setup() {
  size(600, 400);

  //setup the serial port
  // List all the available serial ports:
  println(Serial.list());
  //Init the Serial object
  arduino = new Serial(this, Serial.list()[PORTNUM], 9600);

  // The font must be located in the sketch's
  // "data" directory to load successfully
  PFont font;
  font = loadFont("Monaco-12.vlw");
  textFont(font);
}

void draw() {
  background(50);
  fill(255);
  text("ThinkSpeak Processor", 10, 20);

  fill(0, 255, 0);
  text("Light Value Read:  " + number, 10, 40);

  if( data != null ) {
    fill(0, 255, 0);
    text("Server Response:", 10, 60);
    fill(200);
    text(data, 10, 80);
  }
  if(c != null) {
    if (c.available() > 0) { // If there's incoming data from the client...
      data = c.readString(); // ...then grab it
      println(data);
    }
  }

  //if we have a new line from our arduino, then send it to the server
  String ln;
  if( (ln = arduino.readStringUntil('\n')) != null) {
    try {
      number = new Integer(trim(ln));
      if(number < 1025) {
        println("Writing " + number);
        sendNumber(number);
      }
    }
    catch(Exception ex) {
    }
  }
}

void sendNumber(float num) {
  c = new Client(this, "api.thingspeak.com", 80); // Connect to server on port 80
  c.write("GET /update?key="+APIKEY+"&"+FIELD+"=" + num + " HTTP/1.1\n");
  c.write("Host: my_domain_name.com\n\n"); // Be polite and say who we are
}

請您將上述程式複製並貼到 Processing IDE 裡,並執行它。

如果你看到下列畫面,其中 Light Value Read:的值每 2 秒跳動一次,那麼恭喜你,你成功了。


















2015年7月12日 星期日

error: 'TKD2' was not declared in this scope

新版的 Arduino IDE 在使用 IR Library 時會編譯錯誤,如下圖:


導致錯誤的原因是因為在 IRremoteTools.cpp 裡面沒有宣告 'TKD2' 變數。

歸根究底的原因是新版的 IDE 會讀取內建的紅外線函式庫,而這個內建的紅外線函式庫是專為 Adafruit 公司產品訂製的,如果你沒有該公司的產品可能就無法使用它的函式庫。


那麼該如何解決這個問題呢? 

解決辦法有很多種,其中一種是去修改 RobotIRremote.cpp,但這個方法對於不熟悉 C 語言的人來說似乎是有點困難,有可能會愈弄愈糟。

另一種辦法是用其他可用的紅外線函式庫取代內建的 RobotIRremote Library,此舉應該是最簡單又安全的作法了。

下載 IR Library https://github.com/coopermaa/Arduino-IRremote/archive/master.zip

下載後解壓縮,將資料夾名稱更改為「IRremote」,然後複製到 [Arduino]\libraries 路徑下,再重新啟動 Arduino IDE 即可。

你也可以把 Robot_Control、Robot_Motor 和 RobotIRremote 這幾個資料夾移除掉,這樣並不會影響紅外線函式庫的運作。


檢查新的紅外線函式庫是否正常運作

我們可以開啟內建的範例程式:

1. 點擊下拉功能表 File > Examples > IRremote > IRrecvDemo

2. 點擊工具列的 Upload 按鈕。

成功編譯,如下圖: