ปั๊มน้ำหยุดทำงานถาวร เมื่อบอร์ดเปิดต่อเนื่องครบ 49 วัน
- ESP32
- C++
- Unit test
- อาการ
- เทสต์ที่จำลองเวลาของบอร์ดใกล้ค่าสูงสุดของ
millis()พบว่าปั๊มไม่ยอมเปิด แม้ดินแห้ง ถ้าเกิดกับบอร์ดจริงคือรดน้ำไม่ได้เลยหลังเปิดเครื่องประมาณ 49.7 วัน - สาเหตุ
millis()เป็นตัวเลข 32 บิตที่วนกลับเป็น 0 ทุก 49.7 วัน โค้ดเดิมเทียบ "เวลาที่จะพักปั๊มเสร็จ" แบบตัวเลขตรง ๆ ค่าเริ่มต้น 0 จึงดูเหมือนยังพักอยู่ตลอด- วิธีแก้
- วัด "เวลาที่ผ่านไปตั้งแต่เริ่ม" (
now - start) ซึ่งคำนวณถูกเสมอแม้ตัวเลขวนรอบ และเก็บสถานะพักปั๊มเป็นตัวแปรแยก
ก่อนbool resting = int32_t(now - restUntil_) < 0;
...
restUntil_ = now + kPumpRestMs;
หลังif (resting_ && now - restStart_ >= kPumpRestMs)
resting_ = false;
...
resting_ = true;
restStart_ = now;
พิสูจน์: เพิ่มเทสต์ millisWrap ที่เริ่มนับเวลาก่อนตัวเลขวนรอบ 5 วินาที รันบนคอมพิวเตอร์ด้วย make test ไม่ผ่านกับโค้ดเดิม และผ่านหลังแก้ · ดูเทสต์ · ดูโค้ด