MQTT เป็น Protocol ขนาดเล็กที่เกิดมาเพื่องานด้าน IoT สำหรับใครที่ยังไม่รู้จัก ยังไม่เคยลองเล่น ลองเข้าไปศึกษากันก่อนได้เลย
รู้จักกับเครื่องมือเราก่อน
- M5GO
อุปกรณ์ micro controller ที่ข้างในมีชิบ esp32 (ดีกว่า 8266) แถมยังมีหน้าจอ LCD, Button และ Speakers ภายในตัว ไม่ต้องต่ออะไรเยอะมากมายเสียบสายก็พร้อมใช้งานได้เลย สาเหตุที่ชื่อ M5 ก็เพราะว่า…. ขนาดมัน 5 นิ้วยังไงละ (ตามที่ CEO ของ M5 ได้กล่าวไว้) ส่วน STACK ก็คือการนำเอาชิ้นส่วนต่างๆมาประกอบโดยการซ้อนกัน (stack) นั้นเอง เป็นบอร์ดเริ่มต้นที่มาพร้อมกับอุปกรณ์ครบครันและ ราคาก็ไม่แพงแค่ 3xxx บาทเอง
2. vscode
ดาวน์โหลดและ ติดตั้งได้จาก https://code.visualstudio.com/
3. Platform IO IDE
IDE โคตรเทพครอบจักรวาลเขียนโปรแกรมลง Micro controller ได้แทบจะทุกตัวที่นิยมกัน และติดตั้งง่ายมาก เพราะเป็น Extension ใน vscode
ลงเสร็จแล้วให้พิมใน Terminal ของ vs code ตามนี้
pip install -U platformio
หากใครติดตั้งไม่ได้ให้ลง python ได้จาก https://www.python.org/downloads/
ทำให้ M5GO ต่อ Wifi
- ทำการสร้าง Project ใน Platform IO ก่อน โดยตั้งค่าตามนี้
2. สร้างเสร็จแล้วให้เข้าไปแก้ไขที่ main.cpp
เพิ่มโค้ดเสร็จแล้วให้มาเพิ่มโค้ดบรรทัดนี้ลงในไฟล์ platformio.ini
monitor_speed = 115200
monitor_speed จะเป็นการตั้งค่า ให้Serial monitor อ่านค่าจาก Serial.begin(1152000) ที่เราเขียนไว้ได้
3. Upload Code กันเลย กดที่กรอบสีแดง
Shortcut Key :Ctrl + Alt + u
4. พอ Upload เสร็จแล้วเราก็มาเปิด Serial monitor ดูกันเลย กดที่กรอบแดง
Shortcut Key :Ctrl + Alt + s
ทุกอย่างสำเร็จด้วยดีผลที่ได้จะออกมาหน้าตาแบบนี้
แค่นี้เราก็สามารถเชื่อมต่อ M5GO กับ WiFi ได้เรียบร้อยแล้ว
เชื่อมต่อ MQTT กับ M5GO
เมื่อเราต่อWiFi ได้แล้ว และก็เคยลองเล่น CloudMQTT กับ MQTTLens ไปแล้วด้วย ต่อไปเราจะทำให้เจ้าตัว M5GO สามารถ Subscribe Topic จาก CloudMQTT กัน
เริ่มแรกเลยเราต้องดาวโหลดและติดตั้ง PubSubClient.h กันก่อนสามารถติดตั้งได้จาก
จะง่ายกว่านั่นถ้าคุณติดตั้ง Platform IO จะสามารถโหลดจาก หน้า Libraries ได้เลยแบบนี้
ต่อไปเรามาเริ่มเขียนโค้ดกัน เริ่มด้วยกัน Include Library ที่เราต้องการใช้กันก่อน
ต่อไปเราก็มาสร้างตัวแปรที่สำคัญในการเก็บค่าต่างๆ เช่น Server name, Port อื่นๆ
ข้อมูลต่างๆหาได้จาก CloudMQTT ยกเว้น MQTT_NAME ตั้งอะไรก็ได้
Username Password ดูได้จาก หน้า User & ACLs
และที่สำคัญ ตั้งค่าในส่วนของ ACLs เพื่อให้ User แล้ว Topic ที่มี /ESP32_1/ ทั้งหมด สามารถเขียนและอ่านได้
สร้าง Function ที่ชื่อว่า MQTTSetup ใน Function นี้ทำการกำหนดข้อมูลต่างๆเช่น Server อยู่ไหม ใช้ Port อะไรและ กำหนดว่า เมื่อเกิดการรับค่าแล้วให้เรียกฟังชั่นอะไร( callback ) เราจะกำหนดให้ตรงกันว่า callback
สร้าง callback Function เพื่อแสดงผลข้อมูล ที่ Subscribe จาก MQTT Topic
ลอง Upload กันเลย
ถ้าใน Serial Monitor แสดงผลแบบนี้ แสดงว่าเราเชื่อมต่อกับ MQTT Broker ได้สำเร็จ สามารถมาดูใน Connection ของ CloudMQTT ได้จะเห็นอุปกรณ์เชื่อมต่ออยู่ 1 อุปกรณ์
ต่อไปเราจะให้ M5GO subscribe Topic จาก CloudMQTT กัน Topic ที่จะ Subscribe คือ /ESP32_1/Test เริ่มด้วยการกำหนดตัวแปรแทน Topic ก่อน
ต่อไปเป็นส่วนของการเชื่อมต่อ MQTT จากตัว Client โดยการเขียนให้เช็คสถานะก่อนว่ามีการเชื่อมต่อกับ MQTT Broker แล้วหรือยัง ถ้ายังไม่เชื่อมให้เชื่อมต่อใหม่ ถ้าเชื่อมแล้วก็ให้ทำงานต่อไปเรื่อยๆ
เขียน Function mqttReconnect ไว้สำหรับเชื่อมต่อ MQTT Broker อีกครั้งถ้ายังเชื่อมต่อไม่สำเร็จ
mqtt.loop() เป็นส่วนที่จะคงการเชื่อมต่อระหว่างบอดและ MQTT Broker
สรุปโค้ดอีกครั้งถ้าทุกอย่างถูกจะได้หน้าตาแบบนี้
Subscribe ข้อมูลจาก MQTT Broker
เปิด WebSocket UI ใน CloudMQTT แล้วลองส่งคำว่า “Hello From CloudMQTT” ผ่าน Topic /ESP32_1/Test
มาลองดูใน Serial monitor ของ Platform IO กันจะได้ผลแบบนี้
Publish ข้อมูลไปที่ MQTT Broker
พอเรารับข้อมูลจาก MQTT ได้แล้วต่อไปก็ลองส่งข้อมูลไปที่ MQTT Broker บ้าง โดยใช้คำสั่ง Publish โดยการเขียน Function mqttTestPub ดังนี้
ลอง Upload และ เปิด Serial monitor เราจะได้แบบนี้ แสดงว่ามีการส่งข้อมูลจาก M5GO ไปยัง MQTT Broker แล้ว
ต่อไปเรามาเปิด WebSocket UI ดูว่าสามารถรับข้อมูลจาก M5GO ได้ไหม ถ้ารับได้จะขึ้นข้อความว่า Hello From M5GO
เสร็จแล้ว เห็นไหมครับ ว่าเราสามารถรับส่งข้อมูลกับ MQTT Broker ได้แล้ว
เป็นยังไงบ้างครับกับการรับส่งค่าจาก MQTT Broker หวังว่าทุกคนจะทำกันได้นะ