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

ต่อจาก Lesson12 หลังจากที่เราติดตั้ง MQTT Broker ที่เครื่องของเราและลองทดสอบผ่าน MQTT Box เรียบร้อย บทเรียนนี้เราจะสั่งปิดเปิดไฟ LED จาก MQTTBox กันครับ

บทความนี้จะช่วยให้เราต่อยอดไปทำ Website หรือ Mobile Appication เพื่อควบคุม Arduino ได้อย่างแน่นอน

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

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

อุปกรณ์

ลำดับชิ้นส่วนจำนวน
1Notebook หรือ Computer1 เครื่อง
2ESP8266-ESP011 ตัว
3Arduino UNO R3 Board1 ตัว

เริ่มกันเลย!!!
1. เนื่องจาก Code ชุดนี้ใช้ Library ชื่อว่า PubSubClient.h ดังนั้ติดตั้ง Library นี้ก่อนครับ โดยเข้าไปที่ Manage Libraries คลิกตามภาพที่ 1 นะครับ จากนั้นกรอกคำว่า PubSubClient และกดปุ่ม Install ดังภาพที่ 2 ครับ

ภาพที่ 1 แสดงการเข้าไปเพิ่ม Libraries PubSubClient


ภาพที่ 2 แสดงการติดตั้ง Libraries PubSubClient

*บทความสำหรับติดตั้ง Library โดยระเอียด คลิกที่นี่

2. Compile Sourcecode : โดยคลิก Download Source Code ที่นี่ จากนั้น Copy Source Code นี้วางที่ Arduino IDE ของท่าน (อย่าลืมกำหนดค่า Access point และ Password) เปลี่ยนประเภท Board เป็น ESP8266 ตามภาพที่ 3 และกด Validate ครับ

ภาพที่ 3 เปลี่ยนประเภท Board เป็น ESP8266 จากนั้น กด Validate ครับ

4. อธิบาย Source Code ดังนี้

#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();

}

5. ต่อวงจรตามรูปนี้ครับ

ภาพที่ 4 แสดงการต่อวงจรกับ ESP01

6. ก่อนจะ Upload Code ไปที่ Arduino ตรวจสอบการทำงานของ MQTT Broker ก่อนครับ
โดยเปิดที่ Windows Service และตรวจสอบการ Run Service ดังภาพที่ 5

ภาพที่ 5 แสดงการ Run Service MQTT Broker

7. ทดสอบการส่ง Public และ Subscribe ไปที่ MQTT Broker โดยใช้ MQTTBox โดยกำหนดชื่อ Topic เป็น “esp/test” จะได้ดังภาพที่ 7 ครับ หากติดปัญหาไม่สามารถส่งข้อมูลหา MQTT Broker ได้ให้ลองอ่าน Lesson 12 ดูนะครับ

ภาพที่ 7 ทดสอบการเชื่อมต่อ MQTT Broker และทดสอบส่งคำสั่ง Publish และ Subscriber

8. เมื่อถึงขั้นตอนนี้ทดลอง Upload Code ไปที่ Arduino Board ได้เลยครับ เมื่อ Upload แล้วลองกดหน้าต่าง Serial Monitor เพื่อดู Status Message ที่ได้เขียนกำกับไว้ใน Code ครับ

Message จะถูก Write ออกมาโดยเริ่มจากการต่อไปที่ Wifi ตามที่ท่านได้กำหนดไว้ใน Code
เมื่อต่อ Wifi ได้แล้วจะเริ่มทำการติดต่อไปที่ MQTT Server ซึ่งควรจะได้ Message ดังภาพที่ 8 ครับ

ภาพที่ 8 แสดง Message ที่ควรจะแสดงในช่อง Serial Monitor

9. เมื่อได้รับ Message “connected” ตามภาพที่ 8 แล้วให้ลองเปิดหน้าต่าง MQTTBox จะพบ Message “Hello from ESP8266” ดังภาพที่ 9 นี้ แสดงว่า MQTT ได้รับข้อมูลการ Publish จาก Arduino แล้ว

ภาพที่ 9 แสดงหน้าต่าง MQTTBox เมื่อได้รับ Message Publish จาก Arduino ครับ

10. สังเกตุดู LED ที่ต่อไว้และทดลองส่งคำสั่งจาก MQTTBox ได้เลยครับโดยพิมพ์คำว่า
{‘hello’:’0′} เพื่อปิดไฟ และ {‘hello’,’1′} (Message นี้โดน If เอาไว้ใน Arduino Code เช็คค่า 0 และ 1 ไว้) เพื่อเปิดไฟ ลองเปิดหน้าต่าง Serial Monitor ดูด้วยครับ จะเห็น Message ที่เราส่งมาจาก MQTTBox

ภาพที่ 10 แสดงการส่ง Publish Message จาก MQTTBox ไปที่ Arduino

11. สำเร็จแล้ว !!! ถึงขั้นตอนนี้เราสามารถสร้าง MQTT Broker(Server) ได้เองแล้ว นอกจากนี้เราสามารถสั่งปิด เปิดไฟผ่าน Protocol MQTT ได้แล้ว ต่อไปเราจะทำ Mobile Application ควบคุม Arduino ผ่าน MQTT กันครับ

Next Step :
บทความต่อไป เรามาสร้าง Android Application สั่งงาน Arduino ผ่าน MQTT Broker กันนะครับ โปรดติดตาม

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