2017年6月20日 星期二

mBlock 使用技巧:IoT 應用

前提

近日購買了 Makeblock 的 Me IoT Wi-Fi 模組,可以讓 mBot 通過 Wi-Fi 上傳資料或下載資料。正式使用 Me IoT Wi-Fi 模組前,需要先進行簡單的設定,詳情可參閱港澳區獨家總代理 Everbest 的教學。另外,亦需要對 ESP8266 的 AT 指令有少許認識,可以看看這裡

程式編寫

由於這個 Me IoT Wi-Fi 模組真的很新,暫時沒有 mBlock 程式可以使用,需要使用 Arduino C 進行編寫,希望將來會有人開發 mBlock 程式,讓小學生也可以輕易受惠。

今次我會使用 Thingspeak 作為例子,上傳溫濕度到 Thingspeak 網站,成果可以看這裡。主控版用了 Me Orion 作例子,mCore 也可使用的。

一開始先要 include 一些必須的 Header 檔,其中 ESP8266 是 Wi-Fi 晶片的 Header 檔,可以在這裡下載,然後把 ESP8266.h 和 ESP8266.cpp 和你的 ino 檔案放在同一個資料夾內,放置後需要重啟 Arduino IDE,才可成功 Compile。

#include <Arduino.h>
#include <MeOrion.h>
#include "ESP8266.h"
#include <Wire.h>
#include <SoftwareSerial.h>


之後就到一些我們會用上的感應器:

/* Me 溫濕度計 */
MeHumiture thermometer(PORT_4);

/* Wi-Fi模組 PORT_6*/
SoftwareSerial wifiSerial(A3, A2);
ESP8266 wifiConnection(wifiSerial);


SoftwareSerial 要使用每個連接埠的 RX 和 TX 作為輸入,每塊主控板的互相對應的 PIN 可參考下表:
連接埠mCore(MeMCore.h)Me Orion(MeOrion.h)Me Auriga(MeAuriga.h)Me Uno Shield(MeShield.h)
PORT_112, 1110, 114, 510, 11
PORT_210, 99, 32, 312, 9
PORT_3A3, A213, 126, 78, 13
PORT_4A1, A02, 88, 93, NC
PORT_5RX, TXRX2, TX2RX, TX
PORT_6A3, A2A15, A102, NC
PORT_7A1, A6A14, A9A3, A2
PORT_8A0, A7A13, A8A1, A0
PORT_9A12, A74, 5
PORT_10A11, A67, 6


程式的設定部份:

int humidity;
int temperature;

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


最後就是程式的不斷重覆的部份,我會一次過將所有程式貼上,然後在註解中解釋:

void loop() {
    /* 先從感應器取得需要的數據 */
    thermometer.update();
    humidity = thermometer.getHumidity();
    temperature = thermometer.getTemperature();

    /* 將Wi-Fi模組設置到STA+AP 模式 */
    if (wifiConnection.setOprToStationSoftAP()) {
        Serial.println("Set Wi-Fi Module to STA+AP Success");
    } else {
        Serial.println("Set Wi-Fi Module to STA+AP Fail");
    }
    delay(5000);

    /* 連接Wi-Fi SSID */
    /* 分別將你知道的Wi-Fi SSID和密碼填在joinAP的副程式內 */
    if (wifiConnection.joinAP("XXXXXXXX", "********")) {
        Serial.print("Connect to Wi-Fi Success");
    } else {
        Serial.print("Connect to Wi-Fi Fail");
    }
    delay(5000);

    /* 連接Thingspeak的TCP */
    if (wifiConnection.createTCP("184.106.153.149", 80)) {
        Serial.println("Create TCP Connection Success");
    } else {
        Serial.println("Create TCP Connection Fail");
    }
    delay(5000);

    char cmd[100];

    /* 準備上傳資料的指令 */
    /* API_KEY是你的頻度的Thingspeak API Key,每個頻度的都不同 */
    /* 最後必須用\r\n作結尾 */
    sprintf(cmd, "GET /update?api_key=API_KEY&field1=%d&field2=%d\r\n", temperature, humidity);
    Serial.println(cmd);

    /* 傳送指令 */
    if(wifiConnection.send(cmd, strlen(cmd))) {
        Serial.println("Send Command Success");
    } else {
        Serial.println("Send Command Fail");
    }
    delay(5000);

    /* 斷接TCP */
    /* 由於這個程式會不斷運行,不會關上 */
    /* 為避免太多TCP連接造成網絡緩慢,因此每次更新資料後,都應要斷接TCP */
    if (wifiConnection.releaseTCP()) {
        Serial.println("Release TCP Success");
    } else {
        Serial.println("Release TCP Fail");
    }
    delay(1000);
    Serial.println("End of Data Update");

    /* 再等候10秒,共30秒更新一次資料,Thingspeak要求最少要等候15秒 */
    delay(10000);
}


總結

以上程式最重要是用了 HTTP 的 GET 去給伺服器更新資料,如果你對網頁編寫有經驗,可以嘗試為自己的網站進行資料更新。之後,我會嘗試用這個方法,讓 mBot 取得網上的資料,再呈現在 mBot 上。

沒有留言:

張貼留言