ESP32 RF Switch: สวิตช์ไร้สายควบคุมผ่าน MQTT และ Home Assistant
โปรเจคนี้เป็นการสร้างสวิตช์ไร้สาย RF 433MHz ด้วย ESP32 ที่สามารถรับและส่งสัญญาณเพื่อควบคุมอุปกรณ์ไฟฟ้าต่างๆ ผ่านโปรโตคอล MQTT และเชื่อมต่อกับ Home Assistant เพื่อสร้างระบบบ้านอัจฉริยะที่สมบูรณ์แบบ ในบทความนี้จะพาคุณไปทำความเข้าใจตั้งแต่การเลือกฮาร์ดแวร์ การถอดรหัสสัญญาณ RF การส่งสัญญาณ การตั้งค่า MQTT จนถึงการเชื่อมต่อกับ Home Assistant พร้อมโค้ดตัวอย่างและขั้นตอนละเอียด
Hardware
ฮาร์ดแวร์ที่ใช้ในโปรเจคนี้ประกอบด้วย:
อุปกรณ์หลัก:
- ESP32 Development Board - ไมโครคอนโทรลเลอร์ที่มี WiFi และ Bluetooth ในตัว เหมาะสำหรับงาน IoT
- โมดูล RF Receiver 433MHz (เช่น RXB6, SYN470R หรือ WL101-341) - สำหรับรับสัญญาณจากรีโมทหรือเซ็นเซอร์ไร้สาย
- โมดูล RF Transmitter 433MHz (เช่น FS1000A, STX882 หรือ WL101-341) - สำหรับส่งสัญญาณไปควบคุมอุปกรณ์
- สวิตช์กดหรือสวิตช์ Toggle - สำหรับเป็น Input ในการควบคุมแบบ Manual
- โมดูลรีเลย์ 1-4 ช่อง - ถ้าต้องการควบคุมอุปกรณ์ไฟฟ้า AC/DC โดยตรง
อุปกรณ์เสริม:
- แหล่งจ่ายไฟ 5V หรือ 3.3V ที่เหมาะสมกับ ESP32 และโมดูล RF
- สาย Jumper และ Breadboard สำหรับต่อวงจร
- ตัวต้านทาน Pull-up/Pull-down ตามความเหมาะสม
- เสาอากาศ 17.3 ซม. สำหรับโมดูล RF เพื่อเพิ่มระยะการรับส่งสัญญาณ
ข้อแนะนำในการเลือกโมดูล RF:
ควรเลือกแบบที่มีความไวสูงและรองรับ ASK/OOK Modulation ซึ่งเป็นมาตรฐานของอุปกรณ์ RF 433MHz ทั่วไป
การต่อวงจร:
- ต่อขา VCC ของโมดูล RF เข้ากับ 5V หรือ 3.3V (ตามสเปค)
- ต่อ GND เข้ากับ GND
- ต่อขา DATA ของ Receiver เข้ากับ GPIO ของ ESP32 เช่น GPIO 4
- ต่อขา DATA ของ Transmitter เข้ากับ GPIO อื่น เช่น GPIO 5
Initial testing
ขั้นตอนแรกในการทดสอบคือการตรวจสอบว่าโมดูล RF Receiver สามารถรับสัญญาณจากรีโมทหรืออุปกรณ์ RF ได้หรือไม่
การติดตั้งไลบรารี:
- ใช้ไลบรารี RCSwitch ซึ่งเป็นไลบรารีที่ได้รับความนิยมสำหรับการทำงานกับอุปกรณ์ RF 433MHz
- ติดตั้งไลบรารีผ่าน Arduino IDE Library Manager โดยค้นหา "rc-switch" และติดตั้ง
การเขียนโค้ดทดสอบ:
- ใช้ตัวอย่าง ReceiveDemo_Simple ที่มาพร้อมกับไลบรารี
- โค้ดจะทำการอ่านค่าจากขา GPIO ที่ต่อกับ RF Receiver และแสดงผลผ่าน Serial Monitor เมื่อมีสัญญาณเข้ามา
- กำหนดขา GPIO ที่ใช้ เช่น mySwitch.enableReceive(4) สำหรับ GPIO 4
การทดสอบ:
- Upload โค้ดเข้า ESP32 และเปิด Serial Monitor ที่ Baud Rate 115200
- ทดสอบโดยกดปุ่มบนรีโมท RF หรือเปิดเซ็นเซอร์ RF ที่มีอยู่
- ถ้าทำงานถูกต้อง Serial Monitor จะแสดงข้อมูลเช่น "Received 5393 / 24bit Protocol: 1"
ข้อมูลที่ได้รับ:
- Decimal Value - ค่าทศนิยมของสัญญาณ
- Bit Length - จำนวนบิตของข้อมูล
- Protocol - โปรโตคอลที่ใช้ (Protocol 1, 2, 3 ฯลฯ)
ให้บันทึกค่าเหล่านี้ไว้เพื่อใช้ในขั้นตอนการส่งสัญญาณ
การแก้ปัญหา:
หากไม่มีข้อมูลแสดงออกมา ให้ตรวจสอบการต่อวงจร แรงดันไฟ และลองเปลี่ยนขา GPIO หรือเพิ่มเสาอากาศ
Full decoding
หลังจากทดสอบเบื้องต้นแล้ว ขั้นตอนต่อไปคือการถอดรหัสสัญญาณ RF อย่างละเอียดเพื่อให้สามารถจำแนกปุ่มต่างๆ บนรีโมทหรือแหล่งสัญญาณต่างๆ ได้
การใช้โค้ดขั้นสูง:
- ใช้ตัวอย่างโค้ด ReceiveDemo_Advanced ซึ่งจะแสดงข้อมูลเพิ่มเติม
- Binary Value - ค่าไบนารีของสัญญาณ
- Tri-State Value - สำหรับบางโปรโตคอล
- Pulse Length - ความยาวของพัลส์สัญญาณ
- Raw Data - ข้อมูลดิบของสัญญาณ
ประโยชน์ของข้อมูลเหล่านี้:
มีประโยชน์ในการ Debug และทำความเข้าใจโครงสร้างของสัญญาณ RF โดยเฉพาะเมื่อต้องการทำงานกับอุปกรณ์ที่ใช้โปรโตคอลพิเศษหรือไม่ได้มาตรฐาน
การบันทึกค่าของแต่ละปุ่ม:
- ทดสอบกดปุ่มแต่ละปุ่มบนรีโมทและบันทึกค่า Decimal Value ของแต่ละปุ่มไว้
- ตัวอย่าง: ปุ่ม A = 5393, ปุ่ม B = 5396, ปุ่ม C = 5412, ปุ่ม D = 5443
การนำไปใช้:
ค่าเหล่านี้จะถูกใช้ในการเขียนโค้ดเพื่อจำแนกว่าปุ่มไหนถูกกด และสั่งการให้ ESP32 ทำงานตามที่ต้องการ เช่น:
- เปิด-ปิดไฟ
- เปิด-ปิดพัดลม
- ส่งคำสั่งผ่าน MQTT ไปยังอุปกรณ์อื่น
ทางเลือกในการเปรียบเทียบ:
นอกจากนี้ยังสามารถใช้ค่า Binary หรือ Tri-State ในการเปรียบเทียบได้เช่นกัน ขึ้นอยู่กับความเหมาะสมของโปรโตคอล
กรณีพิเศษ:
สำหรับอุปกรณ์บางชนิดที่ใช้ Rolling Code หรือ Encryption อาจต้องใช้วิธีการถอดรหัสที่ซับซ้อนกว่า หรือใช้ไลบรารีเฉพาะทาง
Transmitting experiments
หลังจากถอดรหัสสัญญาณได้แล้ว ขั้นตอนต่อไปคือการทดลองส่งสัญญาณ RF เพื่อควบคุมอุปกรณ์
การเตรียมฮาร์ดแวร์:
- ใช้โมดูล RF Transmitter
- ต่อขา DATA ของ Transmitter เข้ากับ GPIO ของ ESP32 เช่น GPIO 5
- ต่อ VCC และ GND ตามปกติ
การเขียนโค้ดส่งสัญญาณ:
- ใช้ตัวอย่างโค้ด SendDemo ที่มาพร้อมกับไลบรารี RCSwitch
- กำหนดขา GPIO: mySwitch.enableTransmit(5)
- กำหนดค่าที่ต้องการส่ง: mySwitch.send(5393, 24)
- 5393 คือ Decimal Value ที่ได้จากการถอดรหัส
- 24 คือจำนวนบิต
การตั้งค่าเพิ่มเติม:
- กำหนด Protocol: mySwitch.setProtocol(1)
- กำหนด Pulse Length: mySwitch.setPulseLength(350)
- กำหนด Repeat Count: mySwitch.setRepeatTransmit(10) เพื่อส่งสัญญาณซ้ำหลายครั้ง
การทดสอบ:
- Upload โค้ดและดูว่าอุปกรณ์ที่ต้องการควบคุม (ปลั๊กไฟ RF, หลอดไฟ RF, พัดลม RF) ทำงานตามคำสั่งหรือไม่
- หากไม่ทำงาน ให้ลองปรับค่า Protocol, Pulse Length หรือ Repeat Count
การเพิ่มประสิทธิภาพ:
- การส่งสัญญาณซ้ำหลายครั้งช่วยเพิ่มความน่าเชื่อถือในการรับสัญญาณ
- การเพิ่มเสาอากาศที่ Transmitter ช่วยเพิ่มระยะการส่งสัญญาณได้
- ควรทดสอบในระยะใกล้ก่อน แล้วค่อยๆ เพิ่มระยะห่างเพื่อหาขีดจำกัดของระบบ
การควบคุมหลายอุปกรณ์:
ให้บันทึกรหัสของแต่ละอุปกรณ์และสร้างฟังก์ชันสำหรับส่งสัญญาณแต่ละตัว เช่น:
- void turnOnLight() { mySwitch.send(5393, 24); }
- void turnOffLight() { mySwitch.send(5396, 24); }
Simultaneous transmit and receive
ในการใช้งานจริง เรามักต้องการให้ ESP32 สามารถรับและส่งสัญญาณ RF ได้พร้อมกัน
ตัวอย่างการใช้งาน:
- รับสัญญาณจากรีโมทเพื่อควบคุมอุปกรณ์ในบ้าน
- ส่งสัญญาณไปควบคุมอุปกรณ์อื่นผ่าน MQTT หรือ Home Assistant
การเตรียมฮาร์ดแวร์:
- ใช้ทั้ง RF Receiver และ RF Transmitter ต่อกับ ESP32 พร้อมกัน
- ต่อที่ GPIO คนละขา เช่น Receiver ที่ GPIO 4 และ Transmitter ที่ GPIO 5
การเขียนโค้ด:
- เรียกใช้ทั้ง enableReceive() และ enableTransmit() พร้อมกัน
- สร้าง Loop ที่ตรวจสอบสัญญาณที่เข้ามาอยู่ตลอดเวลา
- เมื่อมีสัญญาณเข้ามา ให้ประมวลผลและตัดสินใจว่าจะทำอะไร
ตัวอย่างการทำงาน:
- ถ้าได้รับรหัส 5393 ให้เปิดไฟ และส่งสถานะผ่าน MQTT ไปยัง Home Assistant
- ถ้าได้รับคำสั่งจาก MQTT ให้ส่งสัญญาณ RF ไปควบคุมอุปกรณ์
ข้อควรระวัง:
การส่งและรับสัญญาณพร้อมกันอาจทำให้เกิด Interference หรือสัญญาณรบกวนได้ โดยเฉพาะถ้าใช้ความถี่เดียวกัน
วิธีแก้ปัญหา:
- ใช้ Timing ที่เหมาะสม เช่น ไม่ส่งสัญญาณในขณะที่กำลังรับ
- ใช้ Buffer เพื่อเก็บคำสั่งที่ต้องส่งและส่งทีละคำสั่ง
- ใช้ Interrupt-based Receiving แทน Polling เพื่อลด CPU Usage และเพิ่มความเร็วในการตอบสนอง
ข้อดีของไลบรารี RCSwitch:
ไลบรารี RCSwitch รองรับ Interrupt โดยอัตโนมัติ ดังนั้นไม่ต้องกังวลเรื่องนี้มากนัก
ข้อควรระวังเพิ่มเติม:
ควรระวังเรื่อง Timing ในการส่งสัญญาณ โดยเฉพาะเมื่อมีการทำงานหลายอย่างพร้อมกัน เช่น:
- การเชื่อมต่อ WiFi
- การทำงานกับ MQTT
- การอ่านเซ็นเซอร์
IotWebConf setup
IotWebConf เป็นไลบรารีที่ช่วยให้การตั้งค่า WiFi และพารามิเตอร์ต่างๆ ของ ESP32 ทำได้ง่ายขึ้นผ่าน Web Interface โดยไม่ต้อง Hard-code SSID และ Password ในโค้ด
ข้อดีของ IotWebConf:
- เหมาะสำหรับการใช้งานจริงและการแจกจ่ายอุปกรณ์ให้ผู้อื่นใช้
- ไม่ต้อง Hard-code ข้อมูล WiFi ในโค้ด
- สามารถเพิ่ม Custom Parameter ได้ง่าย
- มีระบบ OTA (Over-The-Air) Update ในตัว
การติดตั้ง:
- ติดตั้งไลบรารี IotWebConf ผ่าน Arduino IDE Library Manager
- ค้นหา "IotWebConf" และติดตั้ง
การเขียนโค้ด:
- Include ไลบรารีและสร้าง Object
- IotWebConf iotWebConf("ESP32-RF-Switch", &dnsServer, &server, "admin", "password")
- "ESP32-RF-Switch" คือชื่อ Access Point ที่จะแสดงเมื่อ ESP32 อยู่ในโหมด Config
- "admin" และ "password" คือ Username และ Password สำหรับเข้าหน้า Web Config
การตั้งค่าครั้งแรก:
- เมื่อ ESP32 เริ่มทำงานครั้งแรกหรือไม่สามารถเชื่อมต่อ WiFi ได้ มันจะสร้าง Access Point
- เชื่อมต่อด้วยมือถือหรือคอมพิวเตอร์
- เปิดเบราว์เซอร์ไปที่ 192.168.4.1 เพื่อตั้งค่า
พารามิเตอร์ที่สามารถตั้งค่าได้:
- SSID และ Password ของ WiFi
- MQTT Server และ Port
- MQTT Username และ Password
- MQTT Topic
- RF Code สำหรับแต่ละปุ่ม
- Pulse Length และ Protocol
การเพิ่ม Custom Parameter:
สามารถเพิ่ม Custom Parameter ได้ง่ายโดยใช้ IotWebConfParameter และเพิ่มเข้าไปใน iotWebConf.addParameter()
ระบบ OTA Update:
- มีระบบ OTA (Over-The-Air) Update ในตัว
- สามารถ Upload Firmware ใหม่ผ่าน Web Interface ได้โดยไม่ต้องต่อสาย USB
- สะดวกมากสำหรับอุปกรณ์ที่ติดตั้งในที่สูงหรือยากเข้าถึง
หลังจากตั้งค่าเสร็จ:
ESP32 จะ Reboot และเชื่อมต่อ WiFi ตามที่ตั้งค่าไว้
MQTT
MQTT (Message Queuing Telemetry Transport) เป็นโปรโตคอลการสื่อสารแบบ Lightweight ที่ออกแบบมาสำหรับอุปกรณ์ IoT
รูปแบบการทำงาน:
- ใช้รูปแบบ Publish/Subscribe Pattern
- มี MQTT Broker เป็นตัวกลางในการรับและส่งข้อความระหว่างอุปกรณ์ต่างๆ
การติดตั้งไลบรารี:
- ติดตั้งไลบรารี PubSubClient ผ่าน Arduino IDE Library Manager
- ค้นหา "PubSubClient" และติดตั้ง
การเขียนโค้ด:
- Include ไลบรารีและสร้าง Object: WiFiClient espClient และ PubSubClient client(espClient)
- ตั้งค่า MQTT Server และ Port: client.setServer("192.168.1.100", 1883)
- สร้างฟังก์ชัน Callback สำหรับรับข้อความ: void callback(char* topic, byte* payload, unsigned int length)
การประมวลผลข้อความที่ได้รับ:
ในฟังก์ชัน Callback ให้แปลง payload เป็น String และตรวจสอบว่าเป็นคำสั่งอะไร:
- ถ้าได้รับ "ON" ให้ส่งสัญญาณ RF เพื่อเปิดไฟ
- ถ้าได้รับ "OFF" ให้ส่งสัญญาณเพื่อปิดไฟ
การ Publish ข้อความ:
- ใช้ client.publish("home/switch/status", "ON") เพื่อส่งสถานะไปยัง Topic ที่กำหนด
การ Subscribe:
- ใช้ client.subscribe("home/switch/command") เพื่อรับคำสั่งจาก Topic ที่กำหนด
การจัดการการเชื่อมต่อ:
- เพิ่มการตรวจสอบการเชื่อมต่อ MQTT และ Reconnect อัตโนมัติเมื่อการเชื่อมต่อขาดหาย
- if (!client.connected()) { reconnect(); }
- เรียก client.loop() ใน Loop หลักเพื่อให้ MQTT ทำงานอย่างต่อเนื่อง
ตัวอย่างการทำงานแบบครบวงจร:
- ขั้นที่ 1: เมื่อกดปุ่มบนรีโมท RF, ESP32 จะรับสัญญาณและ Publish สถานะไปยัง MQTT Topic เช่น "home/living_room/light" = "ON"
- ขั้นที่ 2: Home Assistant จะรับข้อความนี้และอัพเดทสถานะของ Switch Entity
- ขั้นที่ 3: เมื่อผู้ใช้กด Switch ใน Home Assistant, Home Assistant จะ Publish คำสั่งไปยัง Topic เช่น "home/living_room/light/set" = "OFF"
- ขั้นที่ 4: ESP32 จะรับคำสั่งและส่งสัญญาณ RF ไปปิดไฟ
Home Assistant integration
Home Assistant เป็นแพลตฟอร์ม Open Source สำหรับการสร้างระบบบ้านอัจฉริยะที่รองรับอุปกรณ์หลากหลายยี่ห้อและโปรโตคอล
การเชื่อมต่อ:
การเชื่อมต่อ ESP32 RF Switch กับ Home Assistant ทำได้โดยใช้ MQTT Integration ซึ่งมีอยู่ใน Home Assistant โดยค่าเริ่มต้น
ขั้นตอนการตั้งค่า:
1. ติดตั้ง MQTT Broker:
- ติดตั้ง Mosquitto บน Home Assistant
- ไปที่ Settings > Add-ons > Add-on Store
- ค้นหา "Mosquitto broker" และติดตั้ง
2. ตั้งค่า MQTT Integration:
- ไปที่ Settings > Devices & Services
- Add Integration > ค้นหา "MQTT" และเพิ่ม
3. สร้าง Configuration สำหรับ Switch Entity:
ในไฟล์ configuration.yaml เพิ่มโค้ดดังนี้:
- mqtt:
- switch:
- - name: "Living Room Light"
- state_topic: "home/living_room/light"
- command_topic: "home/living_room/light/set"
- payload_on: "ON"
- payload_off: "OFF"
- state_on: "ON"
- state_off: "OFF"
- optimistic: false
- retain: true
4. Restart Home Assistant:
Restart Home Assistant เพื่อให้การตั้งค่ามีผล
5. ทดสอบ:
- เปิด Home Assistant Dashboard และหา Switch Entity ที่สร้างไว้
- ลองกดเปิด-ปิดและดูว่า ESP32 ส่งสัญญาณ RF ไปควบคุมอุปกรณ์ได้หรือไม่
การสร้าง Automation:
สามารถสร้าง Automation ใน Home Assistant เพื่อควบคุมอุปกรณ์ตามเงื่อนไขต่างๆ เช่น:
- เปิดไฟอัตโนมัติเมื่อตรวจจับการเคลื่อนไหว
- ปิดไฟเมื่อไม่มีคนในห้อง
- เปิดพัดลมเมื่ออุณหภูมิสูงเกินกำหนด
- ควบคุมผ่าน Voice Assistant เช่น Google Home หรือ Amazon Alexa
การเชื่อมต่อกับ Voice Assistant:
สามารถควบคุมผ่าน Voice Assistant ได้ด้วยการเชื่อมต่อ Home Assistant กับบริการเหล่านี้
การแสดงผลที่สวยงาม:
สามารถใช้ Lovelace Card ต่างๆ เพื่อสร้าง Dashboard ที่ใช้งานง่ายและสวยงาม:
- Button Card
- Mushroom Card
- Custom Cards อื่นๆ
Source and further links
สำหรับผู้ที่สนใจศึกษาเพิ่มเติมหรือต้องการโค้ดตัวอย่างที่สมบูรณ์ สามารถดูได้จากแหล่งข้อมูลต่อไปนี้:
เอกสารและ Repository:
- GitHub Repository ของโปรเจคนี้ - มีโค้ดเต็มรูปแบบพร้อมคำอธิบาย
- RCSwitch Library - https://github.com/sui77/rc-switch มีตัวอย่างและคำอธิบายการใช้งานโดยละเอียด
- IotWebConf Library - https://github.com/prampec/IotWebConf สำหรับการตั้งค่า WiFi และพารามิเตอร์ผ่าน Web Interface
- PubSubClient Library - https://github.com/knolleary/pubsubclient สำหรับการใช้งาน MQTT
- Home Assistant MQTT Integration - https://www.home-assistant.io/integrations/mqtt/ สำหรับการตั้งค่าและใช้งาน MQTT กับ Home Assistant
ฟอรัมและ Community:
- Home Assistant Community Forum
- ESP32 Forum
- Arduino Forum
- มีผู้ใช้งานแชร์ประสบการณ์และช่วยเหลือกันแก้ปัญหา
YouTube Channels แนะนำ:
Channels ที่สอนเกี่ยวกับ ESP32, Home Assistant และ IoT:
- Andreas Spiess
- DrZzs
- The Hook Up
ไอเดียการต่อยอดโปรเจค:
- เพิ่มการควบคุมผ่าน Web Interface โดยตรงบน ESP32
- เพิ่มการบันทึก Log และ Statistics
- เพิ่มการรองรับ RF Protocol อื่นๆ
- เพิ่มการควบคุมผ่าน Bluetooth
- สร้าง Mobile App สำหรับควบคุมโดยตรง
สนับสนุน / ช้อปอุปกรณ์ / เข้าร่วม Community
หากคุณสนใจอุปกรณ์ ESP32, โมดูล RF, โมดูลรีเลย์ และอุปกรณ์ IoT อื่นๆ หรืออยากพูดคุยแลกเปลี่ยนความรู้กับเพื่อนๆ ในสาย GlobalByte สามารถกดปุ่มด้านล่างนี้ได้เลย