
ในการพัฒนาอุปกรณ์ IoT สำหรับควบคุมฟาร์มหรือโรงเรือน ปัญหาที่ท้าทายที่สุดคือการทำให้ "ตารางเวลา (Schedule)" ทำงานได้อย่างแม่นยำและยืดหยุ่น บทความนี้จะเจาะลึกเบื้องหลังระบบที่ใช้ JSON-based Schedule ร่วมกับ MQTT Sync เพื่อสร้างระบบตั้งเวลาที่ทำงานได้อิสระแม้ไม่มีโมดูลนาฬิกา (RTC)
1. เมื่อไม่มี RTC: กลยุทธ์ "Boot-to-Sync"
โดยปกติ ESP32 จะล้างค่าเวลาทิ้งเมื่อไฟดับ ในระบบนี้เราแก้ปัญหาโดยการตั้งค่า Default ไว้ที่ 05:59:35 น. ในคำสั่ง setup() เพื่อเตรียมพร้อมเข้าสู่ช่วงเช้า แต่หัวใจสำคัญคือการดึงเวลาจริงจาก Server ทันทีที่เชื่อมต่อ MQTT ได้
Technical Insight:
เมื่อ MQTT เชื่อมต่อสำเร็จ ระบบจะส่งคำสั่ง comm = "regis" ไปยัง Server เพื่อขอรับค่าเวลาปัจจุบัน (Timestamp) ผ่านทาง Callback JSON มาอัปเดตตัวเครื่องด้วยฟังก์ชัน setTime()
// ตัวอย่างการ Sync เวลาผ่าน JSON Callback int time_H = doc["datetime"][0]; // ... (ดึงค่าจนครบ) setTime(time_H, time_i, time_s, time_j, time_n, time_y);
2. การออกแบบ Schedule ด้วย JSON & SPIFFS
แทนที่จะเขียนเงื่อนไขเวลาลงใน Code (Hard-coded) ให้ใช้การเก็บตารางงานไว้ในไฟล์ schedule.txt ภายในหน่วยความจำ SPIFFS ซึ่งรองรับรูปแบบการทำงาน 2 โหมด:
- Freedom Mode 1 (Fix Time): ทำงานตามช่วงเวลาที่กำหนดเป๊ะๆ
- Freedom Mode 2 (Interval Loop): ทำงานเป็นรอบ (เช่น เปิด 5 นาที เว้น 10 นาที) ภายในช่วงเวลาที่กำหนด
การเก็บข้อมูลแบบยืดหยุ่น:
ระบบใช้การตรวจสอบวันในสัปดาห์ day_of_week() เพื่อเช็ค Bitmask หรือสถานะการทำงานในแต่ละวัน (Mon-Sun) ทำให้เราสั่งงานแบบ "รดน้ำเฉพาะวันเว้นวัน" ได้อย่างง่ายดาย
3. Logic การคำนวณเวลาแบบ "นาที/วินาทีสะสม"
เพื่อให้การเปรียบเทียบเวลาทำได้รวดเร็ว ระบบจะแปลงเวลาปัจจุบันให้เป็น Seconds of Day (0 - 86,400 วินาที) ผ่านฟังก์ชัน timeSecs()
$$TotalSeconds = (Hour \times 3600) + (Minute \times 60) + Second$$
วิธีนี้ช่วยให้การเช็คช่วงเวลา (Time Range) ทำได้ง่ายขึ้นมาก โดยเฉพาะกรณีที่ช่วงเวลาครอบคลุมไปถึงหลังเที่ยงคืน (Midnight Crossing) เช่น เริ่ม 22:00 น. จบ 02:00 น. ของอีกวัน
4. Hybrid Control: เมื่อระบบ Manual แทรกแซง Auto
จุดเด่นของระบบนี้คือการมี manualActive flag สำหรับ Relay แต่ละช่อง หากผู้ใช้สั่งเปิดผ่าน UI (Next.js) ระบบจะพักโหมด Auto ไว้ชั่วคราวตามระยะเวลา manualDuration ที่ส่งมา และจะดีดกลับเข้าสู่โหมด Auto ทันทีเมื่อครบเวลา หรือสั่งปิด Manual
5. การจัดการพลังงานและสถานะหลังไฟดับ
ใน Code มีการใช้เทคนิค Check-in Interval แบบแปรผัน:
- Idle State: ส่งสถานะทุก 15 นาที เพื่อประหยัด Data
- Active State (เมื่อมี Relay ทำงาน): ส่งสถานะทุก 5 นาที เพื่อให้ผู้ใช้เฝ้าดูผ่าน Dashboard ได้แบบ Real-time
หากเรามีการจัดการ State Management ที่ดีผ่าน SPIFFS และมีระบบ Time Sync ที่แข็งแกร่งผ่าน MQTT คุณก็จะได้ระบบ IoT ที่ทั้งลดต้นทุนและมีความแม่นยำสูง
Keywords ESP32 Schedule Manager, IoT Timer Without RTC, SPIFFS Schedule JSON, MQTT Time Sync ESP32, Smart Farm Automation Code