NodeMCU/ESP8266 ส่งข้อมูลผ่าน MQTT

Toom Tam
3 min readNov 3, 2018

--

เราจะมาลองทำการส่งข้อมูลจาก NodeMCU/ESP8266 ผ่านไป MQTT เนื่องจาก ESP8266 สามารถเขียนโปรแกรมคอนโทรลอุปกรณ์ รวมไปถึงการเชื่อมต่อเพื่อรับข้อมูลจาก sensor ซึ่งสามารถนำไปประยุกต์ใช้งานได้มากมาย และบอร์ดก็มีราคาถูกมากๆ เหมาะแก่ผู้ที่คิดจะเริ่มต้นศึกษา หรือทดลองใช้งานเกี่ยวกับ Arduino, IoT, อิเล็กทรอนิกส์

เตรียมอุปกรณ์ในการส่งข้อมูล

  • NodeMCU/ESP8266 เป็นไมโครคอนโทรลเลอร์ที่สามารถเชื่อมต่อ WiFi ได้และสามารถเขียนโปรแกรมเพื่อควบคุมการทำงานได้และ Upload โปรแกรมลงบอร์ดด้วยโปรแกรม Arduino IDE ผ่านสาย USB
https://cdn.shopify.com/s/files/1/0672/9409/products/NodeMCU_ESP8266_development_board_1024x1024.jpg?v=1464135546

ในการเขียนโปรแกรมและ 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 เมื่อทำงานได้สำเร็จจะได้ผลลัพธ์ ดังรูป
เมื่อส่งข้อความสำเร็จจะแสดงข้อความ Success sending
  • ข้อความ Arduino Test MQTT จะถูกส่งไปยัง Subscribe ที่ระบุ Topic เป็น TEST/MQTT ดังรูป

--

--

Toom Tam
Toom Tam

Written by Toom Tam

Innovation Engineer, แชร์ประสบการณ์การทำงานด้าน IoT