You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/th/2-farm/lessons/3-automated-plant-watering/README.md

314 lines
50 KiB

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f7bb24ba53fb627ddb38a8b24a05e594",
"translation_date": "2025-08-27T22:10:59+00:00",
"source_file": "2-farm/lessons/3-automated-plant-watering/README.md",
"language_code": "th"
}
-->
# การรดน้ำต้นไม้อัตโนมัติ
![ภาพสเก็ตโน้ตของบทเรียนนี้](../../../../../translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.th.jpg)
> สเก็ตโน้ตโดย [Nitya Narasimhan](https://github.com/nitya) คลิกที่ภาพเพื่อดูเวอร์ชันขนาดใหญ่ขึ้น
บทเรียนนี้เป็นส่วนหนึ่งของ [โครงการ IoT สำหรับผู้เริ่มต้น โปรเจกต์ 2 - ชุดบทเรียนเกษตรดิจิทัล](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) จาก [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn)
[![การรดน้ำต้นไม้อัตโนมัติด้วย IoT](https://img.youtube.com/vi/g9FfZwv9R58/0.jpg)](https://youtu.be/g9FfZwv9R58)
## แบบทดสอบก่อนเรียน
[แบบทดสอบก่อนเรียน](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/13)
## บทนำ
ในบทเรียนที่ผ่านมา คุณได้เรียนรู้วิธีการตรวจสอบความชื้นในดิน ในบทเรียนนี้ คุณจะได้เรียนรู้วิธีสร้างส่วนประกอบหลักของระบบรดน้ำอัตโนมัติที่ตอบสนองต่อความชื้นในดิน นอกจากนี้ คุณยังจะได้เรียนรู้เกี่ยวกับการจัดการเวลา - เช่น การที่เซ็นเซอร์อาจใช้เวลาสักครู่ในการตอบสนองต่อการเปลี่ยนแปลง และแอคชูเอเตอร์อาจใช้เวลาในการเปลี่ยนแปลงคุณสมบัติที่เซ็นเซอร์วัดได้
ในบทเรียนนี้เราจะครอบคลุม:
* [การควบคุมอุปกรณ์ที่ใช้พลังงานสูงจากอุปกรณ์ IoT ที่ใช้พลังงานต่ำ](../../../../../2-farm/lessons/3-automated-plant-watering)
* [การควบคุมรีเลย์](../../../../../2-farm/lessons/3-automated-plant-watering)
* [การควบคุมต้นไม้ของคุณผ่าน MQTT](../../../../../2-farm/lessons/3-automated-plant-watering)
* [การจัดการเวลาในเซ็นเซอร์และแอคชูเอเตอร์](../../../../../2-farm/lessons/3-automated-plant-watering)
* [เพิ่มการจัดการเวลาในเซิร์ฟเวอร์ควบคุมต้นไม้ของคุณ](../../../../../2-farm/lessons/3-automated-plant-watering)
## การควบคุมอุปกรณ์ที่ใช้พลังงานสูงจากอุปกรณ์ IoT ที่ใช้พลังงานต่ำ
อุปกรณ์ IoT ใช้แรงดันไฟฟ้าต่ำ ซึ่งเพียงพอสำหรับเซ็นเซอร์และแอคชูเอเตอร์ที่ใช้พลังงานต่ำ เช่น LED แต่ไม่เพียงพอสำหรับการควบคุมฮาร์ดแวร์ขนาดใหญ่ เช่น ปั๊มน้ำที่ใช้ในการชลประทาน แม้แต่ปั๊มขนาดเล็กที่ใช้กับต้นไม้ในบ้านก็ยังใช้กระแสไฟฟ้ามากเกินไปสำหรับชุดพัฒนา IoT และอาจทำให้บอร์ดเสียหายได้
> 🎓 กระแสไฟฟ้า วัดเป็นแอมป์ (A) คือปริมาณไฟฟ้าที่ไหลผ่านวงจร แรงดันไฟฟ้าคือแรงผลักดัน ส่วนกระแสคือปริมาณที่ถูกผลัก คุณสามารถอ่านเพิ่มเติมเกี่ยวกับกระแสไฟฟ้าได้ที่ [หน้ากระแสไฟฟ้าบน Wikipedia](https://wikipedia.org/wiki/Electric_current)
วิธีแก้ปัญหาคือการเชื่อมต่อปั๊มกับแหล่งจ่ายไฟภายนอก และใช้แอคชูเอเตอร์เพื่อเปิดปั๊ม คล้ายกับการเปิดไฟด้วยสวิตช์ ใช้พลังงานเพียงเล็กน้อย (ในรูปของพลังงานในร่างกายของคุณ) เพื่อให้นิ้วของคุณกดสวิตช์ และสิ่งนี้จะเชื่อมต่อไฟกับไฟฟ้ากระแสหลักที่ทำงานที่ 110v/240v
![สวิตช์ไฟเปิดไฟ](../../../../../translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.th.png)
> 🎓 [ไฟฟ้ากระแสหลัก](https://wikipedia.org/wiki/Mains_electricity) หมายถึงไฟฟ้าที่ส่งไปยังบ้านและธุรกิจผ่านโครงสร้างพื้นฐานระดับประเทศในหลายส่วนของโลก
✅ อุปกรณ์ IoT มักจะให้แรงดันไฟฟ้า 3.3V หรือ 5V ที่กระแสน้อยกว่า 1 แอมป์ (1A) เมื่อเปรียบเทียบกับไฟฟ้ากระแสหลักที่มักจะอยู่ที่ 230V (120V ในอเมริกาเหนือ และ 100V ในญี่ปุ่น) และสามารถจ่ายพลังงานให้กับอุปกรณ์ที่ใช้กระแสไฟฟ้า 30A
มีแอคชูเอเตอร์หลายประเภทที่สามารถทำสิ่งนี้ได้ รวมถึงอุปกรณ์กลไกที่คุณสามารถติดตั้งกับสวิตช์ที่มีอยู่เพื่อเลียนแบบการเปิดสวิตช์ด้วยนิ้วมือ แต่ที่นิยมที่สุดคือรีเลย์
### รีเลย์
รีเลย์เป็นสวิตช์ไฟฟ้าเชิงกลที่แปลงสัญญาณไฟฟ้าให้เป็นการเคลื่อนไหวเชิงกลเพื่อเปิดสวิตช์ แกนหลักของรีเลย์คือแม่เหล็กไฟฟ้า
> 🎓 [แม่เหล็กไฟฟ้า](https://wikipedia.org/wiki/Electromagnet) คือแม่เหล็กที่สร้างขึ้นโดยการส่งกระแสไฟฟ้าผ่านขดลวด เมื่อกระแสไฟฟ้าเปิด ขดลวดจะกลายเป็นแม่เหล็ก เมื่อกระแสไฟฟ้าปิด ขดลวดจะสูญเสียคุณสมบัติแม่เหล็ก
![เมื่อเปิด แม่เหล็กไฟฟ้าสร้างสนามแม่เหล็ก เปิดสวิตช์สำหรับวงจรเอาต์พุต](../../../../../translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.th.png)
ในรีเลย์ วงจรควบคุมจะจ่ายพลังงานให้กับแม่เหล็กไฟฟ้า เมื่อแม่เหล็กไฟฟ้าทำงาน มันจะดึงคันโยกที่เคลื่อนสวิตช์ ปิดคู่หน้าสัมผัสและทำให้วงจรเอาต์พุตสมบูรณ์
![เมื่อปิด แม่เหล็กไฟฟ้าไม่สร้างสนามแม่เหล็ก ปิดสวิตช์สำหรับวงจรเอาต์พุต](../../../../../translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.th.png)
เมื่อวงจรควบคุมปิด แม่เหล็กไฟฟ้าจะหยุดทำงาน ปล่อยคันโยกและเปิดหน้าสัมผัส ปิดวงจรเอาต์พุต รีเลย์เป็นแอคชูเอเตอร์แบบดิจิทัล - สัญญาณสูงไปยังรีเลย์จะเปิดรีเลย์ สัญญาณต่ำจะปิดรีเลย์
วงจรเอาต์พุตสามารถใช้จ่ายพลังงานให้กับฮาร์ดแวร์เพิ่มเติม เช่น ระบบชลประทาน อุปกรณ์ IoT สามารถเปิดรีเลย์เพื่อทำให้วงจรเอาต์พุตสมบูรณ์ที่จ่ายพลังงานให้กับระบบชลประทาน และต้นไม้จะได้รับน้ำ จากนั้นอุปกรณ์ IoT สามารถปิดรีเลย์เพื่อตัดพลังงานไปยังระบบชลประทานและปิดน้ำ
![รีเลย์เปิดปั๊มเพื่อส่งน้ำไปยังต้นไม้](../../../../../images/strawberry-pump.gif)
ในวิดีโอด้านบน รีเลย์ถูกเปิด ไฟ LED บนรีเลย์สว่างขึ้นเพื่อแสดงว่ารีเลย์เปิดอยู่ (รีเลย์บางตัวมีไฟ LED เพื่อแสดงสถานะเปิดหรือปิด) และพลังงานถูกส่งไปยังปั๊ม ทำให้ปั๊มทำงานและสูบน้ำไปยังต้นไม้
> 💁 รีเลย์ยังสามารถใช้สลับระหว่างสองวงจรเอาต์พุตแทนที่จะเปิดหรือปิดวงจรเดียวได้ เมื่อคันโยกเคลื่อนที่ มันจะย้ายสวิตช์จากการทำให้วงจรเอาต์พุตหนึ่งสมบูรณ์ไปยังการทำให้วงจรเอาต์พุตอื่นสมบูรณ์ โดยปกติจะใช้การเชื่อมต่อพลังงานร่วมกันหรือการเชื่อมต่อกราวด์ร่วมกัน
✅ ทำการค้นคว้า: มีรีเลย์หลายประเภทที่มีความแตกต่าง เช่น วงจรควบคุมเปิดหรือปิดรีเลย์เมื่อจ่ายพลังงาน หรือมีวงจรเอาต์พุตหลายวงจร ค้นหาข้อมูลเกี่ยวกับรีเลย์ประเภทต่างๆ เหล่านี้
เมื่อคันโยกเคลื่อนที่ คุณมักจะได้ยินเสียงคลิกที่ชัดเจนเมื่อมันสัมผัสกับแม่เหล็กไฟฟ้า
> 💁 รีเลย์สามารถต่อสายเพื่อให้การเชื่อมต่อทำให้พลังงานไปยังรีเลย์ถูกตัด ซึ่งจะปิดรีเลย์ จากนั้นส่งพลังงานไปยังรีเลย์อีกครั้งเพื่อเปิดใหม่ และทำซ้ำเช่นนี้ต่อไป สิ่งนี้ทำให้รีเลย์คลิกอย่างรวดเร็วมากจนเกิดเสียงหึ่งๆ นี่คือวิธีการทำงานของกริ่งไฟฟ้าบางประเภทในอดีต
### พลังงานของรีเลย์
แม่เหล็กไฟฟ้าไม่ต้องการพลังงานมากในการทำงานและดึงคันโยก มันสามารถควบคุมได้โดยใช้แรงดันไฟฟ้า 3.3V หรือ 5V จากชุดพัฒนา IoT วงจรเอาต์พุตสามารถรองรับพลังงานได้มากขึ้น ขึ้นอยู่กับรีเลย์ รวมถึงแรงดันไฟฟ้ากระแสหลักหรือระดับพลังงานที่สูงขึ้นสำหรับการใช้งานในอุตสาหกรรม ด้วยวิธีนี้ ชุดพัฒนา IoT สามารถควบคุมระบบชลประทานได้ ตั้งแต่ปั๊มขนาดเล็กสำหรับต้นไม้ต้นเดียว ไปจนถึงระบบอุตสาหกรรมขนาดใหญ่สำหรับฟาร์มเชิงพาณิชย์ทั้งหมด
![รีเลย์ Grove พร้อมวงจรควบคุม วงจรเอาต์พุต และรีเลย์ที่มีป้ายกำกับ](../../../../../translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.th.png)
ภาพด้านบนแสดงรีเลย์ Grove วงจรควบคุมเชื่อมต่อกับอุปกรณ์ IoT และเปิดหรือปิดรีเลย์โดยใช้แรงดันไฟฟ้า 3.3V หรือ 5V วงจรเอาต์พุตมีสองขั้ว ซึ่งขั้วใดขั้วหนึ่งสามารถเป็นพลังงานหรือกราวด์ วงจรเอาต์พุตสามารถรองรับได้ถึง 250V ที่ 10A เพียงพอสำหรับอุปกรณ์ที่ใช้พลังงานจากไฟฟ้ากระแสหลักหลากหลายประเภท คุณยังสามารถหารีเลย์ที่รองรับระดับพลังงานที่สูงกว่านี้ได้
![ปั๊มที่ต่อสายผ่านรีเลย์](../../../../../translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.th.png)
ในภาพด้านบน พลังงานถูกจ่ายให้กับปั๊มผ่านรีเลย์ มีสายสีแดงเชื่อมต่อขั้ว +5V ของแหล่งจ่ายไฟ USB กับขั้วหนึ่งของวงจรเอาต์พุตของรีเลย์ และสายสีแดงอีกเส้นเชื่อมต่อขั้วอีกขั้วของวงจรเอาต์พุตกับปั๊ม สายสีดำเชื่อมต่อปั๊มกับกราวด์ของแหล่งจ่ายไฟ USB เมื่อรีเลย์เปิด มันจะทำให้วงจรสมบูรณ์ ส่ง 5V ไปยังปั๊ม ทำให้ปั๊มทำงาน
## การควบคุมรีเลย์
คุณสามารถควบคุมรีเลย์จากชุดพัฒนา IoT ของคุณ
### งาน - ควบคุมรีเลย์
ทำตามคำแนะนำที่เกี่ยวข้องเพื่อควบคุมรีเลย์โดยใช้อุปกรณ์ IoT ของคุณ:
* [Arduino - Wio Terminal](wio-terminal-relay.md)
* [คอมพิวเตอร์บอร์ดเดี่ยว - Raspberry Pi](pi-relay.md)
* [คอมพิวเตอร์บอร์ดเดี่ยว - อุปกรณ์เสมือน](virtual-device-relay.md)
## การควบคุมต้นไม้ของคุณผ่าน MQTT
จนถึงตอนนี้ รีเลย์ของคุณถูกควบคุมโดยอุปกรณ์ IoT โดยตรงจากการอ่านค่าความชื้นในดินเพียงครั้งเดียว ในระบบชลประทานเชิงพาณิชย์ ตรรกะการควบคุมจะถูกกระจายศูนย์กลาง เพื่อให้สามารถตัดสินใจเรื่องการรดน้ำโดยใช้ข้อมูลจากเซ็นเซอร์หลายตัว และสามารถเปลี่ยนการตั้งค่าทั้งหมดได้ในที่เดียว เพื่อจำลองสิ่งนี้ คุณสามารถควบคุมรีเลย์ผ่าน MQTT
### งาน - ควบคุมรีเลย์ผ่าน MQTT
1. เพิ่มไลบรารี MQTT/pip packages และโค้ดที่เกี่ยวข้องในโปรเจกต์ `soil-moisture-sensor` ของคุณเพื่อเชื่อมต่อกับ MQTT ตั้งชื่อ Client ID ว่า `soilmoisturesensor_client` โดยเพิ่มคำนำหน้าด้วย ID ของคุณ
> ⚠️ คุณสามารถอ้างอิง [คำแนะนำสำหรับการเชื่อมต่อกับ MQTT ในโปรเจกต์ 1 บทเรียน 4 หากจำเป็น](../../../1-getting-started/lessons/4-connect-internet/README.md#connect-your-iot-device-to-mqtt)
1. เพิ่มโค้ดอุปกรณ์ที่เกี่ยวข้องเพื่อส่งข้อมูลเทเลเมทรีพร้อมการตั้งค่าความชื้นในดิน สำหรับข้อความเทเลเมทรี ให้ตั้งชื่อพร็อพเพอร์ตี้ว่า `soil_moisture`
> ⚠️ คุณสามารถอ้างอิง [คำแนะนำสำหรับการส่งข้อมูลเทเลเมทรีไปยัง MQTT ในโปรเจกต์ 1 บทเรียน 4 หากจำเป็น](../../../1-getting-started/lessons/4-connect-internet/README.md#send-telemetry-from-your-iot-device)
1. สร้างโค้ดเซิร์ฟเวอร์ในเครื่องเพื่อสมัครรับข้อมูลเทเลเมทรีและส่งคำสั่งเพื่อควบคุมรีเลย์ในโฟลเดอร์ที่ชื่อว่า `soil-moisture-sensor-server` ตั้งชื่อพร็อพเพอร์ตี้ในข้อความคำสั่งว่า `relay_on` และตั้ง Client ID ว่า `soilmoisturesensor_server` โดยเพิ่มคำนำหน้าด้วย ID ของคุณ รักษาโครงสร้างเดียวกับโค้ดเซิร์ฟเวอร์ที่คุณเขียนในโปรเจกต์ 1 บทเรียน 4 เนื่องจากคุณจะเพิ่มโค้ดนี้ในภายหลังในบทเรียนนี้
> ⚠️ คุณสามารถอ้างอิง [คำแนะนำสำหรับการส่งข้อมูลเทเลเมทรีไปยัง MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#write-the-server-code) และ [การส่งคำสั่งผ่าน MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#send-commands-to-the-mqtt-broker) ในโปรเจกต์ 1 บทเรียน 4 หากจำเป็น
1. เพิ่มโค้ดอุปกรณ์ที่เกี่ยวข้องเพื่อควบคุมรีเลย์จากคำสั่งที่ได้รับ โดยใช้พร็อพเพอร์ตี้ `relay_on` จากข้อความ ส่งค่า true สำหรับ `relay_on` หาก `soil_moisture` มีค่ามากกว่า 450 มิฉะนั้นส่งค่า false เช่นเดียวกับตรรกะที่คุณเพิ่มสำหรับอุปกรณ์ IoT ก่อนหน้านี้
> ⚠️ คุณสามารถอ้างอิง [คำแนะนำสำหรับการตอบสนองต่อคำสั่งจาก MQTT ในโปรเจกต์ 1 บทเรียน 4 หากจำเป็น](../../../1-getting-started/lessons/4-connect-internet/README.md#handle-commands-on-the-iot-device)
> 💁 คุณสามารถหาโค้ดนี้ได้ในโฟลเดอร์ [code-mqtt](../../../../../2-farm/lessons/3-automated-plant-watering/code-mqtt)
ตรวจสอบให้แน่ใจว่าโค้ดกำลังทำงานบนอุปกรณ์และเซิร์ฟเวอร์ในเครื่องของคุณ และทดสอบโดยการเปลี่ยนระดับความชื้นในดิน ไม่ว่าจะโดยการเปลี่ยนค่าที่ส่งโดยเซ็นเซอร์เสมือน หรือโดยการเปลี่ยนระดับความชื้นในดินโดยการเติมน้ำหรือถอดเซ็นเซอร์ออกจากดิน
## การจัดการเวลาในเซ็นเซอร์และแอคชูเอเตอร์
ในบทเรียนที่ 3 คุณได้สร้างไฟกลางคืน - ไฟ LED ที่เปิดทันทีเมื่อเซ็นเซอร์วัดระดับแสงต่ำได้ เซ็นเซอร์แสงตรวจจับการเปลี่ยนแปลงของระดับแสงได้ทันที และอุปกรณ์สามารถตอบสนองได้อย่างรวดเร็ว โดยจำกัดเพียงความยาวของดีเลย์ในฟังก์ชัน `loop` หรือ `while True:` ในฐานะนักพัฒนา IoT คุณไม่สามารถพึ่งพาวงจรตอบสนองที่รวดเร็วเช่นนี้ได้เสมอไป
### การจัดการเวลาสำหรับความชื้นในดิน
หากคุณทำบทเรียนที่แล้วเกี่ยวกับความชื้นในดินโดยใช้เซ็นเซอร์จริง คุณอาจสังเกตเห็นว่าค่าความชื้นในดินใช้เวลาสองสามวินาทีในการลดลงหลังจากที่คุณรดน้ำต้นไม้ นี่ไม่ใช่เพราะเซ็นเซอร์ช้า แต่เพราะน้ำใช้เวลาในการซึมผ่านดิน
💁 หากคุณรดน้ำใกล้กับเซ็นเซอร์มากเกินไป คุณอาจสังเกตเห็นค่าการอ่านลดลงอย่างรวดเร็วแล้วกลับขึ้นมาอีกครั้ง - สิ่งนี้เกิดจากน้ำที่อยู่ใกล้เซ็นเซอร์กระจายไปทั่วดินส่วนที่เหลือ ทำให้ความชื้นในดินบริเวณเซ็นเซอร์ลดลง
![การวัดความชื้นในดินที่แสดงค่า 658 ไม่เปลี่ยนแปลงระหว่างการรดน้ำ และลดลงเหลือ 320 หลังจากน้ำซึมผ่านดิน](../../../../../translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.th.png)
ในภาพด้านบน การวัดความชื้นในดินแสดงค่า 658 เมื่อรดน้ำ ค่าอ่านนี้จะไม่เปลี่ยนแปลงทันที เนื่องจากน้ำยังไม่ถึงเซ็นเซอร์ การรดน้ำอาจเสร็จสิ้นก่อนที่น้ำจะถึงเซ็นเซอร์ และค่าจะลดลงเพื่อสะท้อนระดับความชื้นใหม่
หากคุณกำลังเขียนโค้ดเพื่อควบคุมระบบชลประทานผ่านรีเลย์โดยอิงจากระดับความชื้นในดิน คุณจำเป็นต้องคำนึงถึงความล่าช้านี้และสร้างการตั้งเวลาที่ชาญฉลาดยิ่งขึ้นในอุปกรณ์ IoT ของคุณ
✅ ลองคิดดูว่าคุณจะทำสิ่งนี้ได้อย่างไร
### ควบคุมการตั้งเวลาของเซ็นเซอร์และตัวกระตุ้น
ลองจินตนาการว่าคุณได้รับมอบหมายให้สร้างระบบชลประทานสำหรับฟาร์ม โดยพิจารณาจากประเภทของดิน ระดับความชื้นในดินที่เหมาะสมที่สุดสำหรับพืชที่ปลูกนั้นพบว่าตรงกับการอ่านแรงดันไฟฟ้าแบบแอนะล็อกที่ 400-450
คุณสามารถเขียนโปรแกรมอุปกรณ์ในลักษณะเดียวกับไฟกลางคืนได้ - ตลอดเวลาที่เซ็นเซอร์อ่านค่าได้มากกว่า 450 ให้เปิดรีเลย์เพื่อเปิดปั๊ม ปัญหาคือ น้ำใช้เวลาสักครู่กว่าจะไหลจากปั๊ม ผ่านดินไปยังเซ็นเซอร์ เซ็นเซอร์จะหยุดน้ำเมื่อมันตรวจพบระดับ 450 แต่ระดับน้ำจะยังคงลดลงเนื่องจากน้ำที่ปั๊มยังคงซึมผ่านดิน ผลลัพธ์ที่ได้คือการสิ้นเปลืองน้ำและความเสี่ยงต่อความเสียหายของราก
✅ จำไว้ว่า - น้ำมากเกินไปอาจแย่พอๆ กับน้ำน้อยเกินไป และยังเป็นการสิ้นเปลืองทรัพยากรที่มีค่า
วิธีแก้ปัญหาที่ดีกว่าคือการเข้าใจว่ามีความล่าช้าระหว่างการเปิดตัวกระตุ้นและคุณสมบัติที่เซ็นเซอร์อ่านเปลี่ยนแปลง ซึ่งหมายความว่าไม่เพียงแต่เซ็นเซอร์ควรรอชั่วครู่ก่อนที่จะวัดค่าอีกครั้ง แต่ตัวกระตุ้นจำเป็นต้องปิดชั่วครู่ก่อนที่จะทำการวัดเซ็นเซอร์ครั้งถัดไป
ควรเปิดรีเลย์นานแค่ไหนในแต่ละครั้ง? ควรระมัดระวังและเปิดรีเลย์เพียงช่วงเวลาสั้นๆ จากนั้นรอให้น้ำซึมผ่าน แล้วตรวจสอบระดับความชื้นอีกครั้ง ท้ายที่สุด คุณสามารถเปิดปั๊มอีกครั้งเพื่อเติมน้ำเพิ่มได้เสมอ แต่คุณไม่สามารถเอาน้ำออกจากดินได้
> 💁 การควบคุมเวลาประเภทนี้ขึ้นอยู่กับอุปกรณ์ IoT ที่คุณกำลังสร้าง คุณสมบัติที่คุณกำลังวัด และเซ็นเซอร์และตัวกระตุ้นที่ใช้
![ต้นสตรอเบอร์รี่ที่เชื่อมต่อกับน้ำผ่านปั๊ม โดยปั๊มเชื่อมต่อกับรีเลย์ รีเลย์และเซ็นเซอร์ความชื้นในดินในต้นไม้เชื่อมต่อกับ Raspberry Pi](../../../../../translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.th.png)
ตัวอย่างเช่น ฉันมีต้นสตรอเบอร์รี่ที่มีเซ็นเซอร์ความชื้นในดินและปั๊มที่ควบคุมโดยรีเลย์ ฉันสังเกตว่าเมื่อฉันเติมน้ำ ใช้เวลาประมาณ 20 วินาทีสำหรับการอ่านค่าความชื้นในดินจะคงที่ ซึ่งหมายความว่าฉันต้องปิดรีเลย์และรอ 20 วินาทีก่อนที่จะตรวจสอบระดับความชื้น ฉันชอบที่จะมีน้ำน้อยเกินไปมากกว่ามากเกินไป - ฉันสามารถเปิดปั๊มอีกครั้งได้เสมอ แต่ฉันไม่สามารถเอาน้ำออกจากต้นไม้ได้
![ขั้นตอนที่ 1 วัดค่า ขั้นตอนที่ 2 เติมน้ำ ขั้นตอนที่ 3 รอให้น้ำซึมผ่านดิน ขั้นตอนที่ 4 วัดค่าอีกครั้ง](../../../../../translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.th.png)
ดังนั้นกระบวนการที่ดีที่สุดสำหรับรอบการรดน้ำควรเป็นดังนี้:
* เปิดปั๊มเป็นเวลา 5 วินาที
* รอ 20 วินาที
* ตรวจสอบความชื้นในดิน
* หากระดับยังคงสูงกว่าที่ต้องการ ให้ทำซ้ำขั้นตอนข้างต้น
5 วินาทีอาจนานเกินไปสำหรับปั๊ม โดยเฉพาะอย่างยิ่งหากระดับความชื้นสูงกว่าระดับที่ต้องการเพียงเล็กน้อย วิธีที่ดีที่สุดในการทราบเวลาที่ควรใช้คือการลองใช้ จากนั้นปรับเมื่อคุณมีข้อมูลเซ็นเซอร์ พร้อมกับการวนรอบข้อเสนอแนะอย่างต่อเนื่อง สิ่งนี้อาจนำไปสู่การตั้งเวลาที่ละเอียดขึ้น เช่น การเปิดปั๊มเป็นเวลา 1 วินาทีสำหรับทุกๆ 100 ที่สูงกว่าระดับความชื้นในดินที่ต้องการ แทนที่จะเป็น 5 วินาทีคงที่
✅ ลองค้นคว้าดู: มีข้อพิจารณาเรื่องเวลาอื่นๆ หรือไม่? พืชสามารถรดน้ำได้ทุกเวลาที่ความชื้นในดินต่ำเกินไป หรือมีช่วงเวลาที่เหมาะสมและไม่เหมาะสมในการรดน้ำพืชหรือไม่?
> 💁 การพยากรณ์อากาศสามารถนำมาพิจารณาเมื่อควบคุมระบบรดน้ำอัตโนมัติสำหรับการปลูกกลางแจ้ง หากคาดว่าฝนจะตก การรดน้ำสามารถหยุดไว้จนกว่าฝนจะหยุดตก ณ จุดนั้นดินอาจชื้นพอจนไม่จำเป็นต้องรดน้ำ ซึ่งมีประสิทธิภาพมากกว่าการสิ้นเปลืองน้ำโดยการรดน้ำก่อนฝนตก
## เพิ่มการตั้งเวลาให้กับเซิร์ฟเวอร์ควบคุมพืชของคุณ
โค้ดเซิร์ฟเวอร์สามารถแก้ไขเพื่อเพิ่มการควบคุมรอบการตั้งเวลาการรดน้ำ และรอให้ระดับความชื้นในดินเปลี่ยนแปลงได้ ลอจิกของเซิร์ฟเวอร์สำหรับควบคุมการตั้งเวลารีเลย์คือ:
1. รับข้อความเทเลเมทรี
1. ตรวจสอบระดับความชื้นในดิน
1. หากระดับความชื้นโอเค ไม่ต้องทำอะไร หากการอ่านสูงเกินไป (หมายถึงความชื้นในดินต่ำเกินไป) ให้:
1. ส่งคำสั่งเพื่อเปิดรีเลย์
1. รอ 5 วินาที
1. ส่งคำสั่งเพื่อปิดรีเลย์
1. รอ 20 วินาทีเพื่อให้ระดับความชื้นในดินคงที่
รอบการรดน้ำ กระบวนการตั้งแต่รับข้อความเทเลเมทรีจนถึงพร้อมประมวลผลระดับความชื้นในดินอีกครั้ง ใช้เวลาประมาณ 25 วินาที เรากำลังส่งระดับความชื้นในดินทุกๆ 10 วินาที ดังนั้นจึงมีการทับซ้อนกันที่ข้อความถูกส่งในขณะที่เซิร์ฟเวอร์กำลังรอให้ระดับความชื้นในดินคงที่ ซึ่งอาจเริ่มรอบการรดน้ำใหม่
มีสองตัวเลือกในการแก้ไขปัญหานี้:
* เปลี่ยนโค้ดอุปกรณ์ IoT ให้ส่งเทเลเมทรีทุกๆ นาที วิธีนี้รอบการรดน้ำจะเสร็จก่อนที่ข้อความถัดไปจะถูกส่ง
* ยกเลิกการสมัครรับเทเลเมทรีระหว่างรอบการรดน้ำ
ตัวเลือกแรกไม่ใช่ทางออกที่ดีเสมอไปสำหรับฟาร์มขนาดใหญ่ เกษตรกรอาจต้องการจับข้อมูลระดับความชื้นในดินในขณะที่ดินกำลังถูกรดน้ำเพื่อการวิเคราะห์ในภายหลัง เช่น เพื่อรับรู้การไหลของน้ำในพื้นที่ต่างๆ ของฟาร์มเพื่อเป็นแนวทางในการรดน้ำที่ตรงเป้าหมายมากขึ้น ตัวเลือกที่สองดีกว่า - โค้ดเพียงแค่เพิกเฉยต่อเทเลเมทรีเมื่อไม่สามารถใช้งานได้ แต่เทเลเมทรียังคงมีอยู่สำหรับบริการอื่นๆ ที่อาจสมัครรับข้อมูล
> 💁 ข้อมูล IoT ไม่ได้ถูกส่งจากอุปกรณ์เพียงเครื่องเดียวไปยังบริการเพียงบริการเดียว แต่หลายอุปกรณ์สามารถส่งข้อมูลไปยังตัวกลาง และหลายบริการสามารถฟังข้อมูลจากตัวกลางได้ ตัวอย่างเช่น บริการหนึ่งสามารถฟังข้อมูลความชื้นในดินและจัดเก็บในฐานข้อมูลเพื่อการวิเคราะห์ในภายหลัง อีกบริการหนึ่งสามารถฟังเทเลเมทรีเดียวกันเพื่อควบคุมระบบชลประทาน
### งาน - เพิ่มการตั้งเวลาให้กับเซิร์ฟเวอร์ควบคุมพืชของคุณ
อัปเดตโค้ดเซิร์ฟเวอร์ของคุณเพื่อให้รีเลย์ทำงานเป็นเวลา 5 วินาที จากนั้นรอ 20 วินาที
1. เปิดโฟลเดอร์ `soil-moisture-sensor-server` ใน VS Code หากยังไม่ได้เปิด ตรวจสอบให้แน่ใจว่าสภาพแวดล้อมเสมือนถูกเปิดใช้งาน
1. เปิดไฟล์ `app.py`
1. เพิ่มโค้ดต่อไปนี้ในไฟล์ `app.py` ด้านล่างการนำเข้าเดิม:
```python
import threading
```
คำสั่งนี้นำเข้า `threading` จากไลบรารีของ Python ซึ่งช่วยให้ Python สามารถรันโค้ดอื่นในขณะที่รอได้
1. เพิ่มโค้ดต่อไปนี้ก่อนฟังก์ชัน `handle_telemetry` ที่จัดการข้อความเทเลเมทรีที่ได้รับจากโค้ดเซิร์ฟเวอร์:
```python
water_time = 5
wait_time = 20
```
สิ่งนี้กำหนดระยะเวลาที่จะเปิดรีเลย์ (`water_time`) และระยะเวลาที่จะรอหลังจากนั้นเพื่อตรวจสอบความชื้นในดิน (`wait_time`)
1. ด้านล่างโค้ดนี้ เพิ่มโค้ดต่อไปนี้:
```python
def send_relay_command(client, state):
command = { 'relay_on' : state }
print("Sending message:", command)
client.publish(server_command_topic, json.dumps(command))
```
โค้ดนี้กำหนดฟังก์ชันชื่อ `send_relay_command` ที่ส่งคำสั่งผ่าน MQTT เพื่อควบคุมรีเลย์ เทเลเมทรีถูกสร้างเป็นพจนานุกรม จากนั้นแปลงเป็นสตริง JSON ค่าที่ส่งผ่านไปยัง `state` กำหนดว่ารีเลย์ควรเปิดหรือปิด
1. หลังฟังก์ชัน `send_relay_code` เพิ่มโค้ดต่อไปนี้:
```python
def control_relay(client):
print("Unsubscribing from telemetry")
mqtt_client.unsubscribe(client_telemetry_topic)
send_relay_command(client, True)
time.sleep(water_time)
send_relay_command(client, False)
time.sleep(wait_time)
print("Subscribing to telemetry")
mqtt_client.subscribe(client_telemetry_topic)
```
โค้ดนี้กำหนดฟังก์ชันเพื่อควบคุมรีเลย์ตามเวลาที่กำหนด เริ่มต้นด้วยการยกเลิกการสมัครรับเทเลเมทรีเพื่อไม่ให้ข้อความความชื้นในดินถูกประมวลผลในขณะที่กำลังรดน้ำ จากนั้นส่งคำสั่งเพื่อเปิดรีเลย์ รอ `water_time` ก่อนส่งคำสั่งเพื่อปิดรีเลย์ สุดท้ายรอให้ระดับความชื้นในดินคงที่เป็นเวลา `wait_time` วินาที จากนั้นสมัครรับเทเลเมทรีอีกครั้ง
1. เปลี่ยนฟังก์ชัน `handle_telemetry` เป็นดังนี้:
```python
def handle_telemetry(client, userdata, message):
payload = json.loads(message.payload.decode())
print("Message received:", payload)
if payload['soil_moisture'] > 450:
threading.Thread(target=control_relay, args=(client,)).start()
```
โค้ดนี้ตรวจสอบระดับความชื้นในดิน หากมากกว่า 450 ดินต้องการน้ำ ดังนั้นจึงเรียกฟังก์ชัน `control_relay` ฟังก์ชันนี้จะรันในเธรดแยก ทำงานในพื้นหลัง
1. ตรวจสอบให้อุปกรณ์ IoT ของคุณกำลังทำงาน จากนั้นรันโค้ดนี้ เปลี่ยนระดับความชื้นในดินและสังเกตสิ่งที่เกิดขึ้นกับรีเลย์ - รีเลย์ควรเปิดเป็นเวลา 5 วินาที จากนั้นปิดอย่างน้อย 20 วินาที โดยจะเปิดอีกครั้งก็ต่อเมื่อระดับความชื้นในดินไม่เพียงพอ
```output
(.venv) ➜ soil-moisture-sensor-server ✗ python app.py
Message received: {'soil_moisture': 457}
Unsubscribing from telemetry
Sending message: {'relay_on': True}
Sending message: {'relay_on': False}
Subscribing to telemetry
Message received: {'soil_moisture': 302}
```
วิธีที่ดีในการทดสอบระบบชลประทานจำลองคือการใช้ดินแห้ง จากนั้นเทน้ำด้วยตนเองในขณะที่รีเลย์เปิด หยุดเทเมื่อรีเลย์ปิด
> 💁 คุณสามารถค้นหาโค้ดนี้ได้ในโฟลเดอร์ [code-timing](../../../../../2-farm/lessons/3-automated-plant-watering/code-timing)
> 💁 หากคุณต้องการใช้ปั๊มเพื่อสร้างระบบชลประทานจริง คุณสามารถใช้ [ปั๊มน้ำ 6V](https://www.seeedstudio.com/6V-Mini-Water-Pump-p-1945.html) พร้อม [แหล่งจ่ายไฟ USB](https://www.adafruit.com/product/3628) ตรวจสอบให้แน่ใจว่าแหล่งจ่ายไฟไปยังหรือจากปั๊มเชื่อมต่อผ่านรีเลย์
---
## 🚀 ความท้าทาย
คุณสามารถนึกถึงอุปกรณ์ IoT หรืออุปกรณ์ไฟฟ้าอื่นๆ ที่มีปัญหาคล้ายกัน ซึ่งใช้เวลาสักครู่สำหรับผลลัพธ์ของตัวกระตุ้นที่จะไปถึงเซ็นเซอร์ได้หรือไม่? คุณอาจมีอุปกรณ์เหล่านี้ในบ้านหรือโรงเรียนของคุณ
* พวกมันวัดคุณสมบัติอะไร?
* ใช้เวลานานแค่ไหนสำหรับคุณสมบัติที่จะเปลี่ยนแปลงหลังจากใช้ตัวกระตุ้น?
* เป็นเรื่องโอเคหรือไม่ที่คุณสมบัติจะเปลี่ยนแปลงเกินค่าที่ต้องการ?
* จะสามารถคืนค่ากลับไปยังค่าที่ต้องการได้อย่างไรหากจำเป็น?
## แบบทดสอบหลังการบรรยาย
[แบบทดสอบหลังการบรรยาย](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/14)
## การทบทวนและการศึกษาด้วยตนเอง
* อ่านเพิ่มเติมเกี่ยวกับรีเลย์ รวมถึงการใช้งานในอดีตในระบบแลกเปลี่ยนโทรศัพท์บน [หน้าวิกิพีเดียเกี่ยวกับรีเลย์](https://wikipedia.org/wiki/Relay)
## การบ้าน
[สร้างรอบการรดน้ำที่มีประสิทธิภาพมากขึ้น](assignment.md)
---
**ข้อจำกัดความรับผิดชอบ**:
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้