ระบบจัดการฝักบัวอัจฉริยะ ([Arduino](https://s.shopee.co.th/7fUgFAWSki) Smart Shower) ฉบับพี่สอนน้อง
เฮ้ยน้อง! เคยเจอปัญหาอาบน้ำเพลินจนน้ำหมดแทงค์ หรือคนข้างหลังไม่ได้ใช้น้ำอุ่นไหม? โปรเจกต์ Smart Shower นี้พี่จัดให้ เอาไว้คุมการใช้น้ำและประหยัดค่าไฟ/ค่าแก๊สไปในตัว หลักการคือมันจะตัดน้ำอุ่นทิ้งถ้าเราอาบน้ำนานเกินเวลาที่ตั้งไว้ จะได้แบ่งคนอื่นอาบมั่งนะวัยรุ่น ส่วนเรื่องความปลอดภัยไม่ต้องห่วง ถ้าไฟดับขึ้นมา ทั้งน้ำร้อนน้ำเย็นยังไหลได้ปกติ เพราะเราเลือกใช้ Solenoid Valve แบบ Normally-open (N.O.) คือถ้าไม่มีไฟจ่ายมันจะเปิดค้างไว้ อาบน้ำต่อได้สบายใจหายห่วง!
1 - อุปกรณ์ที่ต้องใช้ (Components)
ลิสต์ของที่ต้องเตรียมก็ตามนี้เลย (ในวงเล็บคือรุ่นที่พี่ใช้จริงนะน้อง):
- บอร์ด Arduino (รุ่นยอดนิยม Arduino UNO)
- Breadboard กับสายไฟระโยงระยาง
- [Relay](https://s.shopee.co.th/3fyXTmWPbL): 1-channel แบบ low level trigger (TZT KY-019 5V)
- LED 2 ดวง (สีเขียว 1, สีแดง 1)
- Resistors (ตัวต้านทานขนาด 330Ω สองตัว)
- [Buzzer](https://s.shopee.co.th/6pvZFdZdRf) (แบบ Active Buzzer รุ่น TMB09A03)
- Flow [Sensor](https://s.shopee.co.th/7VBG2rX65j) วัดการไหลของน้ำ (YF-B7 5VDC)
- Solenoid valve แบบ Normally-open (12VDC)
- Dual Output Power Supply (จ่ายไฟ 5VDC และ 12VDC)
โน้ตไว้นิดนะน้อง Flow Sensor กับ Solenoid Valve ต้องเลือกขนาดให้แมตช์กับท่อน้ำที่บ้านเราด้วยล่ะ
2 - การติดตั้งและการต่อสาย (Installation & Connections)
ภาพรวมการติดตั้งระบบ Smart Shower แบบหล่อเท่ดูได้ตามรูปนี้เลย:

มาดูการต่อสายเข้ากับบอร์ด Arduino กันบ้าง จัดไปตามนี้:
- Flow Sensor ต่อเข้าที่ Digital Input Pin 2 (ใช้สำหรับ External Interrupt จะได้แม่นๆ)
- LED สีแดง ต่อเข้า Digital Output Pin 7
- LED สีเขียว ต่อเข้า Digital Output Pin 5
- Buzzer ต่อเข้า Digital Output Pin 6
- Relay ต่อเข้า Digital Output Pin 11
ส่วนแผนผังการต่อวงจร (Schematic) จัดไปตามรูปนี้ ห้ามต่อผิดนะ เดี๋ยวบอร์ดบิน!

3 - อธิบายการทำงานของโปรแกรม
โค้ดใน Arduino ตัวนี้พี่เขียนโดยใช้หลักการ State Machine คอยวัดค่าการไหลของน้ำทุกๆ วินาทีและจับเวลาเพื่อคุมสถานะต่างๆ ทำให้ระบบเราฉลาดพอที่จะเช็กเงื่อนไขการเลิกอาบน้ำได้ 2 แบบ (เดี๋ยวพี่เหลาให้ฟังข้างล่าง)
สถานะ (States) ที่พี่ตั้งไว้มีดังนี้:
- State::IDLE (จอดนิ่งรอคนมาอาบ)
- State::BATH (กำลังอาบน้ำเพลินๆ)
- State::RECOVERY (ช่วงพักเครื่องหลังอาบเสร็จ)
ส่วนค่าเวลาที่ต้องตั้งค่า (Definitions):
- MAX_WATER_TIME - เวลารวมที่น้ำไหลได้สูงสุดในหนึ่งรอบ (หน่วยเป็นวินาที)
- MAX_BATH_LENGTH - เวลาที่ยอมให้ยืนแช่ในห้องน้ำได้นานสุด (หน่วยเป็นวินาที)
- WARN_TIME - เวลาเตือนก่อนจะตัดน้ำ (หน่วยเป็นวินาที)
- RECOVERY_TIME - เวลาพักเครื่องห้ามใครอาบต่อทันที (หน่วยเป็นนาที)
- TRANSITION_TIME - ช่วงเวลาหน่วงก่อนเปลี่ยนจาก IDLE เป็น BATH (หน่วยเป็นวินาที)
นอกจากนี้ยังมี FLOW_THRESHOLD เอาไว้ตั้งค่าความแรงน้ำขั้นต่ำที่จะให้ระบบเริ่มนับว่ามีคนอาบน้ำจริงๆ (ป้องกันกรณีน้ำหยดหรือ residual flow แล้วระบบทำงานมั่ว)
ค่าพวกนี้วัยรุ่นไปปรับแต่ง (Tune) ในบอร์ด Arduino เองได้ง่ายๆ เลยนะ
3.1 - ขั้นตอนการทำงาน (Program Flow)
ตอนแรกเครื่องจะอยู่ที่สถานะ IDLE คอยวัดการไหลน้ำด้วยความถี่ 1Hz ถ้า Flow Sensor จับได้ว่าน้ำไหลแรงกว่าค่า FLOW_THRESHOLD มันจะเริ่มนับเวลา ถ้าผ่านไปจนครบ TRANSITION_TIME แล้วน้ำยังไหลอยู่ มันถึงจะเข้าสู่สถานะ BATH ที่ทำแบบนี้เพราะป้องกันกรณีเราแค่เปิดน้ำล้างหน้าหรือล้างห้องน้ำแป๊บเดียว ระบบจะได้ไม่รันมั่วซั่วไงล่ะ
พอเข้าสู่สถานะ BATH แล้ว มันจะโดดไปสถานะ RECOVERY (ตัดน้ำ) ก็ต่อเมื่อเจอเงื่อนไขอย่างใดอย่างหนึ่งดังนี้:
- ยืนแช่ในห้องน้ำนานเกินค่า MAX_BATH_LENGTH
- เปิดน้ำทิ้งไว้นานเกินค่า MAX_WATER_TIME (นับเฉพาะตอนน้ำไหล)
อย่าลืมนะน้อง เวลาที่น้ำไหลจริงๆ จะรวมช่วง TRANSITION_TIME เข้าไปด้วยนะ
และก่อนจะโดดไปตัดน้ำ ระบบจะมีการเตือนก่อนเสมอ! ในช่วงท้ายของสถานะ BATH (ตามเวลา WARN_TIME) เจ้า Buzzer จะดัง "ติ๊ดๆ" และ LED สีเขียวจะกะพริบรัวๆ เป็นสัญญาณบอกว่า "เฮ้ย! ใกล้หมดเวลาสนุกแล้วนะน้อง!"
3.2 - ผังงาน (Flowchart)
สรุปการทำงานของโค้ดให้ดูง่ายๆ ตาม Flowchart นี้เลย:

4 - การตั้งค่าสำหรับผู้ใช้งาน
พารามิเตอร์ที่พี่บอกไปข้างบน น้องเข้าไปแก้ได้ง่ายๆ ในไฟล์ `main.ino` ตรงส่วนที่เขียนว่า `USER DEFINITIONS` ที่อยู่ต้นๆ ไฟล์เลย
แก้เสร็จแล้วก็อย่าลืม Re-upload ลงบอร์ด Arduino ด้วยล่ะ ไม่งั้นค่าไม่เปลี่ยนนะวัยรุ่น
5 - ผลงานของพี่ (My implementation)
มาดูรูปงานที่พี่ประกอบเสร็จแล้วเป็นแนวทางนะ
พี่จับเอา Arduino, Breadboard, Power Supply และสายไฟทั้งหมด ยัดลงกล่องกันน้ำให้เรียบร้อย เจาะรูเล็กๆ 2 รูไว้โชว์ LED และอีกรูให้เสียง Buzzer มันลอดออกมาได้ ส่วน Solenoid Valve กับ Flow Sensor ก็เอาไปต่อเข้ากับระบบท่อน้ำอุ่นตามรูปข้างล่างนี้เลย หล่อเท่ไหมล่ะ!


6 - ช่องทางการติดต่อ
ถ้ามีคำถาม สงสัยตรงไหน หรืออยากให้พี่ช่วยดูโปรเจกต์ Arduino ตัวนี้เพิ่มเติม ทักมาคุยกันได้ (แต่อย่ารัวนะ พี่ทำงานอยู่):
Rodrigo Oliveira
- GitHub: [https://github.com/rodrigo-moliveira]
- LinkedIn [https://www.linkedin.com/in/rodrigo-moroliveira/]
พี่พยายามจะเข้ามาตอบให้ไวที่สุดนะน้อง ถ้าเจอ Bug หรือมีไอเดียเจ๋งๆ อยากพัฒนาต่อ ก็ไปเปิด Issue ใน GitHub ไว้ได้เลย เดี๋ยวพี่ตามไปดู
ขอบใจที่สนใจโปรเจกต์นี้ จัดไปวัยรุ่น!
รายละเอียดทางเทคนิคเพิ่มเติม (ฉบับเจาะลึก)
ตรรกะการจัดการน้ำ (Water Management Logic)
ระบบ Smart Shower Control ตัวนี้ออกแบบมาเพื่อลดการสิ้นเปลืองน้ำและคุมประสบการณ์การอาบน้ำให้เป๊ะที่สุด
- Sensors: ใช้ Flow Sensor (YF-S201) วัดอัตราการไหลแบบ Real-time และมีเซนเซอร์อุณหภูมิ DS18B20 ไว้คอยเช็กความร้อนของน้ำด้วย
- Automation: ใช้ Electromagnetic Solenoid Valve ทำหน้าที่เป็นมือมืดคอยสั่งตัดน้ำอัตโนมัติ ถ้าปริมาณน้ำรวมถึงเกณฑ์ (เช่น 50 ลิตร) หรือใช้เวลาเกินกำหนด