M5GO + JSON = Awesome x DrZin

L Pasawee
Dr-Zin
Published in
4 min readAug 16, 2019

ในบทความนี้เราจะสอนให้ M5GO สามารถรับและส่ง JSON กับ Node-red ผ่าน MQTT ได้ เริ่มการทดลองกันเลย

ความรู้พื้นที่ควรรู้

  • MQTT แบบเบสิคโคตรๆ
  • การใช้งาน MQTT ผ่าน Node-red เพื่อ Publish และ Subscribe
  • Publish/Subscribe MQTT Broker จาก Node-red

เราจะถือว่าทุกคนได้อ่านทำความเข้าใจกันมาอย่างเรียบร้อยแล้ว เรามาเริ่มกันเลยด้วยการทำความรู้จักกับ JSON ว่ามันคืออะไร แล้วมันสำคัญยังไงกันแน่

JSON คืออะไร ???

JSON คือ JavaScript Object Notation แล้วมันคืออะไรละ จริงๆแล้วมันคือ Standard format อย่างหนึ่งที่เป็น text และสามารถอ่านออกได้ด้วยตาเปล่า ใช้ในการสร้าง object ขึ้นมาเพื่อส่งข้อมูลระหว่าง application โดย format จะมีรูปแบบเป็น คู่ Key-Value หรือเป็นแบบ Array

ประเมทของข้อมูลที่ใน JSON

  • Number: ตัวเลขเท่านั้น
  • String : Unicode ใช้เครื่องหมาย double-quote (“) เป็นตัวบ่งบอก
  • Boolean : True or False
  • Array : ชุดข้อมูล ซึ่งจะเป็นชนิดใดก็ได้ ใช้สัญลักษณ์ square bracket [var1,var2] เป็นตัวแสดง และคั้นด้วย comma แต่ะลค่าใน array
  • Object : ชุดข้อมูลที่เป็นคู่ Key-Value แบบ strings ใช้สัญลักษณ์ปีกกา {key1:value1,key2:value2} ใช้ comma เป็นตัวแบ่งแต่ละคู่ และใช้ colon เป็นตัวแบ่งระหว่าง key และ value
  • Null: ค่าว่าง

ตัวอย่างของ JSON โดยตัวอย่างมาจากข้อมูลที่มีความหมายแบบนี้

สามารถนำมาเขียนเป็น JSON ได้แบบนี้

เราจะเห็นได้ว่า ภายในของ JSON สามารถเก็บข้อมูลได้หลากหลายมากและ สามารถอ่านด้วยตาเปล่าได้ง่ายเช่นเดียวกัน ทำความเข้าใจง่าย นี้คือข้อดีของ JSON และเราจะใช้ JSON เป็น Format กลางในการส่งข้อมูลระหว่าง Node-red และ M5GO

Publish JSON จาก Node-red ผ่าน MQTT Broker

เริ่มด้วยการลาก node mqtt แบบ output และ inject มาวางบน Flow

ตั้งค่าให้ inject ส่งข้อมูลออกมาเป็น JSON ดังนี้

เข้าไปที่ payload หลังจากนั่นเลือกรูปแบบข้อมูลเป็น JSON

คลิ๊กที่ จุดสามจุดด้านหลัง แล้วใส่ข้อมูลลงไปตามนี้

ต่อไปเรามาตั้งค่า mqtt โดยการเลือก Server เป็น Server ที่เราได้สร้างไว้ บน CloudMQTT สำหรับคนที่สงสัยสามารถย้อนกลับไปอ่านบทความที่ใส่ไว้ข้างต้นก่อนได้เพื่อความเข้าใจจตรงกัน ใส่ Topic เป็น

/ESP32_1/JSON

ทุกอย่างเรียบร้อยแล้ว กด Deploy เราจะเปลี่ยนวิธีการดูผลลัพธ์ปกติ เราจะดูผลลัพธ์ผ่านหน้า Websocket UI ของ CloudMQTT ในครั้งนี้เราจะเปลี่ยนด้วยการใช้ node mqtt แบบ input เพื่อ subscribe Topic /ESP32_1/JSON แบบนี้

ตั้งค่า Topic ใน mqtt เป็น /ESP32_1/JSON ให้เรียบร้อย แล้วกด Deploy ได้เลย กด ที่ inject เพื่อทดสอบ ผลที่ได้จะแสดงที่ Tabs debug ของ Node-red แบบนี้

เป็นอันเสร็จ แค่นี้เราสามารถ Publish และ Subscribe JSON ด้วย Node-red ได้แล้ว ต่อไปเราจะยกรับขึ้นอีกขั้นด้วยการใช้ M5GO ( esp32 ) ในกับรับ JSON และเก็บลงตัวแปรต่างๆไว้ เนื่องจาก JSON เป็น schema เราสามารถออกแบบตัวแปรมารับได้เลย

ArduinoJSON Lib ที่จะช่วยให้คุณจัดการกับ JSON

ArduinoJSON เป็น Libraries ใช้ในการจัดการกับ JSON ไม่ว่าจะเป็นการอ่านหรือการสร้าง JSON เราสามารถอ่านข้อมูลแบบเต็มได้ที่

ขอแถมเครื่องมือที่สำคัญมากในการใช้งาน ArduinoJSON คือ ArduinoJSON Assistant เป็นเครื่องมือที่เราใส่ JSON ที่ต้องการลงไปจะช่วยออกแบบ code ในการอ่านและการสร้างให้เลย

ในบทเรียนต่อไปเราจะทำการ Subscribe JSON ที่ส่งมาจาก Node-red กัน สำหรับคนที่ลืมว่า MQTT ใช้กับ M5GO ยังไงก็ลองกลับไปอ่านบทความข้างต้นได้

โค้ดแบบพื้นๆให้ M5GO

จะเป็นการที่ทำให้ M5GO สามารถต่อ WiFi และ ต่อกับ MQTT Broker ได้ เมื่อเรา Upload แล้วให้ทำการทดสอบว่าสามารถ Subscribe Topic ได้หรือป่าว

Subscribe JSON จาก Node-red

เราทดลองเสร็จเรียบร้อยแล้ว มาต่อกันด้วย ให้ Node-red Publish JSON ที่ Topic

/ESP32_1/JSON 

ในส่วนของ code เราจะเพิ่มโค้ด เข้าไปเพื่อแทน Topic ที่เราจะ Subscribe

และเพื่อ Topic เพื่อ Subscribe ให้ Function mqttReconnect

เมื่อเราต้องการ Subscribe Topic ใหม่เราต้องเพื่อทุกครั้งเพื่อเป็นการบอกว่าเรามี Topic ใหม่ที่จะ Subscribe

Upload และ เปิด Serial Monitor กัน เราจะเห็นข้อความที่เราส่งไปแบบนี้

ตอนนี้ M5GO เราสามารถรับ JSON มาได้แล้วต่อไป เราจะใช้ ArduinoJSON เพื่อทำการแยก ข้อมูลใน แต่ละ key ลงตัวแปรที่เรากำหนดไว้

สร้างตัวแปรเพื่อมารับข้อมูลของแต่ละ Key คือ title, duration, status

ใน Function callback เราจะแก้ไขให้ เมื่อมี Topic ที่ ชื่อว่า /ESP32_1/JSON ให้ทำการแปลงจาก JSON มาเก็บข้อมูล ในตัวแปรที่ได้สร้างไว้

capacity : กำหนดขนาดของตัวแปรที่จะเก็บข้อมูล JSON ขนาดในบทความนี้คือ JSON_OBJECT_SIZE(3) หมายความว่ามี Key ใน JSON ทั้งหมด 3 Key

doc : ตัวแปรแบบ DynamicJsonDocument เป็นตัวแปรที่เราจะใช้เก็บข้อมูล JSON

deserializeJson :เป็น Function ที่ใช้ในการเปลี่ยนจาก JSON ที่รับมาให้อยู่ในรูปแบบ DynamicJsonDocument

doc[“<key>”] : เป็นวิธีการเรียกดูค่าใน DynamicJsonDocument โดย <key> แทนที่ด้วย key ใน JSON ที่เรากำหนดไว้

แค่นี้ M5GO ของก็จะสามารถอ่านข้อมูลจาก JSON ได้แล้วโดยไม่ต้องใช้การตัด String แบบเดิมๆเลย

Publish JSON ไป Node-red

ในส่วนนี้เราจะยังใช้ Topic เดิมในการ Publish คือ /ESP32_1/JSON เริ่มด้วยการสร้าง Function pubJSON ก่อนภายใน Function จะประกอบไปด้วย

serializeJson : เป็น Function ที่ใช้ในการเปลี่ยน DynamicJsonDocument ให้อยู่ในรูปแบบของ char Array เพื่อให้ง่ายต่อการส่งข้อมูลและการนำไปใช้ต่อไป

เป็นการส่ง JSON รูปแบบนี้

เราเปิด หน้า debug ใน Node-red เราจะเห็นว่ามี JSON ขึ้นมาเป็นจำนวนมาก

เรียบร้อยแล้วครับ เราสามารถส่ง JSON ไปยัง Node-red ผ่าน MQTT ได้แล้ว

--

--