Lesson 17 : ก้าวเข้าสู่ IOT – ตอนที่ 7 Node-RED ต่อ MQTTBroker

ใน Series ของ Node-RED ผมจะแนะนำการใช้งานทั้งหมด 3 บทความโดยจะเริ่มต้นจาก
1. ทำความเข้าใจและการติดตั้ง Node-RED
2. เริ่มเขียนโปรแกรมบน Node-RED รวมถึงการทำ Email Alert
3. การเชื่อมต่อระหว่าง Node-RED และ MQTT Broker

บทความนี้เป็นตอนที่ 3 นะครับ จะเป็นการรับส่งข้อมูลระหว่าง Node-RED และ MQTT Broker ครับ จบจากบทความนี้เราจะทำ IOT ที่บ้านได้ด้วยต้นเองแล้วครับ 😀

ระดับความยาก :  

สิ่งที่จะได้จากบทเรียนนี้

อุปกรณ์
ลำดับ ชิ้นส่วน จำนวน
1 Notebook หรือ Computer ติดตั้ง – Android Studio สำหรับในบทความนี้ใช้ Version 2.3 – MQTT Broker – Node-RED Server 1 เครื่อง

เริ่ม Coding กันเลย!!!
1. ให้ลาก Node MQTT จาก Input มาวางใน Flow 1 และลากเส้นเชื่อมโยงระหว่าง Node ไปที่ Output 3 ตัว ดังภาพนี้ครับ

2. กำหนด Property ของ Node MQTT ดังภาพนี้ และกดปุ่ม Deploy ได้เลยครับ

*การกำหนดค่า Server / Topic ให้กำหนดเหมือนกับ MQTTBox หากยังไม่เข้าใจให้ ลองอ่านที่ URL : http://themakerthailand.com/mosquittomqttonwindows/ ครับ

**เมื่อกำหนด Property ได้ถูกต้อง Node MQTT จะขึ้นสถานะเป็น Connected ครับ

3. เปิด MQTTBox ของเราขึ้นมาครับและ Publish ค่าดังภาพนี้ (อย่าลืมตรวจสอบว่า สถานะเป็น Connected หรือไม่นะครับ)

4. เมื่อ Publish แล้วให้ลองเช็ค Email ดูครับ จะพบข้อความใน Payload ของเราถูกส่งมาให้ใน Email ครับ

5. อธิบายการทำงานครับเมื่อมาถึงขณะนี้ เรามี Server ทำงานอยู่ 2 ตัวครับ
1. คือ Node-RED Server ทำงานที่ Port 1880
2. คือ MQTT Broker ทำงานที่ Port 8880

ที่ Node-RED Server มี Object 1 ตัวทำการ Subscribe Topic ที่ชื่อ esp/test อยู่ครับ (เราทำในข้อ 2 ของบทความนี้) และ Object ตัวนี้ทำการเชื่อมโยงไปที่ Email Node เพื่อส่งข้อมูลไปให้ Email ตามที่เรากำหนด

ดังนั้นเมื่อเรา Publish ข้อมูลจาก MQTTBOX ด้วยข้อความว่า {‘hello’:’3′} ข้อความนี้จะถูกส่งไปที่ MQTT Broker

จากนั้น MQTT Broker จะทำการ Broadcast Message นี้ไปให้กับทุก ๆ Client ที่ Subscribe Topic นี้ทำให้ Node-RED ได้รับ Message {‘hello’:’3′} ครับ

6. จาก 5 ขั้นตอนที่ผ่านมาเรามีสร้าง Node สำหรับรับค่าจาก MQTT Broker แล้ว ต่อไปเราจะสร้าง Node สำหรับส่งข้อมูลไปหา MQTT Broker ดูบ้างครับ โดยให้ลาก Note MQTT จาก Tab Output วางใน Flow 1 ของเราและลากเส้นเชื่อมโยงจาก Button ดังภาพนี้ครับ

7. กำหนด Property สำหรับ Node MQTT นี้เป็นดังภาพนี้ครับ จากนั้นกดปุ่ม Deploy ได้เลยครับ

8. ลองเปิดหน้า UI แล้วกดปุ่มดูครับ Payload(ข้อความ) {‘hello’:’2′} จะถูกส่งมาที่ MQTTBox ได้เช่นกัน ของเราปรากฏขึ้นมาที่ Tab Debug ครับ

9. ตอนนี้เราสามารถรับส่งข้อมูลระหว่าง MQTT Broker และ Node-RED ได้แล้วให้เราทำปุ่มเพิ่ม 2 ปุ่มสำหรับเปิดปิด ไฟ LED และเราจะต่อวงจร Arduino กันครับ

10. เมื่อลากปุ่มมาวางและเชื่อมต่อไปที่ Node sendToArduino แล้วให้กำหนด Property ของแต่ละปุ่มดังสองภาพนี้ครับ จากนั้นกดปุ่ม Deploy ได้เลยครับ

11. ลองเปิดหน้า UI ดูครับ จะพบปุ่มใหม่สองปุ่ม ทดลองกดทั้งสองปุ่มและตรวจสอบค่าที่ MQTTBox ได้รับครับว่าถูกต้องหรือไม่

*{‘hello’:’0′} = ไฟปิด

**{‘hello’:’1′} = ไฟเปิด

***เนื่องจากเราทำเงื่อนไขไว้ใน Arduino ตามบทความ Lesson 13 : ก้าวเข้าสู่ IOT – ตอนที่ 3 สั่งปิดเปิดไฟผ่านโปรโตคอล MQTT

12. ตอนนี้เราพร้อมที่จะต่อวงจร Arduino แล้วครับ ให้ต่อวงจรตามภาพนี้

13. จากนั้น Deploy Sourcecode นี้ หากท่านใดทำไม่ได้ให้ลองเข้าไปอ่านบทความ Lesson 13 : ก้าวเข้าสู่ IOT – ตอนที่ 3 สั่งปิดเปิดไฟผ่านโปรโตคอล MQTT นี้ดูนะครับ อธิบายไว้ให้ครบถ้วนแล้วครับ

#include
#include
const char* ssid = “your access point name”;
const char* password = “access password”;

const char* mqttServer = “ip of mqttserver”;
const int mqttPort = 1883;
const char* mqttUser = “mqtt broker username”;
const char* mqttPassword = “mqtt broker password”;

WiFiClient espClient;
PubSubClient client(espClient);

//Pin ที่ต่อไฟ LED
const int led = 2;

void setup() {
Serial.begin(115200);
pinMode(led, OUTPUT);

//สั่งให้ไฟดับก่อน
digitalWrite(led, LOW);

//เชื่อมต่อ wifi
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“Connecting to WiFi..”);
}

Serial.println(“Connected to the WiFi network”);

//connect ไปที่ mqtt broker
client.setServer(mqttServer, mqttPort);

//กำหนด function เมื่อมีการส่งข้อมูลมาจาก MQTT
client.setCallback(callback);

while (!client.connected()) { //วนลูปจนกว่าจะต่อสำเร็จ
Serial.println(“Connecting to MQTT…”);

if (client.connect(“ESP8266Client” )) { //Connect to MQTT และกำหนดชื่อในการติดต่อ

Serial.println(“connected”);

} else {

Serial.print(“failed with state “);
Serial.print(client.state());
delay(2000);

}
}

//ส่งข้อมูล publish ไปที่ MQTT Broker โดยตั้ง topic เป็น “esp/test”
client.publish(“esp/test”, “Hello from ESP8266”);

//subscribe topic “esp/test”
client.subscribe(“esp/test”);

}

//เมื่อมีข้อมูลกลับมาจาก MQTT จะโดนส่งกลับมาที่ Method นี้
void callback(char* topic, byte* payload, unsigned int length) {

Serial.print(“Message arrived in topic: “);
Serial.println(topic);

Serial.print(“Message:”);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);

//หาก message ที่ส่งกลับมามีค่าเป็น 0 ที่ array index ที่ 10 จะสั่งให้ไฟดับ เช่น {‘hello’:’0′}
//หาก message ที่ส่งกลับมาเป็น 1 จะสั่งให้ไฟติด เช่น {‘hello’:’1′}
//ตรงนี้แล้วแต่เราจะกำหนดครับ แต่ผมอยากทำให้ง่าย ๆ ก่อนเลยใช้วิธีการ fix ค่าไว้ครับ
if (i == 10) {
if ((char)payload[i] == ‘0’) { //turn off light
digitalWrite(led, LOW);
} else {
digitalWrite(led, HIGH);
}
}
}

Serial.println();
Serial.println(“———————–“);

}

void loop() {
client.loop();

}

14. ทดลองกดปุ่มเปิดปิดไฟ จากหน้า UI และดูผลที่ Arduino ได้เลยครับ

Share ผลงาน
เมื่อน้อง ๆ ทำสำเร็จแล้วอย่าลืมแชร์ให้เพื่อนๆ ดูได้ที่ Facebook MrMakerThailand
และหากน้อง ๆ ทำไม่ได้ ให้ติดต่อมาได้ตลอดเวลาที่ Inbox นะครับ