โครงงานประยุกต์ใช้งานอุปกรณ์ iot

Our data analytics software, Aimagin Analytics, has been especially designed to enable anyone to easily accomplish all tasks in a practical data analytic pipeline from scheduling database connection, performing ETL and data cleaning, creating dynamic online forms for data gathering, analysing data using built-in functions and Python, producing customizable visualizations, dashboards and printed reports. We offer both software tools and data analytics services.

In this project, we develop a music mood classification model to classify the mood of the music into 6 categories: Anxious, Chill, Focus, Party, Sad, and Romance. The music is preprocessed in order to use as the music database for generating exercise music tracks based on the user's requirements. To keep it easy and simple, we also develop "Melodistic" which is a mobile application for streaming exercise music tracks and generating new tracks based on mood. It also allows the user to include their own favorite music.

MQTT ย่อมาจาก Message Queue Telemetry Transport เป็นโปรโตคอลประยุกต์ที่ใช้โปรโตคอล TCP เป็นรากฐาน ออกแบบมาสำหรับงานที่ต้องการ ๆ สื่อสารแบบเรียลไทม์แบบไม่จำกัดแพลตฟอร์ม หมายถึงอุปกรณ์ทุกชิ้นสามารถสื่อสารกันได้ผ่าน MQTT

MQTT จะแบ่งเป็น 2 ฝั่ง คือฝั่งเซิร์ฟเวอร์มักจะเรียกว่า MQTT Broker ส่วนฝั่งผู้ใช้งานจะเรียกว่า MQTT Client ในการใช้งานด้าน IoT จะเกี่ยวข้องกับ MQTT Client เป็นหลัก โดยจะมี MQTT Broker ทั้งแบบฟรี และเสียเงินไว้รองรับอยู่แล้ว ทำให้การสื่อสารข้อมูลผ่าน MQTT จะใช้เซิร์ฟเวอร์ฟรี หรือ MQTT Broker ฟรี เหล่านั้นเป็นตัวกลาง

ลักษณะการใช้งาน MQTT อาจะเปรียบเสมือนได้กับการใช้งานห้องแชท Line สำหรับอุปกรณ์ โดยอุปกรณ์แต่ละตัวจะมีชื่อเป็นของตนเอง มี Username Password เป็นของตัวเอง และอาจจะมีห้องลับเฉพาะของตนเอง ดังนั้นการใช้งาน MQTT ผู้เขียนจึงจะขอยกตัวอย่างของ MQTT เทียบกับห้องแชทได้ดังนี้

กลุ่มผู้ใช้ (User)

ใน MQTT จะแบ่งกลุ่มของผู้ใช้งานออกเป็น 2 ระดับ คือ

  • ระดับสูงสุด – สามารถที่จะรับ-ส่งข้อมูลกับอุปกรณ์ หรือช่องทางใด ๆ ก็ได้ในระบบ หรือเปรียบได้กับแอดมินที่สามารถเข้าไปดูข้อความได้ทุดห้องแม้จะเป็นห้องลับก็ตาม
  • ระดับทั่วไป – สามารถรับ-ส่งข้อมูลกับอุปกรณ์หรือช่องทางที่กำหนดไว้เฉพาะเท่านั้น เปรียบได้กับผู้ใช้งาน Line ที่สามารถแชทในห้องที่ตัวเองสร้างได้ หรือเป็นสมาชิกในห้อง แต่ไม่สามารถเข้าไปแชทในห้องที่ไม่ได้เป็นสมาชิก

ในการใช้งานจริง ในอุปกรณ์ต่าง ๆ ควรจะใช้งานในระดับทั่วไป เพื่อความปลอดภัยกรณีอุปกรณ์เหล่านั้นถูกแฮกแล้วไม่สร้างความเสียหายไปยังอุปกรณ์อื่น ๆ ที่อยู่ในช่องทางเฉพาะของแต่ละอุปกรณ์

เส้นทาง (Topic)

เส้นทาง เปรียบเหมือนกับหัวข้อ หรือห้องแชทที่ต้องการจะคุย และการคุยกันจะมีเฉพาะอุปกรณ์ที่อยู่ในห้องนั้น ๆ (Subscribe) ถึงจะสามารถได้รับข้อมูลที่มีการส่งไปในห้องนั้น ๆ ที่ถูกเรียกว่าเส้นทางเนื่องจากการใช้งานส่งข้อมูลและรับข้อมูลจะเหมือนกับเส้นทางในระบบไฟล์ เช่น /Room1/LED ซึ่งระบบเส้นทางนี้นอกจากอุปกรณ์จะสามารถรอการสนทนาในห้องตามเส้นทาง /Room1/LED ได้แล้ว ยังสามารถรอสนทนาเส้นทาง /Room1 ได้ด้วย หากเป็นการรอฟังในเส้นทาง (Subscribe) /Room1 จะหมายถึงการส่งข้อมูลใด ๆ ที่นำหน้าด้วย /Room1 เช่น /Room1/LED , /Room1/Value ผู้ที่รอฟัง (Subscribe) /Room1 อยู่จะได้รับข้อมูลเหล่านั้นด้วย

คุณภาพข้อมูล (QoS)

แบ่งออกเป็น 3 ระดับดังนี้

  • QoS0 – ส่งข้อมูลเพียงครั้งเดียว ไม่สนใจว่าผู้รับจะได้รับหรือไม่
  • QoS1 – ส่งข้อมูลเพียงครั้งเดียว ไม่สนใจว่าผู้รับจะได้รับหรือไม่ แต่ให้จำค่าที่ส่งล่าสุดไว้ เมื่อมีการเชื่อมต่อใหม่จะได้รับข้อมูลครั้งล่าสุดอีกครั้ง
  • QoS2 – ส่งข้อมูลหลาย ๆ ครั้งจนกว่าปลายทางจะได้รับข้อมูล มีข้อเสียที่สามารถทำงานได้ช้ากว่า QoS0 และ QoS1

การส่งข้อมูล (Publish)

การส่งข้อมลในแต่ละครั้งจะต้องประกอบไปด้วยเส้นทาง (Topic) ข้อมูล และคุณภาพข้อมูล ซึ่งการส่งข้อมูลจะเรียกว่า Publish

การรับข้อมูล (Subscribe)

การรับข้อมูลในระบบ MQTT จะรับข้อมูลได้เฉพาะเมื่อมีการเรียกใช้การ Subscribe ไปยัง Topic ที่กำหนด อาจเปรียบได้กับการ Subscribe คือการเข้าไปนั่งรอเพื่อนในกลุ่ม Line ส่งแชทมาหา เมื่อมีการส่งข้อมูลเข้ามาจะเกิดสิ่งที่เรียกว่าเหตุการณ์ (Event) ให้เรากดเข้าไปดูข้อความที่เพื่อน ๆ ส่งเข้ามา

จะเห็นได้ว่า MQTT ก็เปลี่ยนเสมือนห้องแชทของอุปกรณ์ที่จะสนทนาแลกเปลี่ยนข้อมูลกันแบบเรียลไทม์ผ่านเครือข่ายอินเตอร์เน็ต

การใช้งาน MQTT ฟรีจาก CloudMQTT

การสมัครสมาชิก

เข้าไปที่หน้าเว็บไซต์ https://www.cloudmqtt.com/ จากนั้นกดที่ Control Panel

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

หากสมัครสมาชิกไว้แล้ว สามารถข้ามขั้นตอนไปในส่วนของการใช้งาน CloudMQTT ได้เลย หากยังไม่ได้สมัครสมาชิกให้กรอกอีเมล์ลงในช่อง E-mail ตรงส่วน Sign up แล้วกดปุ่ม Sign up

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

จากนั้นจะพบข้อความแจ้งผล

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

ให้เข้าไปเช็คอีเมล์ จากนั้นคลิกลิ้งที่ส่งมาในอีเมล์

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

กรอกข้อมูลลงในฟอร์มสมัครสมาชิกให้ครบ จากนั้นกดปุ่ม Submit

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

จากนั้นระบบจะพามาหน้าจัดการ เป็นการจบการสมัครสมาชิก

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

การสร้าง Broker

กดไปที่ปุ่ม Create เพื่อสร้าง Broker ใหม่

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

ที่ช่อง Name ให้ตั้งชื่อ Broker ใหม่ เลือก Plan เป็น Cute Cat จากนั้นกดปุ่ม Create

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

หน้าเว็บจะกลับมาที่หน้าจัดการ และมีรายการ Broker ที่สร้างขึ้นมาใหม่ กดไปที่ปุ่ม Details

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

จากนั้นจะพบข้อมูลต่าง ๆ ของ Broker ซึ่งบางส่วนจะต้องนำไปใช้ในโค้ดที่จะได้ทดลองกันต่อไป สามารถอธิบายแต่ละส่วนได้ดังนี้

  • Server – ชื่อโดเมน หรือโฮสของ Broker
  • User – ชื่อผู้ใช้ในระดับสูงสุด ควรเก็บข้อมูลส่วนนี้ไว้เป็นความลับ และใช้เฉพาะการดีบัคโปรแกรมเท่านั้น
  • Password – รหัสผ่านของผู้ใช้ในระดับสูงสุด
  • Port – พอร์ตของ Broker
  • SSL Port – กรณีแพลตฟอร์มที่ใช้งานรองรับ SSL ควรใช้พอร์ตนี้ในการเชื่อมต่อ
  • Websockets Port – พอร์ตที่ใช้บนแพลตฟอร์ตเว็บไซต์
  • Connection limit – จำนวนการเชื่อมต่อพร้อมกันสูงสุด หากต้องการเพิ่ม จะต้องชำระเงินเพื่อซื้อแพลนอื่น ๆ

ซึ่งข้อมูลในส่วนนี้จะแตกต่างกันไปตามแต่ละ Broker ที่สร้างขึ้นมา

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

การจัดการผู้ใช้และสิทธิ์

ในหน้าของ CloudMQTT Console ที่ใช้จัดการ Broker  ให้เลื่อนมาที่หัวข้อ Manage Users จะมีช่องอยู่ 2 ช่อง สำหรับกรอก Username และ Password เพื่อสร้างผู้ใช้ใหม่ เมื่อใส่ข้อมูลเรียบร้อยให้กดปุ่ม Save

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

รายชื่อผู้ใช้ใหม่จะปรากฏขึ้นมา หากต้องการลบผู้ใช้ใดสามารถกดปุ่ม Delete ที่ผู้ใช้นั้น ๆ ได้เลย

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

ต่อมาให้เลื่อนมาที่หัวข้อ ACLs เพื่อเริ่มจำกัดสิทธิ์ และให้สิทธิ์ของผู้ใช้ โดยรายละเอียดการกรอกข้อมูลแต่ละช่องในหัวข้อย่อย New Rule มีดังนี้

  • User – เลือก User ที่ต้องการจัดการสิทธิ์
  • Topic – เลือกเส้นทางที่ต้องการจัดการสิทธิ์ รองรับการกรอกแบบ Wildcard เช่น หากกรอกแบบ /LED/# จะหมายถึงการจัดการสิทธ์ของเส้นทางที่นำหน้าด้วย /LED/ และหากกรอกแบบ /LED/+ จะหมายถึงจัดการสิทธิ์แบบ 1 ระดับ หมายถึง /LED/1 หรือ /LED/2 หรือ /LED/FFF จะเข้าการจัดการสิทธิ์นี้ แต่หากเป็น /LED/2/ON จะไม่ถูกนับเป็นการจัดการสิทธิ์ของเส้นทาง /LED/+
  • Read Access? – กำหนดว่าเส้นทางที่กรอกไว้ในช่อง Topic ผู้ใช้นี้มีสิทธิ์เข้าไปอ่าน หรือรับรู้ได้หรือไม่
  • Read Access? – กำหนดว่าเส้นทางที่กรอกไว้ในช่อง Topic ผู้ใช้นี้มีสิทธิ์เข้าไปเขียน หรือส่งข้อมูลได้หรือไม่

เมื่อกำหนดสิทธิ์เรียบร้อยแล้ว ให้กดปุ่ม Save ได้เลย

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

หลังจากกดปุ่ม Save จะแสดงผลการจัดการสิทธิ์ดังรูป หากต้องการยกเลิกการจัดการสิทธิ์สามารถกดปุ่ม Delete เพื่อลบได้

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

การเรียกดูข้อมูลเข้าออกแบบเรียลไทม์

ที่ส่วนด้านบนสุด ให้คลิกที่ปุ่ม Websocket UI

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

ข้อมูลที่มีการรับส่งกันผ่าน MQTT ทั้งหมดจะแสดงผลในหัวข้อ Received messages โดยใช้สิทธิ์ของผู้ใช้ระดับสูงสุด ในส่วนหัวข้อ Send message สามารถกำหนดเส้นทาง และข้อมูลที่ต้องการส่งได้ โดยคลิกปุ่ม Send เพื่อส่ง

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

ฟังก์ชั่นที่เกี่ยวข้องกับการใช้งาน MQTT

การใช้งาน MQTT บน ESP32 จะใช้งานผ่านไลบารี่ PubSubClient.h จะต้องติดตั้งเพิ่มเติมโดยใช้ Library Manager ค้นหาคำว่า PubSubClient แล้วสามารถกดปุ่ม Install เพื่อติดตั้งได้เลย

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

การในการเชื่อมต่อกับ MQTT จะต้องมีการเรียกใช้ไลบารี่ PubSubClient.h ด้วยเสมอ โดยจะต้องเพิ่มคำสั่ง #includeไว้ด้านบนของไฟล์โปรแกรมเสมอ

ในการสร้างออปเจคเพื่อใช้งานคลาสของไลบารี่ PubSubClient สามารถทำได้โดยมีรูปแบบดังนี้

      PubSubClient::PubSubClient(Client &client);

ฟังก์ชั่นย่อยที่มีให้ใช้งาน จะแบ่งตามเคสได้ดังนี้

เชื่อมต่อกับ Broker – ใช้ฟังก์ชั่นย่อย .setServer() เพื่อตั้งค่า Broker ที่ต้องการเชื่อมต่อ มีรูปแบบการใช้งานดังนี้

      void PubSubClient::setServer(const char * domain, uint16_t port);

มีค่าพารามิเตอร์ดังนี้

  • (const char *) domain – ชื่อโดเมน หรือชื่อโฮสของ Broker ที่ต้องการเชื่อมต่อ
  • uint16_t port – พอร์ตของ Broker (ไม่ใช่พอร์ต SSL)

และไม่มีค่าที่ส่งกลับ

นอกจากนี้การเชื่อมต่อกับ Broker จะใช้ฟังก์ชั่นย่อย .connect() ซึ่งมีรูปแบบดังนี้

      bool PubSubClient::connect(const char *id, const char *user, const char *pass);

มีรายละเอียดของค่าพารามิเตอร์ดังนี้

  • (const char*) id – กำหนดชื่อที่ไม่ซ้ำกับผู้อื่นที่ใช้ Broker เดียวกัน เปรียบได้กับการตั้งชื่อใน Line ที่ไม่ซ้ำกับผู้อื่น
  • (const char*) user – ชื่อผู้ใช้ที่ใช้เข้าสู่ระบบ ไม่ควรใช้ Username ของผู้ใช้ระดับสูงสุด ควรใช้ Username ที่สร้างใหม่และกำหนดสิทธิ์แล้ว
  • (const char*) pass – รหัสผ่านที่ใช้เข้าสู่ระบบ

และตอบกลับมาเป็นผลการเชื่อมต่อ หากเชื่อมต่อสำเร็จจะให้ค่าเป็น True

การตรวจสอบสถานะการเชื่อมต่อจะใช้ฟังก์ชั่นย่อย .connected() ในการตรวจสอบ ซึ่งมีรูปแบบการใช้งานดังนี้

      bool PubSubClient::connected();

ไม่มีค่าพารามิเตอร์ และตอบกลับมาเป็นผลการเชื่อมต่อ หากกำลังเชื่อมต่ออยู่ให้ค่าเป็น True

การรับข้อมูล (Subscribe) – การรับข้อมูลเข้าจะทำงานด้วยเหตุการณ์ โดยจะมีการสร้างฟังก์ชั่นไว้ 1 ตัวเพื่อรอการเรียก เมื่อมีการส่งข้อมูลมาจะเข้าไปเรียกฟังก์ชั่นนั้นขึ้นมาใช้ ฟังก์ชั่นย่อยที่ใช้กำหนดชื่อฟังก์ชั่นที่จะถูกเรียกเมื่อเกิดเหตุการณ์ขึ้นคือฟังก์ชั่นย่อย .setCallback() ซึ่งมีรูปแบบการใช้งานดังนี้

      void PubSubClient::setCallback(void (*callback)(char*, uint8_t*, unsigned int));

มีค่าพารามิเตอร์ 1 ตัว คือ

  • (void *) callback – ฟังก์ชั่นที่จะถูกเรียกเมื่อเกิดเหตุการณ์ขึ้น

และไม่มีค่าตอบกลับ

ฟังก์ชั่นที่ใช้รับข้อมูล (Subscribe) จากเส้นทางที่สนใจ จะใช้ฟังก์ชั่นย่อย .subscribe() มีรูปแบบการใช้งานดังนี้

      void PubSubClient::subscribe(const char *topic);

มีค่าพารามิเตอร์ 1 ตัว คือ

  • (const char*) topic – เส้นทางที่ต้องการรับข้อมูล

และไม่มีการตอบกลับ การใช้งานฟังก์ชั่นย่อย .subscribe() มักจะเรียกใช้เมื่อมีการเชื่อมต่อกับ Broker สำเร็จแล้วเท่านั้น

การส่งข้อมูล (Publish) – ใช้ฟังก์ชั่นย่อยที่ชื่อว่า .publish() มีรูปแบบการใช้งานดังนี้

      bool PubSubClient::publish(const char *topic, const char *payload);

มีรายละเอียดของค่าพารามิเตอร์ดังนี้

  • (const char*) topic – เส้นทางที่ต้องการส่งข้อมูล
  • (const char*) payload – ข้อมูลที่ต้องการส่ง

และมีการตอบกลับเป็นข้อมูลชนิด bool ถ้าส่งข้อมูลสำเร็จจะได้ค่า True

ทดลองใช้งาน MQTT ควบคุมหลอด LED ผ่านอินเตอร์เน็ต

ก่อนอื่นให้ต่อวงจรเพิ่มเติม เนื่องจากหลอด LED ที่อยู่บนบอร์ด NodeMCU-32S ถูกใช้ไปกับการบอกสถานะการเชื่อมต่อ WiFi ดังนั้นจึงต้องต่อหลอด LED เพิ่มเพื่อใช้ในการทดลอง ซึ่งสามารถต่อวงจรได้ดังนี้

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

จากนั้น เข้าไปคัดลอกโค้ดที่ใช้ทดลองที่ลิ้ง https://goo.gl/sLpxxb แก้ไขส่วนของ WIFI_STA_NAME และ WIFI_STA_PASS ให้ถูกต้อง แก้ไขส่วนที่เกี่ยวข้องกับการเชื่อมต่อ MQTT ทั้งหมด ดังนี้

  • MQTT_SERVER – แก้ไขเป็นค่า Server ในหน้า CloudMQTT Console
  • MQTT_PORT – แก้ไขเป็นค่า Port ในหน้า CloudMQTT Console
  • MQTT_USERNAME – แก้ไขเป็น Username ที่สร้าง และมีสิทธิ์เข้าถึง /ESP32_1/LED (อ่านเพิ่มที่หัวข้อ การจัดการผู้ใช้และสิทธิ์)
  • MQTT_PASSWORD – แก้ไขเป็น Password ที่สร้างไว้
  • MQTT_NAME – แก้ไขเป็นอะไรก็ได้ หรือไม่แก้ไขก็ได้ ค่านี้จะนำไปใช้อ้างอิงเป็นชื่อใน Broker

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

หลังจากแก้ไขทุกส่วนเรียบร้อยแล้ว สามารถอัพโหลดโปรแกรมลงบอร์ด NodeMCU-32S ได้เลย เปิด Serial Monitor ขึ้นมา ปรับไปที่ 115200 แล้วรอจนกว่าจะสามารถเชื่อมต่อกับ MQTT ได้

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

ไปที่หน้า Websocket UI ตรงส่วนของ Topic ให้ใส่เป็น /ESP31_1/LED แล้วใส่ Message แล้วกด Send ผลที่ได้คือหลอด LED ที่ได้ต่อไว้เพิ่มติดสว่าง และในหน้า Serial Monitor ก็แสดงผลข้อมูลที่ได้รับออกมา

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

เมื่อทำตามขั้นตอนเดิมแต่เปลี่ยนข้อความเป็น OFF ผลคือหลอด LED ที่ต่อไว้ดับลง หมายความว่าเราสามารถควบคุมหลอด LED ผ่านอินเตอร์เน็ตได้แล้ว

สำหรับโค้ดที่ใช้ในการทดลองมีดังนี้

เนื่องจากโค้ดในส่วนของการเชื่อมต่อ WiFi มีเป็นจำนวนมาก และมีการอธิบายในหลาย ๆ ตัวอย่างแล้ว ดังนั้นในครั้งนี้จึงจะอธิบายเฉพาะส่วนของการเชื่อมต่อ MQTT เท่านั้น

บรรทัดที่ 2 เรียกใช้ไลบารี่ PubSubClient.h โดยใช้คำสั่ง #includeเพื่อเตรียมเชื่อมต่อกับ MQTT Broker

บรรทัดที่ 7 กำหนดให้ MQTT_SERVER แทนที่ด้วย “m11.cloudmqtt.com” ใช้กำหนดชื่อโดเมน หรือโฮสของ Broker

บรรทัดที่ 8 กำหนดให้ MQTT_PORT แทนที่ด้วย 10384 ใช้กำหนดพอร์ตของ Broker

บรรทัดที่ 9 กำหนดให้ MQTT_USERNAME แทนที่ด้วย esp32_1

บรรทัดที่ 10 กำหนดให้ MQTT_PASSWORD แทนที่ด้วย 123456

บรรทัดที่ 15 เรียกใช้ WiFiClient เพื่อเตรียมใช้การเชื่อมต่อแบบ TCP

บรรทัดที่ 16 ส่งออปเจคของ WiFiClient ไปให้ไลบารี่ PubSubClient ใช้งานและตั้งชื่อออปเจคเป็น mqtt

บรรทัดที่ 18 สร้างฟังก์ชั่นย่อยชื่อ callback()

บรรทัดที่ 19 – 20 แปลงค่าตัวแปร topic และ payload ให้เป็นข้อมูลในรูปแบบ String แล้วนำไปเก็บใน topic_str และ payload_str ตามลำดับ

บรรทัดที่ 21 แสดงผลข้อความไปที่ Serial Monitor

บรรทัดที่ 23 ใช้ Ternary Operators เปรียบเทียบตัวแปร payload_str ว่าเป็น ON หรือไม่ ถ้าใช่ จะส่งค่า HIGH กลับไป และถ้าไม่ใช่ จะส่งค่า LOW กลับไป ค่าที่ส่งกลับไปถูกนำไปใช้เขียนข้อมูลออกขา GPIO แบบดิจิตอลด้วยฟังก์ชั่น digitalWrite()

บรรทัดที่ 24 จบคำสั่งในฟังก์ชั่นย่อย callback()

บรรทัดที่ 51 ใช้ฟังก์ชั่นย่อย .setServer() กำหนดค่าเตรียมเชื่อมต่อไปยัง MQTT Broker โดยกำหนดชื่อเมนหรือโฮสตาม MQTT_SERVER และกำหนดพอร์ตตาม MQTT_PORT

บรรทัดที่ 52 ใช้ฟังก์ชั่นย่อย .setCallback() กำหนดฟังก์ชั่นที่จะเรียกใช้เมื่อมีเหตุการณ์เกิดขึ้น โดยกำหนดให้ไปเรียกฟังก์ชั่น callback

บรรทัดที่ 56 ใช้ฟังก์ชั่นย่อย .connected() ตรวจสอบการเชื่อมต่อกับ MQTT Broker แล้วนำค่าไปเทียบในคำสั่ง if หากมีค่าเป็น False หรือไม่มีการเชื่อมต่ออยู่ จะทำคำสั่งในปีกกา

บรรทัดที่ 57 แสดงผลไปที่ Serial Monitor

บรรทัดที่ 58 ใช้ฟังก์ชั่นย่อย .connect() เชื่อมต่อไปยัง Broker โดยใช้ค่า Username และ Password ตาม MQTT_USERNAME และ MQTT_PASSWORD แล้วนำผลการเชื่อมต่อไปเช็คในคำสั่ง if หากเป็นจริง หรือสามารถเชื่อมต่อได้สำเร็จจะทำในปีกกาของ if

บรรทัดที่ 59 แสดงผลไปที่ Serial Monitor

บรรทัดที่ 60 ใช้ฟังก์ชั่น .subscribe() กำหนดให้รับข้อมูลที่เส้นทาง /ESP32_1/LED

บรรทัดที่ 61 จบคำสั่งใน if และเริ่ม else เมื่อผลการเปรียบเทียบใน if เป็นเท็จ หรือเชื่อมต่อไม่ได้ จะเข้ามาทำคำสั่งในปีกกา else

บรรทัดที่ 62 แสดงผลไปที่ Serial Monitor

บรรทัดที่ 63 หน่วงเวลา 5000 มิลลิวินาที หรือ 5 วินาที

บรรทัดที่ 64 จบคำสั่งในปีกกา else

บรรทัดที่ 65 จบคำสั่งในปีกกา if ที่ตรวจสอบการเชื่อมต่อกับ Broker หากการเปรียบเทียบใน if เป็นเท็จ หรือมีการเชื่อมต่ออยู่ จะมาทำปีกกา else

บรรทัดที่ 66 เรียกฟังก์ชั่นย่อย .loop() เพื่อให้ไลบารี่ PubSubClient สามารถทำงานต่อไปได้

ทดลองสร้าง MQTT Dashboard ด้วยแอพพลิเคชั่น MQTT Dash

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

จากตัวอย่างที่แล้วเราได้ทดลองควบคุมหลอด LED ผ่าน MQTT โดยใช้หน้า Websocket UI กันไปแล้ว ในการทดลองครั้งนี้จะเป็นการใช้แอพพลิเคชั่น MQTT Dash เป็นตัวกลางระหว่างผู้ใช้กับระบบเบื้องหลังทั้งหมด ก่อนอื่นให้ติดตั้งแอพพลิเคชั่น MQTT Dash ก่อน โดยค้นหาคำว่า “MQTT Dash” แล้วกดติดตั้งได้เลย

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

เมื่อเปิดแอพพลิชั่น MQTT Dash ขึ้นมาแล้ว จะต้องสร้างการเชื่อมต่อกับ Broker ชึ้นมาใหม่ โดยกดไปที่ไอค่อนรูป + ที่ด้านมุมขวาบน

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

กรอกข้อมูลแต่ละช่องตามลำดับต่อไปนี้

  • Name – ให้ตั้งชื่อของ Broker โดยชื่อที่ตั้งนี้จะแสดงผลในหน้าหลักของแอพ
  • Address – ให้กรอกชื่อโดเมน หรือโฮสของ Broker โดยใช้ค่าใน CloudMQTT Console
  • Port – แนะนำให้ใช้ค่าของ SSL Port
  • Enable connection encryption – ติ้กเลือกกรณีใช้ค่าใน SSL Port
  • User name – กรอกเป็นผู้ใช้ที่สร้างใหม่ และกำหนดสิทธิ์แล้ว
  • User password – กรอกรหัสผ่านของผู้ใช้ที่สร้างใหม่

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

จากนั้นกดไอค่อนรูปแผ่นดิสท์ที่ด้านมุมบนขวาเพื่อบันทึก

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

แอพพลิเคชั่นจะเด้งกลับมาที่หน้าหลัก แล้วกดเข้าไปที่ชื่อของ Broker ที่ตั้งไว้

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

จากนั้นรอเชื่อมต่อซักครู่ เมื่อเสร็จแล้วจะแสดงหน้า Dashboard เปล่า ๆ ขึ้นมา ให้กดไปที่ไอค่อนรูป + ด้านบนมุมขวา เพื่อสร้างวัตถุใหม่เพื่อติดต่อกับผู้ใช้

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

จากนั้นจะเลือกชนิดของวัตถุที่ต้องการเพิ่ม กรณีควบคุมอุปกรณ์ที่มีเพียง 2 สถานะ คือเปิด และปิด ควรเลือกใช้เพิ่มวัตถุแบบ Switch

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

จากนั้นจะปรากฏช่องสำหรับกรอกข้อมูลต่าง ๆ ให้เลือกกรอกดังนี้

  • Name – ตั้งชื่อของวัตถุ
  • Topic – กำหนดเส้นทางที่ต้องการรับ – ส่งข้อมูล เนื่องจากในโค้ดได้กำหนดให้สนใจข้อมูลในเส้นทาง /ESP32_1/LED ดังนั้นในช่องนี้จึงกรอกเป็น /ESP32_1/LED
  • On – ข้อมูลที่จะส่งเมื่อมีสถานะเปิด เนื่องจากเราได้กำหนดในโค้ดไว้ในตัวอย่างที่แล้วว่าหากข้อมูลเป็น ON หลอด LED จึงจะติด ดังนั้นในช่องนี้จึงกรอก ON
  • Off – กรอกเป็น OFF

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

นอกจากนี้ไอค่อนใน On และ Off สามารถกำหนดได้ โดยกดที่รูปไอค่อนแล้วเลือกเปลี่ยนได้เลย

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

จากนั้นกดที่ไอค่อนรูปแผ่นดิสท์เพื่อบันทึกข้อมูล

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

แอพพลิเคชั่นจะนำกลับมาที่หน้า Dashboard จะพบว่ามีวัตถุที่สร้างขึ้นมาแล้ว สามารถทดลองกดเพื่อส่งข้อมูลได้เลย

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

หลังจากกดแล้ว จะพบว่าหลอด LED ที่ NodeMCU-32S สามารถควบคุมได้ตามที่ต้องการได้แล้ว เมื่อเข้าไปดูที่หน้า Websocket UI จะพบข้อมูลทั้งหมดที่วิ่งจากแอพ ฯ ผ่าน MQTT Broker ไปยัง ESP32

โครงงานประยุกต์ใช้งานอุปกรณ์ iot

สรุปท้ายบท

ในบทนี้เป็นเรื่องเกี่ยวกับการใช้งาน MQTT Broker เป็นตัวกลางในการสื่อสารระหว่างอุปกรณ์ต่าง ๆ ผ่านระบบอินเตอร์เน็ต การใช้งาน MQTT สามารถเลือกใช้บริการได้ทั้งแบบเสียเงิน และแบบฟรี ในการทดลองในบทนี้จะทดลองเกี่ยวกับ LED โดยมีการเปิด – ปิด หลอด LED ได้ผ่านอินเตอร์เน็ตโดยควบคุมผ่านแอพพลิเคชั่นสำเร็จรูปบนโทรศัพท์มือถือ เพื่อเตรียมต่อยอดใช้ MQTT เป็นส่วนประกอบของโครงงานอื่น ๆ ต่อไป ในบทต่อไปจะเป็นเรื่องของ มัลติทาสกิ้ง ซึ่งจะช่วยให้สามารถทำโครงงานได้สะดวกมากขึ้น