前提
近日購買了 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_1 | 12, 11 | 10, 11 | 4, 5 | 10, 11 |
PORT_2 | 10, 9 | 9, 3 | 2, 3 | 12, 9 |
PORT_3 | A3, A2 | 13, 12 | 6, 7 | 8, 13 |
PORT_4 | A1, A0 | 2, 8 | 8, 9 | 3, NC |
PORT_5 | RX, TX | RX2, TX2 | RX, TX | |
PORT_6 | A3, A2 | A15, A10 | 2, NC | |
PORT_7 | A1, A6 | A14, A9 | A3, A2 | |
PORT_8 | A0, A7 | A13, A8 | A1, A0 | |
PORT_9 | A12, A7 | 4, 5 | ||
PORT_10 | A11, A6 | 7, 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);
}
沒有留言:
張貼留言