เราจะมาลองทำการส่งข้อมูลจาก NodeMCU/ESP8266 ผ่านไป MQTT เนื่องจาก ESP8266 สามารถเขียนโปรแกรมคอนโทรลอุปกรณ์ รวมไปถึงการเชื่อมต่อเพื่อรับข้อมูลจาก sensor ซึ่งสามารถนำไปประยุกต์ใช้งานได้มากมาย และบอร์ดก็มีราคาถูกมากๆ เหมาะแก่ผู้ที่คิดจะเริ่มต้นศึกษา หรือทดลองใช้งานเกี่ยวกับ Arduino, IoT, อิเล็กทรอนิกส์
เตรียมอุปกรณ์ในการส่งข้อมูล
- NodeMCU/ESP8266 เป็นไมโครคอนโทรลเลอร์ที่สามารถเชื่อมต่อ WiFi ได้และสามารถเขียนโปรแกรมเพื่อควบคุมการทำงานได้และ Upload โปรแกรมลงบอร์ดด้วยโปรแกรม Arduino IDE ผ่านสาย USB
ในการเขียนโปรแกรมและ Upload เข้าบอร์ดเราจะใช้ Arduino IDE สามารถดาว์โหลดและติดตั้งได้จาก https://www.arduino.cc/en/Main/Software
- เมื่อติดตั้ง Arduino IDE เรียบร้อยแล้วให้ไปที่ Preference
- ใส่ URL ด้านล่างลงใน Addition Board Manager URLs
http://arduino.esp8266.com/versions/2.4.2/package_esp8266com_index.json
- จากนั้นไปที่ Tools เลือก Boar… >> Board Manager
- ในช่อง Filter your search ให้ค้นหา esp8266 หลังจากนั้นกด install เป็นอันเสร็จเรียบร้อย
- หลังจากนั้นเมื่อไปที่ Tools เลือก Boar เราจะเห็นหมวดของ ESP8266 ที่เราจะใช้นั้นเอง
- ต่อไปต้องลง Library สำหรับใช้รับส่งข้อมูลผ่าน MQTT นะครับ โดยเราจะใช้ PubSubClient ไปเลือกที่ Sketch >> Include Library แล้วเลือก Manage Libraries…
- ในช่อง Filter your search ให้ค้นหา PubSubClient เมื่อเจอแล้วกด install (ของผมขึ้น INSTALLED เพราะลงไปแล้ว)เมื่อ install เสร็จแล้ว ก็เป็นอันเรียบร้อยครับ
- เมื่อ install เสร็จแล้วสามารถไปตรวจดูได้
โค้ดตัวอย่างสำหรับ publisher
#include <ESP8266WiFi.h>#include <PubSubClient.h>#define WIFI_STA_NAME "[WiFi_SSID]"#define WIFI_STA_PASS "[WiFi_Password]"#define MQTT_SERVER "[HOST_NAME]"#define MQTT_PORT 1883#define MQTT_USERNAME "[USERNAME]"#define MQTT_PASSWORD "[PASSWORD]"#define MQTT_NAME "esp8266"WiFiClient client;PubSubClient mqtt(client);int num=0;void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); }}void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); while (!Serial) ; delay(250); Serial.println(WIFI_STA_NAME); Serial.println("WIFI Connecting"); WiFi.begin(WIFI_STA_NAME, WIFI_STA_PASS); //เชื่อมต่อ wifi while (num<20) { delay(500); Serial.print("."); num++; } if (WiFi.status() == WL_CONNECTED) { Serial.print("\n WiFi Connected. \n"); }else{ Serial.print("\n WIFI Connect fail. "); } mqtt.setServer(MQTT_SERVER, MQTT_PORT); mqtt.setCallback(callback);}
void loop() { if (mqtt.connect(MQTT_NAME, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("\n Publish message: "); if (mqtt.publish("TEST/MQTT","Arduino Test MQTT") == true) {
//ส่งข้อความ "Arduino Test MQTT" ใน Topic = "TEST/MQTT"
Serial.println("Success sending"); }else{ Serial.println("Fail sending"); } }delay(5000); // ใส่ delay ให้เว้นระยะส่งข้อความทุกๆ 5 วินาที}
- ให้ Upload ไปยัง NodeMCU
- เมื่อ Upload ได้ 100% แล้วสามารถ monitor การทำงานได้ โดยคลิ๊ก Serial Monitor เมื่อทำงานได้สำเร็จจะได้ผลลัพธ์ ดังรูป
- ข้อความ Arduino Test MQTT จะถูกส่งไปยัง Subscribe ที่ระบุ Topic เป็น TEST/MQTT ดังรูป