ผมต้องการสร้างระบบรดน้ำต้นไม้อัตโนมัติสำหรับการใช้งานกลางแจ้งบนดาดฟ้า โดยมีข้อกำหนดหลักดังนี้:
ติดตั้งง่ายและดูเป็นระเบียบ (High "Wife Acceptance Factor"):
- ไม่มีสายไฟหรือการเดินสายเคเบิล
- ใช้แรงดันน้ำต่ำและใช้สายยางขนาดเล็กไปยังสถานีรดน้ำแต่ละจุด
ใช้งานง่ายในชีวิตประจำวัน:
- ไม่ต้องบำรุงรักษาหรือเปลี่ยนแบตเตอรี่
- ตรวจสอบและควบคุมผ่าน App ได้
- ต้องทำงานได้ด้วยตัวเองอย่างน้อย 3 สัปดาห์ (ระหว่างช่วงหยุดยาว) แต่ถ้าจะให้ดีควรทำงานได้ตลอดทั้งฤดูร้อน
ขยายระบบได้ง่าย (รองรับหลายอุปกรณ์):
หมายเหตุ: เอกสาร Word ที่อยู่ใน GitHub ที่นี่ (link) ให้รายละเอียดได้ดีกว่า "เนื้อเรื่อง" ในที่นี้ เนื่องจาก ProjectHub ไม่อนุญาตให้จัดรูปแบบได้มากนัก
รูปที่ 2 อุปกรณ์ตัวสมบูรณ์ - ขณะถอดประกอบ
รูปที่ 4 ตัว Android app3 แนวทางการออกแบบโดยรวม (Overall Design drivers)
จากลักษณะการใช้งานหลัก จึงได้ตัดสินใจเลือกส่วนประกอบของระบบดังนี้:
ใช้ Solar panel เพื่อจ่ายไฟให้กับแบตเตอรี่ Li-Ion
ใช้แรงดันน้ำต่ำเพื่อให้สามารถใช้:
- สายยางขนาดเล็ก (ดูสวยงามกว่า ติดตั้งง่าย และลดความเสี่ยงที่น้ำจะรั่วไหลปริมาณมากหากสายยางแตก)
- Solenoid valve ที่ใช้พลังงานต่ำ
Arduino WeMos D1 Mini
- ใช้พลังงานต่ำ (Low power)
- มี I/O เพียงพอต่อการใช้งาน
- มีฐานข้อมูลความรู้ใน Community จำนวนมาก
- มีประสบการณ์ในการใช้งานอุปกรณ์เหล่านี้อยู่แล้ว
ระบบ Cloud based + App
- ไม่จำเป็นต้องให้อุปกรณ์ Online ตลอดเวลา (ช่วยประหยัดพลังงาน และทำงานได้ด้วยตัวเอง)
- เก็บข้อมูล Telemetry เมื่อระบบ Online
- ช่วยให้สามารถตรวจสอบและควบคุมอุปกรณ์ (ผ่าน App) ผ่านอินเทอร์เน็ตได้โดยที่อุปกรณ์ไม่จำเป็นต้อง Online ตลอดเวลา (คำสั่งจะถูกเก็บไว้ใน Cloud)
ออกแบบกล่อง 3D printed เอง
- เป็นวิธีที่เล็กและถูกที่สุด...และสนุกที่สุด เพราะผมจะได้ใช้งานเครื่องพิมพ์ของผมด้วย
Android app
- ผมมีโทรศัพท์และ Tablet ระบบ Android
- น่าจะเป็นวิธีที่ง่ายที่สุดในการรวมเข้ากับ Google Cloud
4 ภาพรวมของระบบ (System overview)
รูปที่ 5 ภาพรวมของระบบ5 Hardware & PCB
PCB ที่ประกอบแล้ว5.1 เครื่องมือ (Tools)
Hardware และ PCB ทั้งหมดออกแบบโดยใช้ KiCAD ไฟล์ทั้งหมดสามารถพบได้ใน GIT
ไฟล์โปรเจกต์: “irrigation v5.3.pro”
หมายเหตุ: ในขณะที่เขียนนี้ ผมได้ทำเวอร์ชัน 6.0 ออกมาแล้ว แต่ยังไม่ได้พิมพ์ PCB และทดสอบ ซึ่งสามารถดูได้ในภาคผนวก
เวอร์ชัน 5.3 ได้ถูกนำไปใช้งานจริงมาแล้วหนึ่งฤดูร้อนและทำงานได้ดี ส่วนเวอร์ชัน 6.0 จะเป็นการปรับปรุงการแปลงพลังงาน (Power conversion) ซึ่งในเวอร์ชัน 5.3 ค่อนข้างยุ่งยาก แต่ไม่มีการเปลี่ยนแปลงที่ส่งผลต่อ Software
5.2 ภาพรวม (Overview)
รูปที่ 6 ภาพรวม Hardwareโมดูล Hardware ทั้งหมดอยู่บน PCB เดียวกัน ยกเว้น:
- Soil moisture probe (เซนเซอร์วัดความชื้นในดิน)
- Valve และ Valve driver (ซึ่งเป็นตัวแปลง 5V => 12V) โดย Valve และ Driver จะมีกล่อง 3D printed ของตัวเอง เพื่อให้สะดวกในการปักลงในดินแยกจากตัว Probe
- แบตเตอรี่ Lithium และ Solar panel ทั้งคู่จะเชื่อมต่อกับหน่วยชาร์จ (Charge unit) ซึ่งจะทำหน้าที่ชาร์จแบตเตอรี่เมื่อทำได้ และจ่ายไฟ Output 5V สำหรับอุปกรณ์
5.3 ส่วนประกอบ (Components)
รูปที่ 7 ส่วนประกอบทั้งหมด (ใช้ PCB เพียง 1 แผ่น) (ในภาพยังขาด Soil sensor)สามารถดูได้ในไฟล์: irrigation v5.3.html (ฉบับแก้ไข)
5.4 วงจร (Schematics)
ดูได้ในไฟล์: irrigation v5.3.sch
รูปที่ 8 วงจรไฟฟ้า5.5 PCB layout
ผู้ผลิต: https://firstpcb.com/
ดูได้ในไฟล์: irrigation v5.3.kicad_pcb
แผ่น PCB ทั้งสองด้าน
รูปที่ 9 PCB layout5.6 ข้อควรพิจารณาและหมายเหตุ
หากต้องการทำให้เล็กลงกว่านี้มาก วิธีแรกคือการเลิกใช้บอร์ดโมดูลต่างๆ และใช้เฉพาะตัวอุปกรณ์ (Components) ลงบนบอร์ดโดยตรง อย่างไรก็ตาม วิธีนี้ต้องใช้เวลาทำงานค่อนข้างมากและถือว่าไม่คุ้มค่าเหนื่อย
5.7 การส่งออก PCB เพื่อสั่งพิมพ์
5.7.1 การส่งออกเป็นไฟล์ Gerber
ผลลัพธ์ที่ได้ควรเป็นชุดไฟล์ดังต่อไปนี้:
ไปที่ File -> Plot
หมายเหตุ: ค่าที่ตั้งไว้อาจไม่ตรงกับค่าที่ถูกต้องทุกประการในภาพด้านล่าง
การเจาะรู (Drill holes):
6 การไหลของข้อมูลและโครงสร้างข้อมูลระดับสากล (Data flow & global data structure)
หมายเหตุ: Firebase เป็นฐานข้อมูลแบบ JSON หมายความว่าไม่ได้จัดโครงสร้างเป็นตาราง (เหมือนฐานข้อมูลเชิงสัมพันธ์ทั่วไป)
6.1 การไหลของข้อมูลในระบบ (System Data Flow)
6.2 โครงสร้างข้อมูล (Data structure)
ตารางสามารถพบได้ใน repo ภายใต้โฟลเดอร์ docs/ ในเอกสาร Word7 Google Firebase Cloud
เราใช้ Google Firebase Realtime database เป็นระบบ Cloud
7.1 การตั้งค่า (Configuration)
1. ไปที่ https://console.firebase.google.com/
2. ลงชื่อเข้าใช้งานหากจำเป็น
3. สร้างโปรเจกต์: Create project
- i. โปรดทราบว่าชื่อนี้จะถูกนำไปใช้ในโค้ด Arduino (FIREBASE_HOST)
- ii. โค้ด Android (FB_PROJECT_ID) + ใน app/google-services.json
4. เปิดใช้งานการทดลองใช้ฟรีหากจำเป็น
5. เลือก Develop => Database
6. เลือกสร้าง Realtime Database ใหม่ (ไม่ใช่ Cloud Firestore) เริ่มต้นใน Test mode แต่ควรเปลี่ยนในภายหลัง
6.1.1 Auth tokens (Database secrets)
ไปที่ Project overview -> Settings -> Service accounts
แสดงและคัดลอก “secret” เพื่อนำไปใส่ในโค้ด Arduino (โดยทั่วไปจะเรียกว่า FIREBASE_AUTH)
7.2 ลิงก์ที่เกี่ยวข้อง
https://github.com/GoogleCloudPlatform/google-cloud-iot-arduino
https://console.cloud.google.com/home/dashboard?project=cohesive-photon-227011
https://console.cloud.google.com/iot/registries?project=cohesive-photon-227011&folder&organizationId&pli=1
https://console.cloud.google.com/iot/registries?project=autoirrigation&orgonly=true&supportedpurview=organizationId&walkthrough_tutorial_id=iot_core_quickstart
8 ซอฟต์แวร์ควบคุม Arduino
8.1 คุณสมบัติ (Features)
ซอฟต์แวร์ Arduino มีคุณสมบัติดังนี้:
การจัดการ Wifi
- อุปกรณ์จะค้นหา Hotspot ที่กำหนดไว้ล่วงหน้า และเชื่อมต่อกับตัวแรกที่มีความแรงของสัญญาณเกินเกณฑ์ที่ตั้งไว้ (เพื่อประหยัดพลังงาน เราจะไม่เชื่อมต่อกับ Hotspot ที่สัญญาณอ่อนมาก)
- มันจะจดจำ Hotspot ล่าสุดที่ใช้งานได้ดี ซึ่งช่วยให้สามารถย้ายอุปกรณ์ไปมาระหว่างสำนักงานและสวนได้
การจัดการ Deep sleep โดยใช้
- การตื่นตามเวลาที่กำหนด (Timed wakeup) มีการตั้งเวลา 3 ครั้งต่อวัน
- การตื่นเป็นระยะ (Periodic wake-up): ตั้งเวลาจนกว่าจะถึงการตื่นครั้งถัดไป
การจัดการหน่วยความจำถาวร (Persistent memory)
- รักษาข้อมูลการตั้งค่าให้ตรงกับใน Cloud เมื่อตื่นขึ้นมา จะอ่านค่าการตั้งค่าเพื่อดูว่าผู้ใช้มีการเปลี่ยนแปลงหรือไม่ ระหว่างการทำงาน ค่าการตั้งค่าบางอย่างอาจถูกเปลี่ยนและ Upload กลับไปที่ Cloud
- การตั้งค่าที่ใช้ภายในอุปกรณ์เท่านั้น เช่น รหัสผ่าน Wifi ล่าสุดที่ใช้งานได้
การทำ Multiplexing ของสัญญาณ Analog input
- อุปกรณ์สามารถควบคุม Multiplexer เพื่อให้อ่านค่าจาก Sensor หลายตัวได้ เนื่องจาก D1 mini มี Analog port เพียงพอร์ตเดียว
- คุณสมบัตินี้ยังควบคุมการจ่ายไฟให้กับ Sensor ด้วย (เพื่อให้ Sensor ใช้พลังงานเฉพาะตอนที่วัดค่าเท่านั้น)
การสื่อสาร Cloud ที่ปลอดภัย
- มีฟังก์ชันสำหรับสื่อสารกับ Firebase, Azure และ Google Cloud ซึ่ง Cloud แต่ละเจ้ามีข้อดีและข้อเสียต่างกัน โดยสามารถควบคุมได้ในขั้นตอนการ Compile
8.2 ส่วนประกอบของซอฟต์แวร์ (Software Components)
Globals (globals, firebasemodel)
- ประเภทและโครงสร้างข้อมูลระดับ Global
- ชื่อคงที่และค่าคงที่ระดับ Global
การตั้งค่าและการควบคุมหลัก (autoirrigation.ino)
- การตั้งค่าในขั้นตอน Compile time
- การตั้งค่าในขั้นตอน Runtime
- ข้อมูลการยืนยันตัวตน (Authentication)
- โหมดการทำงาน (Test modes)
- ประเภทของอุปกรณ์ (ผมกำลังพัฒนา Sensor ตรวจจับก๊าซ CO อยู่ด้วย แต่ยังไม่เสร็จ)
- การสื่อสารทั้งหมดไปยัง Cloud (หมายเหตุ: มีซอฟต์แวร์ที่ใช้งานได้สำหรับทั้ง Azure และ Google Cloud)
พลังงานและการหลับ (Power & Sleep - deepsleephandler)
หน่วยความจำถาวร (Persistent storage - persistentmemory)
- ควบคุมหน่วยความจำถาวรภายในของ D1 โดยทำหน้าที่เก็บข้อมูลให้ตรงกับใน Firebase
เซนเซอร์ (Sensors - analogmux, sensorhandler, soilhumiditysensor, watersensor, voltmeter, gassensor)
- การตั้งค่า (Sensor แต่ละชนิดสามารถใช้งานในรูปแบบที่ต่างกันได้)
- การเริ่มต้นระบบ (initialization)
อุปกรณ์ขับเคลื่อน (Actuators - watervalve, LEDhandler)
- การตั้งค่าและลิงก์ไปยัง Sensor
- การเริ่มต้นระบบ (Initialization)
การจัดการ Wifi (Wifi mgt - wifi_nnr, wifihandler)
- การเริ่มต้นระบบ (Initialization)
- การเชื่อมต่อ (connectivity)
การสื่อสาร Cloud (รวมอยู่ใน autoirrigation.ino)
- การเชื่อมต่อ (connection)
8.3 เครื่องมือและการตั้งค่า
- Visual Studio Community 2019
8.3.1 การตั้งค่า vMicro extension
8.3.2 การ Upload ลงบอร์ด – ปัญหาและคำแนะนำ
มีสองสิ่งที่อาจทำให้เกิดปัญหาขณะ Upload:
- อย่าลืมกดปุ่ม “flash” เล็กๆ ก่อนทำการ Flash และต้อง “ปล่อย” ปุ่มเมื่อ Flash เสร็จ มิฉะนั้นบอร์ดจะไม่ Reset ซึ่งอาจจะเจอข้อความแจ้งเตือนว่า “The uploader process failed”
- หากบอร์ดอยู่ในช่วงการหลับ (Sleep) ต่อเนื่อง มันจะตื่นขึ้นมาแล้วกลับไปหลับทันทีทุกครั้งที่ Reset จนกว่าตัวนับเวลาจะถึงเป้าหมาย (เป็นศูนย์) คุณสามารถติดตามสิ่งนี้ได้ในหน้าต่าง Serial output ปิดการใช้งานนี้ได้โดยปิด UseSleepMode
รูปที่ 1 คุณสมบัติ Sleep อาจเป็นอุปสรรคขณะทำการ Debug- หากแรงดันแบตเตอรี่ต่ำเกินไป บอร์ดจะเข้าสู่โหมด Sleep ทันที ซึ่งอาจทำให้เกิด Crash dump ได้ ไม่แน่ใจว่าทำไมแต่มันมักจะเป็นแบบนี้ หากเกิดขึ้นให้รีบชาร์จแบตเตอรี่
รูปที่ 2 ข้อความที่จะปรากฏเมื่อแบตเตอรี่หมด8.4 คุณสมบัติในอนาคต:
การอัปเดตแบบ OTA (Over-the-air update) จะเป็นสิ่งที่ดีมาก โดยเฉพาะอย่างยิ่งเพราะอุปกรณ์เหล่านี้ถูกวางไว้กลางแจ้งในดิน
9 Android App
ผมอาจใช้คำศัพท์ผิดไปบ้างเพราะไม่ค่อยคุ้นเคยกับ Android แต่ App ง่ายๆ นี้สามารถทำงานได้
หน้าจอเปิดแอป
รายละเอียดของอุปกรณ์ชิ้นหนึ่ง9.1 คุณสมบัติ (Features)
- เชื่อมต่อกับ Firebase เพื่ออ่านและเขียนข้อมูล
9.2 ภาพรวม (Overview)
หน้าหลัก (Main layout):
- รายการอุปกรณ์ทั้งหมดใน Firebase พร้อมข้อมูลสำคัญและรหัสสีระบุสถานะ
หน้าอุปกรณ์เดียว (Single device layout)
- แสดงการตั้งค่าที่เกี่ยวข้องทั้งหมด (สีเหลือง) และข้อมูล Telemetry ของอุปกรณ์นั้นๆ
- มีตัวเลือกสำหรับล้างข้อมูล (Purge) ทั้ง Telemetry และ Log (เนื่องจากหากมีข้อมูลจำนวนมาก ผมยังไม่พบวิธีล้างข้อมูลผ่านหน้าเว็บ Firebase โดยตรง)
บริการเบื้องหลัง (Background service)
- รักษาการเชื่อมต่อระหว่าง Interface กับ Firebase และข้อมูล
9.3 การตั้งค่า (Configuration)
รับไฟล์การตั้งค่า google-services.json ได้จาก: https://support.google.com/firebase/answer/7015592?hl=en
9.4 เครื่องมือ (Tools)
ใช้ Android Studio
10 ข้ามแพลตฟอร์ม: การเพิ่มฟิลด์ใหม่ในฐานข้อมูล
10.1 Arduino
โครงสร้างข้อมูลถูกกำหนดไว้ในไฟล์ซอร์สโค้ด:
- ฟังก์ชัน CreateTelemetryJson() จะเป็นตัวกำหนดข้อมูลที่จะส่งไป
10.2 Android
- ไฟล์ซอร์สโค้ดที่กำหนดโครงสร้างข้อมูลอยู่ที่ com.vanding.datamodel/
- FirebaseObject.java จะเป็นตัวรวบรวมข้อมูลนี้
- res/layout/content_main.xml และ content_single_device.xml จะเกี่ยวข้องกับส่วนที่แสดงผลทางสายตา
11 กล่องพิมพ์ 3D (3D printed case)
พลาสติกสีดำถ่ายรูปยากหน่อย แต่นี่คืออุปกรณ์ทั้ง 3 ชุดครับ11.1 ลำดับการออกแบบ
1. จำลองโมเดลส่วนประกอบ Hardware แต่ละชิ้น แยกเป็นโปรเจกต์ต่างหาก
2. Import ส่วนที่จำเป็นเข้ามา
3. จัดวางตำแหน่งตามที่ต้องการ
4. สร้างฐานและพื้น โดยอ้างอิงตำแหน่งจากส่วนประกอบที่นำเข้ามา
11.2 ส่วนประกอบหลัก
- ไฟล์ F3d: โมเดล 3D ของส่วนประกอบ Hardware ช่วยให้การลองจัดวางรูปแบบต่างๆ ทำได้ง่ายขึ้นมาก
- ไฟล์ F3z: การออกแบบตัวกล่องสำหรับหน่วยรดน้ำ ซึ่งมีการ Import โมเดล Hardware เข้ามาใส่
11.2.1 กล่องหลักสำหรับ PCB
ไฟล์: Irrigation unit – Main box (side mounted)
รูปที่ 10 กล่องหลัก
รูปที่ 11 กล่องหลักพร้อมโมเดล PCB และ Soil sensor11.2.2 กล่องส่วนบนพร้อม Solar panel
ไฟล์: Irrigation unit – Main box (side mounted)
รูปที่ 12 ฝาปิดกล่องหลัก
รูปที่ 13 ...พร้อม Solar panel11.2.3 กล่องสำหรับ Valve และ Valve driver
ไฟล์: Irrigation unit – valve box
รูปที่ 14 กล่องสำหรับ Valve และ Valve driver – มองจากด้านล่าง
รูปที่ 15...ขณะมีส่วนประกอบอยู่ภายใน11.3 ข้อควรพิจารณาและหมายเหตุ
หลักการคือทำให้ทนต่อฝนโดยใช้ความจริงที่ว่า “น้ำไม่ไหลย้อนขึ้นที่สูง” ดังนั้นมันจึงไม่ได้รับรองว่ากันน้ำหรือกันฝุ่นได้ 100% แต่สามารถทนต่อฝนตกหนักได้ ตราบใดที่อุปกรณ์ถูกติดตั้งลงในดินอย่างเหมาะสม
11.4 เครื่องมือ (Tools)
- เครื่องพิมพ์ 3D XYZWare Da Vinci Mini w
12 ระบบจ่ายน้ำทางกายภาพ (Physical Water supply)
ก๊อกน้ำปกติจะให้แรงดันน้ำสูงเกินไป ดังนั้นการลดแรงดันน้ำจึงเป็นเรื่องสำคัญมาก ซึ่งเป็นพื้นฐานสำหรับ:
- ลดความเสี่ยงที่น้ำจะรั่วไหลในกรณีที่เกิดความผิดปกติในจุดใดจุดหนึ่ง
- ลดการใช้พลังงาน เพราะแรงดันน้ำที่สูงขึ้นต้องใช้ Valve ที่แข็งแรงกว่าเดิม ซึ่งต้องการพลังงานมากขึ้นมาก
- ช่วยให้การติดตั้งดูเรียบง่ายขึ้น เช่น การใช้สายยางที่บางลง
12.1 Hardware
https://www.aliexpress.com/item/DN15-Adjustable-Brass-Water-Pressure-Reducing-Regulator-Valve-Internal-and-outer-thread-PN-1-6-and/32964829770.html
DN15 Adjustable Brass Water Pressure Reducing Regulator Valve Internal and outer thread PN 1.6 and Pressure Gauge.
- ประเภทการเชื่อมต่อ: เกลียวใน / เกลียวนอก
- 1 x Water Pressure Reducing Valve + ประแจ + เทปพันเกลียว
12.2 การปรับจูน
จากความจำของผม แรงดันน้ำควรอยู่ที่ประมาณ 0.1 Bar หากสูงเกินไป Valve จะไม่ทำงาน หากต่ำเกินไปจะใช้เวลารดน้ำนานเกินไป ซึ่งส่งผลให้การใช้พลังงานสูงขึ้น โดยปกติ Valve ที่เปิดค้างไว้จะใช้ไฟประมาณ ~10W (12V, 1A)
13 การใช้งานประจำวัน การติดตั้ง และการปรับจูน
13.1 การติดตั้ง
ความเหนื่อยในการสร้างจะคุ้มค่าเมื่อถึงขั้นตอนการติดตั้งที่ง่ายดาย:
- ติดตั้งอุปกรณ์แต่ละตัว ตั้งชื่ออุปกรณ์ให้ดี และอาจจะติดสติกเกอร์ไว้ด้านนอกเพื่อให้คุณจดจำอุปกรณ์ได้ด้วยสายตา
- ตรวจสอบให้แน่ใจว่า Wifi ใช้งานได้ ตรวจสอบความแรงของสัญญาณ
รูปที่ 1 ตัวเครื่องที่เสร็จสมบูรณ์ พร้อมสำหรับการ "ปัก" ลงในดิน14 ภาคผนวก A - Hardware & PCB เวอร์ชัน 6.0 – ยังไม่ได้ทดสอบ
เวอร์ชัน 6.0 เป็นการปรับปรุงการแปลงพลังงานให้ดีขึ้น ซึ่งในเวอร์ชัน 5.2 ค่อนข้างยุ่งยาก แต่ไม่มีการเปลี่ยนแปลงที่ส่งผลต่อ Software
15 ประวัติบันทึก (Log History)
15-dec-2019