การใช้ ESP32-C6 ในเครือข่าย Zigbee เพื่อเป็นตัวกลางและเซนเซอร์วัดอุณหภูมิ
สวัสดีชาว Maker และสาย Smart Home ทุกคนครับ! 🏠 เชื่อว่าหลายคนน่าจะเคยได้ยินชื่อโปรโตคอลการสื่อสารไร้สายยอดฮิตอย่าง Zigbee กันมาบ้างแล้วใช่ไหมครับ? วันนี้เราจะพาคุณไปเจาะลึกวิธีการใช้ไมโครคอนโทรลเลอร์ตัวแรงอย่าง ESP32-C6 ให้สวมบทบาทเป็น End Device (อุปกรณ์ปลายทาง) หรือ Coordinator (ตัวประสานงาน) ในเครือข่าย Zigbee กันครับ!
ในตอนท้ายของบทความนี้ คุณจะสามารถอ่านค่าจากเซนเซอร์วัดอุณหภูมิ Zigbee ที่มีขายทั่วไปตามท้องตลาด แล้วนำข้อมูลมาประมวลผลต่อในบอร์ด ESP32 ได้เลย! (หมายเหตุ: บทความนี้จะเน้นไปที่การโค้ดดิ้งเพียวๆ ยังไม่ได้เชื่อมต่อเข้ากับระบบ Home Automation แบบเต็มรูปแบบนะครับ)
หัวข้อที่เราจะลุยกันวันนี้ 🚀
- ฮาร์ดแวร์และซอฟต์แวร์ที่ต้องใช้
- ทำความเข้าใจบทบาทต่างๆ ในเครือข่าย Zigbee
- การตั้งค่าเซนเซอร์วัดอุณหภูมิ (End Device)
- การตั้งค่าเครื่องควบคุม (Coordinator)
- การพูดคุยกันระหว่าง Coordinator และ End Device
- การดึงข้อมูลและปรับแต่ง Class เพื่ออ่านค่าความชื้นและแบตเตอรี่!
ฮาร์ดแวร์และซอฟต์แวร์ที่ต้องเตรียม 🛠️
เราแนะนำให้เตรียม บอร์ดพัฒนา ESP32-C6 จำนวน 2 บอร์ด ครับ
- บอร์ดที่ 1 (ทำหน้าที่เป็น Coordinator) ควรมี RAM อย่างน้อย 8 MB
- บอร์ดที่ 2 (ทำหน้าที่เป็น End Device) มี RAM 4 MB ก็เพียงพอแล้วครับ
นอกจากนี้ การมี หน้าจอ OLED SSD1306 ต่อพ่วงไว้ด้วยจะช่วยให้เราอ่านค่าต่างๆ ได้จากหน้าจอโดยตรง ไม่ต้องคอยเสียบสายเข้าคอมพิวเตอร์ตลอดเวลาครับ สำหรับฝั่งซอฟต์แวร์ เราจะใช้ Arduino IDE เวอร์ชัน 2.3.8 และติดตั้ง ESP32 Boards เวอร์ชัน 3.3.7
💡 Maker's Tip: บอร์ดตระกูล ESP32-C6 ถูกออกแบบมาเพื่อรองรับโปรโตคอลไร้สายยุคใหม่อย่าง Wi-Fi 6, Bluetooth 5 และ Zigbee/Thread โดยเฉพาะครับ!
หากเพื่อนๆ คนไหนกำลังมองหา บอร์ด ESP32-C6, หน้าจอ OLED SSD1306 หรือโมดูลเซนเซอร์ต่างๆ แวะมาเลือกช้อปปิ้งของแท้พร้อมส่งได้ที่ Globalbyte เลยครับ! ของครบพร้อมลุยโปรเจกต์ทันที!
รู้จักบทบาทต่างๆ ในเครือข่าย Zigbee 🌐
เครือข่าย Zigbee จะมีอุปกรณ์หลักๆ อยู่ 4 บทบาทด้วยกันครับ:
-
1. End Device (อุปกรณ์ปลายทาง): คือตัวที่คอยส่งข้อมูลเซนเซอร์ (เช่น อุณหภูมิ, ความชื้น) หรือรับคำสั่ง (เช่น หลอดไฟที่รอคำสั่งเปิด/ปิด)
-
2. Coordinator (ตัวประสานงาน): ถือเป็น "หัวใจหลัก" ของเครือข่าย ทำหน้าที่รวบรวมค่าจากเซนเซอร์และคอยสั่งการ End Device ต่างๆ
-
3. Router (ตัวขยายสัญญาณ): ทำหน้าที่เป็นจุดส่งต่อสัญญาณ เพื่อเพิ่มระยะทางของเครือข่าย (ส่วนใหญ่หลอดไฟ Zigbee ก็ทำหน้าที่เป็น Router ด้วย เพื่อสร้างระบบ Mesh Network)
-
4. Gateway / Hub (เกตเวย์): คอยรับข้อมูลจาก Zigbee แล้วแปลงส่งต่อผ่าน Wi-Fi เพื่อให้เราควบคุมผ่านแอปในมือถือได้
การเซ็ตอัพฝั่งเซนเซอร์ (End Device) 🌡️
ในการเขียนโค้ดฝั่งเซนเซอร์ เราจะสร้างคลาสสำหรับระบุประเภทอุปกรณ์ ตั้งชื่อผู้ผลิต และสร้างฟังก์ชัน Callback ที่จะทำงานเมื่ออุณหภูมิเปลี่ยนครับ จากนั้นระบบจะเข้าสู่สถานะรอจนกว่าจะเชื่อมต่อกับ Coordinator ได้สำเร็จ
// กำหนดคลาสเซนเซอร์และ Endpoint
ZigbeeTempSensor zbTempSensor = ZigbeeTempSensor(TEMP_SENSOR_ENDPOINT_NUMBER);
zbTempSensor.setManufacturerAndModel("Espressif", "ZigbeeTempSensor");
Zigbee.addEndpoint(&zbTempSensor);
if (!Zigbee.begin())...
while (!Zigbee.connected())...
ในฟังก์ชัน loop() หากเรากดปุ่มค้างไว้เกิน 3 วินาที จะเป็นการลบข้อมูลและรีเซ็ตกลับเป็นโหมดจับคู่ (Factory Reset / Pairing mode) ครับ และถ้ากดปุ่มสั้นๆ จะเป็นการสั่งให้มันรายงานอุณหภูมิปัจจุบันออกไปทันที
การเซ็ตอัพฝั่งเครื่องควบคุม (Coordinator) 🎛️
ฝั่ง Coordinator จะมีความคล้ายกันครับ แต่จะเปิดเครือข่ายให้เชื่อมต่อได้ภายในเวลา 180 วินาทีหลังจากบูตเครื่อง และมีการเตรียมฟังก์ชัน Callback เอาไว้รับค่าจากเซนเซอร์ปลายทาง
ZigbeeThermostat zbThermostat = ZigbeeThermostat(THERMOSTAT_ENDPOINT_NUMBER);
// เตรียม Callback ฟังก์ชันไว้รับค่าอุณหภูมิจากเซนเซอร์
zbThermostat.onTempReceiveWithSource(receiveSensorTempWithSource);
zbThermostat.onTempConfigReceive(receiveSensorConfig);
zbThermostat.setManufacturerAndModel("Espressif", "ZigbeeThermostat");
Zigbee.addEndpoint(&zbThermostat);
// เปิดให้เชื่อมต่อเครือข่ายได้ภายใน 180 วินาทีแรก
Zigbee.setRebootOpenNetwork(180);
if (!Zigbee.begin(ZIGBEE_COORDINATOR))...
while (!zbThermostat.bound())...
การนำไปใช้กับ "เซนเซอร์ของจริง" ในท้องตลาด 🏷️
เมื่อลองใช้เซนเซอร์วัดอุณหภูมิ Zigbee ของจริง (โมเดล TS0201) สิ่งที่มันทำคือ "การหลับ (Sleep)" เป็นส่วนใหญ่เพื่อประหยัดแบตเตอรี่ครับ มันจะตื่นขึ้นมาวัดค่าเป็นระยะ และส่งข้อมูลออกไปเมื่อค่าอุณหภูมิมีการเปลี่ยนแปลงถึงจุดที่กำหนดไว้
การจัดระเบียบข้อมูลในระบบ Zigbee จะถูกแบ่งออกเป็น "Clusters" (กลุ่มข้อมูล) ตามมาตรฐาน ZCL เช่น:
-
0x0402: ข้อมูลอุณหภูมิ (Temperature)
-
0x0405: ข้อมูลความชื้นสัมพัทธ์ (Relative Humidity)
-
0x0001: ข้อมูลพลังงานแบตเตอรี่ (Power Configuration)
ตัวอย่างการแสดงผลบน Serial Monitor เมื่อ Coordinator ได้รับค่าอุณหภูมิ
เซนเซอร์วัดอุณหภูมิ Zigbee เชิงพาณิชย์ (โมเดล TS0201) ที่นำมาทดสอบร่วมกับระบบ
การแก้ไลบรารีเพื่ออ่านค่า "แบตเตอรี่" 🔋
เนื่องจากไลบรารี ZigbeeThermostat แบบเดิม ไม่รองรับการอ่านค่าความชื้นและแบตเตอรี่ เราจึงต้องทำการ Extend Class สร้างคลาส ZigbeeThermostatOwn ของเราขึ้นมาเองครับ!
เราต้องแก้ไขให้ Coordinator ประกาศตัวว่า "ฉันสามารถรับข้อมูลแบตเตอรี่ (0x0001) ได้นะ" เซนเซอร์ปลายทางถึงจะยอมส่งข้อมูลมาให้ครับ
// ทำการผูก (Bind) Cluster พลังงานแบตเตอรี่เข้ากับ Thermostat ของเรา
bind_req.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_POWER_CONFIG;
esp_zb_zdo_device_bind_req(&bind_req, ZigbeeThermostatOwn::bindCbWrapper, NULL);
// สร้าง Callback มารับค่าโวลต์แบตเตอรี่
void receiveBatteryVoltageWithSource(uint8_t voltage, uint8_t src_endpoint, esp_zb_zcl_addr_t src_address) {
// ค่าที่ส่งมาจะถูกคูณ 10 ไว้เสมอ ต้องเอามาหาร 10 กลับ
float actualBatteryVoltage = voltage / 10.0;
Serial.printf("Battery Voltage: %.2f Volts from endpoint %d\n", actualBatteryVoltage, src_endpoint);
}
สรุป (Summary) ✨
การสร้าง Coordinator สำหรับเครือข่าย Zigbee ด้วยบอร์ด ESP32-C6 นั้นง่ายมากๆ หากเราใช้ไลบรารีที่มีให้ใน Arduino แต่ความสนุกที่แท้จริงของ Maker คือการได้ล้วงลึกเข้าไปแก้ไขคลาส เพื่อให้สามารถดึงข้อมูลทุกอย่าง (เช่น ความชื้น, ปริมาณแบตเตอรี่คงเหลือ) ออกมาจากอุปกรณ์เชิงพาณิชย์ได้อย่างหมดจดครับ!
🔥 เจาะลึกและอ่านบทความฉบับเต็ม! 🔥
เนื่องจากรายละเอียดการเชื่อมต่อไลบรารี การตั้งค่า Binding และการสร้างคลาส (Class) เพื่อเจาะข้อมูล Zigbee แบบ Custom นั้นมีรายละเอียดเชิงลึกและโค้ดที่ค่อนข้างซับซ้อน เราขอแนะนำให้เพื่อนๆ สาย Dev หรือคนที่อยากได้โค้ดสมบูรณ์ ไปศึกษาแบบจัดเต็มได้ที่บทความต้นฉบับเลยครับ รับรองว่าได้ความรู้เพิ่มอีกเพียบ!
อ่านบทความต้นฉบับบน Medium คลิกเลย!
*คำเตือน: เนื้อหานี้เป็นการสรุปและแปลมาจากบทความ DIY โปรเจกต์ต้นฉบับภาษาอังกฤษ ข้อมูลโครงสร้างฮาร์ดแวร์และการเขียนโปรแกรมอาจมีความคลาดเคลื่อน หรือต้องปรับเปลี่ยนให้เข้ากับเวอร์ชันไลบรารี Arduino และอุปกรณ์ Zigbee ที่คุณใช้งานจริง การปรับแก้โครงสร้าง Cluster ภายในโค้ดจำเป็นต้องมีความรู้ความเข้าใจระบบโปรโตคอล สามารถตรวจสอบรายละเอียดเชิงเทคนิคแบบเต็มได้ที่เว็บไซต์ต้นฉบับที่แนบไว้ ก่อนลงมือทำโปรเจกต์