2017年7月29日 星期六

mBlock 使用技巧:IoT 應用(二)

前提

早前,發佈了關於 IoT 應用的文章。而近日,香港有一間公司發佈了關於 IoT 的 mBlock 擴展,分別是在 IFTTT 和 ThingSpeak 上使用。

下載方法

  1. 開啟 mBlock
  2. 按上方的擴充 (Extensions) > 擴展管理員 (Manage Extensions)
  3. 搜尋 "IoT_ThingSpeak" 或 "IoT_IFTTT",然後下載

程式編寫

我參考了他們的 Arduino 原始碼,相對我之前編寫的較為簡單,而且不需要外加 ESP8266 的檔案。我為方便自己的應用,修改了發送資料的部份。程式主要分成了三個部份:

設置Wi-Fi模組收腳位

首先,還是需要一些基本的設定,當然也包括WIFI模組的接腳位設定:
#include <Arduino.h>
#include <MeOrion.h>
#include <Wire.h>
#include <SoftwareSerial.h>

SoftwareSerial wifiSerial(A3, A2); /* 腳位選擇請參考上一篇文章 */
char cmd[256]; /* 用於發送資料 */

連接WIFI路由器

然後連接自家的Wi-Fi路由器,將程式中的 _SSID_ 及 _PWD_ 換成你的 Wi-Fi SSID 和密碼。
void setup() {
    wifiSerial.begin(9600);
    wifiSerial.println(F("AT+CWMODE=1"));
    delay(1000);
    wifiSerial.println("AT+CWJAP=\""+(String)"_SSID_"+"\"+\""+(String)"_PWD_"+"\"");
    delay(10000);
}

發送資料

最後是發送資料,做法就是 HTTP Request 方法中的 GET 一樣
void loop() {
    /* 準備上傳資料的指令 */
    /* 按自己需求提交資料到網頁 */
    /* %s:字串  %d:數字 */
    /* 最後必須用\r\n作結尾 */
    sprintf(cmd, "GET /test.php?name1=%s&name2=%d\r\n", "value1", value2);

    /* 連接自己網址的TCP(更改_IP_Address_) */
    wifiSerial.println(F("AT+CIPSTART=\"TCP\",\"_IP_Address_",80"));
    delay(5000);

    /* 發送資料 */
    int len = strlen(cmd) + 2;
    wifiSerial.println("AT+CIPSEND="+(String)len);
    delay(3000);
    wifiSerial.println(cmd);
    delay(5000);
    wifiSerial.println(F("AT+CIPCLOSE"));
}

總結

這樣就可以做到自己定義的 IoT 程式,不一定要將數據上傳到 IFTTT 或是 ThingSpeak。

而其中有些程式用到了 F() 這個功能(不是打多了一個F字),而它是 Arduino 的一個功能,用於將字串存儲在暫存記憶體內,而非 RAM 內,可以減少大量 RAM 的使用量。