การใช้งาน IOXESP32 Ethernet shield กับ ArduinoIDE

เขียนโปรแกรมสั่งงานโมดูล IOXESP32 Ethernet shield ด้วย ArduinoIDE

การเขียนโปรแกรมสั่งงาน IOXESP32 Ethernet shield ให้ใช้ไลบรารี่ Ethernet ในการเริ่มเชื่อมต่ออินเตอร์เน็ตผ่านสายแลน จากนั้นหากต้องการเชื่อมต่อ HTTP ให้ใช้ไลบรารี่ ArduinoHttpClient, หากต้องการเชื่อมต่อ MQTT ให้ใช้ไลบรารี่ PubSubClient

เริ่มต้นทดสอบเชื่อมต่ออินเตอร์เน็ตผ่ายสายแลน

ให้ติดตั้งไลบรารี่ Ethernet ตามขั้นตอนดังนี้

ที่โปรแกรม Arduino IDE ให้เปิด Libraby Manager ขึ้นมา (1) ค้นหา Ethernet (2) แล้วกดปุ่ม INSTALL (3)

รอจนกว่าจะติดตั้งเสร็จ เมื่อติดตั้งเสร็จจะมีข้อความ installed ขึ้น (ดังรูป)

คัดลอกโค้ดโปรแกรมต่อไปนี้ไปใส่ในโปรแกรม Arduino IDE

circle-info

กรณีเลือกขา CS เป็นขาอื่นที่ไม่ใช้ขา 15 ต้องแก้เลข 15 ในคำสั่ง Ethernet.init(); ให้เป็นเลขขา CS ที่เลือกไว้ด้วย

เลือกบอร์ด เลือกพอร์ต แล้วอัพโหลดโปรแกรมลงบอร์ด

เมื่ออัพโหลดโปรแกรมลงบอร์ดแล้ว ให้เปิด Serial Monitor ขึ้นมา ปรับเป็น 115200 แล้วกดปุ่ม Reset บนบอร์ด IOXESP32 1 ครั้ง หากสายแลนมีการเชื่อมต่ออยู่ และขอ IP จาก DHCP ได้ จะมีข้อความ ON ขึ้น (ดังรูป)

ทดสอบถอดสายแลนออก ผลที่ได้จะขึ้น OFF (ดังรูป)

การดึงค่าเวลาจากอินเตอร์เน็ต (NTP)

ใช้โค้ดโปรแกรมต่อไปนี้ในการทดสอบ

อัพโหลดโปรแกรมลงบอร์ด แล้วเปิด Serial Monitor ขึ้นมา ผลที่ได้ค่าเวลา UTC จะขึ้นมาแล้ว

ทดสอบเปิดเว็บไซต์เทียบเวลา https://www.epochconverter.com/arrow-up-right จะพบว่าค่าเวลา Unix time ตรงกัน

circle-info

หากต้องการให้แสดงเวลาประเทศไทย ต้องนำตัวแปร epoch มา +7 ชั่วโมง (7 * 60 * 60) จึงจะแสดงเวลาประเทศไทย

การดึงข้อมูลผ่าน HTTP

HTTP คืออะไร ? (ตอบโดย ChatGPT)

HTTP (Hypertext Transfer Protocol) คือโปรโตคอลที่ใช้สำหรับการสื่อสารระหว่างเว็บเบราว์เซอร์และเซิร์ฟเวอร์ในระบบเวิลด์ไวด์เว็บ (WWW) โดยทำหน้าที่กำหนดรูปแบบและวิธีการส่งข้อมูลระหว่างลูกค้า (Client) และเซิร์ฟเวอร์ (Server)

ตัวอย่างบทความนี้จะเขียนโค้ดดึงข้อมูลหน้าเว็บ Google มาแสดงใน Serial Monitor

ติดตั้งไลบรารี่ ArduinoHttpClient ตามขั้นตอน จากนั้นใช้โค้ดโปรแกรมต่อไปนี้ในการทดสอบ

ผลที่ได้ ข้อมูลจาก google.com แสดงขึ้นมาบน Serial Monitor แล้ว

การดึงข้อมูลผ่าน HTTPS

ปัจจุบันเว็บไซต์ส่วนใหญ่ใช้ HTTPS และยกเลิกใช้ HTTP แล้ว เนื่องจาก HTTPS มีความปลอดภัยในการรับ-ส่งข้อมูลมากกว่า มีการเข้ารหัสข้อมูลตั้งแต่ต้นทางไปปลายทาง อุปกรณ์ที่คั่นระหว่างกลาง เช่น เร้าเตอร์ หรือ ISP ไม่สามารถดักจับข้อมูลแล้วรู้ได้ว่าข้อมูลที่รับ-ส่งกันอยู่คืออะไร

API คืออะไร? (ตอบโดย ChatGPT)

API (Application Programming Interface) คือชุดของกฎ ระเบียบ และเครื่องมือที่ใช้ในการสร้างและบูรณาการซอฟต์แวร์แอปพลิเคชัน โดย API ทำหน้าที่เป็นตัวกลางในการสื่อสารระหว่างซอฟต์แวร์ต่าง ๆ ทำให้โปรแกรมหนึ่งสามารถขอข้อมูลหรือบริการจากโปรแกรมอื่นได้ โดยไม่ต้องรู้รายละเอียดของการทำงานภายในของโปรแกรมเหล่านั้น

API ที่เว็บไซต์ต่าง ๆ เปิดให้ดึงข้อมูล ล้วนใช้ HTTPS กันเป็นส่วนใหญ่แล้ว หากต้องการใช้ IOXESP32 + Ethernet shield ดึงข้อมูลผ่าน HTTPS จำเป็นต้องติดตั้งไลบรารี่จัดการการเข้ารหัส SSL/TLS เพิ่มเติม โดยบทความนี้เลือกใช้ไลบรารี่ ESP_SSLClient เป็นตัวกลางระหว่าง Ethernet <--> ArduinoHttpClient ได้เส้นทางใหม่เป็น Ethernet <--> ESP_SSLClient <--> ArduinoHttpClient

ติดตั้งไลบรารี่ ESP_SSLClient จากนั้นใช้โค้ดโปรแกรมต่อไปนี้ในการทดสอบ (ดึงราคาทองคำผ่าน API : https://api.chnwt.dev/thai-gold-api/latestarrow-up-right)

ผลที่ได้ ราคาทองคำวันนี้ที่ดึงมาจาก API จะแสดงขึ้นมาบน Serial Monitor แล้ว

การรับ-ส่งข้อมูลผ่าน MQTT

MQTT คืออะไร? (ตอบโดย ChatGPT)

MQTT (Message Queuing Telemetry Transport) คือโปรโตคอลการสื่อสารที่มีน้ำหนักเบาและมีประสิทธิภาพสูง ออกแบบมาเพื่อการส่งข้อมูลระหว่างอุปกรณ์ที่มีการเชื่อมต่อผ่านเครือข่ายที่มีความเสถียรต่ำหรือแบนด์วิดท์จำกัด MQTT ถูกพัฒนาโดย IBM และปัจจุบันเป็นมาตรฐานเปิดที่ได้รับการดูแลโดย OASIS (Organization for the Advancement of Structured Information Standards)

MQTT แบ่งเป็น 2 ฝั่ง คือ Device และ Broker (Server) การใช้งาน MQTT จำเป็นจะต้องมีทั้ง 2 ฝั่งนี้ โดยฝั่ง Device ในบทความนี้จะใช้ IOXESP32 และคอมพิวเตอร์ในการแลกเปลี่ยนข้อมูล ส่วน Broker (Server) เลือกใช้ Public MQTT Broker จาก EMQX

การเขียนโปรแกรมเชื่อมต่อ MQTT ต้องทำผ่านไลบรารี่ PubSubClient

การเชื่อมต่อ MQTT ที่พอร์ต 1883 (TCP Port) จะเป็นการเชื่อมต่อด้วยโปรโตคอล TCP อย่างเดียว ไม่มีการเข้ารหัสข้อมูลระหว่างการรับ-ส่ง สามารถให้ไลบรารี่ PubSubClient เชื่อมต่อกับ Ethernet ได้โดยตรง

แต่หากเลือกใช้พอร์ต 8883 (SSL/TLS Port) จำเป็นต้องมีไลบรารี่ ESP_SSLClient มาคั่น (เช่นเดียวกับ HTTPS) เพื่อให้ไลบรารี่ ESP_SSLClient ช่วยเข้ารหัสก่อนส่งข้อมูล และถอดรหัสเมื่อได้รับข้อมูลมา

ใช้โค้ดต่อไปนี้ในการทดสอบ

เปิด Serial Monitor ขึ้นมา หากเชื่อมต่อกับ Broker ได้ จะมีข้อความ connected ขึ้น (ดังรูป)

เปิดโปรแกรม MQTTX ขึ้นมา (ดาวน์โหลดที่ https://mqttx.app/arrow-up-right) เริ่มสร้างการเชื่อมต่อ Broker โดยกดที่เครื่องหมายบวก (1) แล้วกด New Connection (2)

กรอกชื่อ (1) แล้วกรอก Host เป็น broker.emqx.io (2) แล้วกด Connect (3)

เพิ่ม Subscription เพื่อให้รับข้อมูลจากบอร์ด IOXESP32 ได้ โดยกด New Subscription

กรอกช่อง Topic เป็น /IOXESP32-Ethernet-Test แล้วกด Confirm

กดปุ่ม Reset บนบอร์ด IOXESP32 1 ครั้ง หากเชื่อมต่อ MQTT ได้แล้ว จะมีข้อความ hello world แสดงขึ้นมาในโปรแกรม MQTTX

ทดสอบส่งข้อมูลไปที่บอร์ด IOXESP32 โดยใส่ Topic เป็น /IOXESP32-Ethernet-Test กรอกข้อความ แล้วกดปุ่มส่ง

ผลที่ได้ ข้อความที่ส่งไปจะแสดงทั้งในหน้าต่างของ MQTTX และที่ Serial Monitor

Last updated