50 KiB
การรดน้ำต้นไม้อัตโนมัติ
สเก็ตโน้ตโดย Nitya Narasimhan คลิกที่ภาพเพื่อดูเวอร์ชันขนาดใหญ่ขึ้น
บทเรียนนี้เป็นส่วนหนึ่งของ โครงการ IoT สำหรับผู้เริ่มต้น โปรเจกต์ 2 - ชุดบทเรียนเกษตรดิจิทัล จาก Microsoft Reactor
แบบทดสอบก่อนเรียน
บทนำ
ในบทเรียนที่ผ่านมา คุณได้เรียนรู้วิธีการตรวจสอบความชื้นในดิน ในบทเรียนนี้ คุณจะได้เรียนรู้วิธีสร้างส่วนประกอบหลักของระบบรดน้ำอัตโนมัติที่ตอบสนองต่อความชื้นในดิน นอกจากนี้ คุณยังจะได้เรียนรู้เกี่ยวกับการจัดการเวลา - เช่น การที่เซ็นเซอร์อาจใช้เวลาสักครู่ในการตอบสนองต่อการเปลี่ยนแปลง และแอคชูเอเตอร์อาจใช้เวลาในการเปลี่ยนแปลงคุณสมบัติที่เซ็นเซอร์วัดได้
ในบทเรียนนี้เราจะครอบคลุม:
- การควบคุมอุปกรณ์ที่ใช้พลังงานสูงจากอุปกรณ์ IoT ที่ใช้พลังงานต่ำ
- การควบคุมรีเลย์
- การควบคุมต้นไม้ของคุณผ่าน MQTT
- การจัดการเวลาในเซ็นเซอร์และแอคชูเอเตอร์
- เพิ่มการจัดการเวลาในเซิร์ฟเวอร์ควบคุมต้นไม้ของคุณ
การควบคุมอุปกรณ์ที่ใช้พลังงานสูงจากอุปกรณ์ IoT ที่ใช้พลังงานต่ำ
อุปกรณ์ IoT ใช้แรงดันไฟฟ้าต่ำ ซึ่งเพียงพอสำหรับเซ็นเซอร์และแอคชูเอเตอร์ที่ใช้พลังงานต่ำ เช่น LED แต่ไม่เพียงพอสำหรับการควบคุมฮาร์ดแวร์ขนาดใหญ่ เช่น ปั๊มน้ำที่ใช้ในการชลประทาน แม้แต่ปั๊มขนาดเล็กที่ใช้กับต้นไม้ในบ้านก็ยังใช้กระแสไฟฟ้ามากเกินไปสำหรับชุดพัฒนา IoT และอาจทำให้บอร์ดเสียหายได้
🎓 กระแสไฟฟ้า วัดเป็นแอมป์ (A) คือปริมาณไฟฟ้าที่ไหลผ่านวงจร แรงดันไฟฟ้าคือแรงผลักดัน ส่วนกระแสคือปริมาณที่ถูกผลัก คุณสามารถอ่านเพิ่มเติมเกี่ยวกับกระแสไฟฟ้าได้ที่ หน้ากระแสไฟฟ้าบน Wikipedia
วิธีแก้ปัญหาคือการเชื่อมต่อปั๊มกับแหล่งจ่ายไฟภายนอก และใช้แอคชูเอเตอร์เพื่อเปิดปั๊ม คล้ายกับการเปิดไฟด้วยสวิตช์ ใช้พลังงานเพียงเล็กน้อย (ในรูปของพลังงานในร่างกายของคุณ) เพื่อให้นิ้วของคุณกดสวิตช์ และสิ่งนี้จะเชื่อมต่อไฟกับไฟฟ้ากระแสหลักที่ทำงานที่ 110v/240v
🎓 ไฟฟ้ากระแสหลัก หมายถึงไฟฟ้าที่ส่งไปยังบ้านและธุรกิจผ่านโครงสร้างพื้นฐานระดับประเทศในหลายส่วนของโลก
✅ อุปกรณ์ IoT มักจะให้แรงดันไฟฟ้า 3.3V หรือ 5V ที่กระแสน้อยกว่า 1 แอมป์ (1A) เมื่อเปรียบเทียบกับไฟฟ้ากระแสหลักที่มักจะอยู่ที่ 230V (120V ในอเมริกาเหนือ และ 100V ในญี่ปุ่น) และสามารถจ่ายพลังงานให้กับอุปกรณ์ที่ใช้กระแสไฟฟ้า 30A
มีแอคชูเอเตอร์หลายประเภทที่สามารถทำสิ่งนี้ได้ รวมถึงอุปกรณ์กลไกที่คุณสามารถติดตั้งกับสวิตช์ที่มีอยู่เพื่อเลียนแบบการเปิดสวิตช์ด้วยนิ้วมือ แต่ที่นิยมที่สุดคือรีเลย์
รีเลย์
รีเลย์เป็นสวิตช์ไฟฟ้าเชิงกลที่แปลงสัญญาณไฟฟ้าให้เป็นการเคลื่อนไหวเชิงกลเพื่อเปิดสวิตช์ แกนหลักของรีเลย์คือแม่เหล็กไฟฟ้า
🎓 แม่เหล็กไฟฟ้า คือแม่เหล็กที่สร้างขึ้นโดยการส่งกระแสไฟฟ้าผ่านขดลวด เมื่อกระแสไฟฟ้าเปิด ขดลวดจะกลายเป็นแม่เหล็ก เมื่อกระแสไฟฟ้าปิด ขดลวดจะสูญเสียคุณสมบัติแม่เหล็ก
ในรีเลย์ วงจรควบคุมจะจ่ายพลังงานให้กับแม่เหล็กไฟฟ้า เมื่อแม่เหล็กไฟฟ้าทำงาน มันจะดึงคันโยกที่เคลื่อนสวิตช์ ปิดคู่หน้าสัมผัสและทำให้วงจรเอาต์พุตสมบูรณ์
เมื่อวงจรควบคุมปิด แม่เหล็กไฟฟ้าจะหยุดทำงาน ปล่อยคันโยกและเปิดหน้าสัมผัส ปิดวงจรเอาต์พุต รีเลย์เป็นแอคชูเอเตอร์แบบดิจิทัล - สัญญาณสูงไปยังรีเลย์จะเปิดรีเลย์ สัญญาณต่ำจะปิดรีเลย์
วงจรเอาต์พุตสามารถใช้จ่ายพลังงานให้กับฮาร์ดแวร์เพิ่มเติม เช่น ระบบชลประทาน อุปกรณ์ IoT สามารถเปิดรีเลย์เพื่อทำให้วงจรเอาต์พุตสมบูรณ์ที่จ่ายพลังงานให้กับระบบชลประทาน และต้นไม้จะได้รับน้ำ จากนั้นอุปกรณ์ IoT สามารถปิดรีเลย์เพื่อตัดพลังงานไปยังระบบชลประทานและปิดน้ำ
ในวิดีโอด้านบน รีเลย์ถูกเปิด ไฟ LED บนรีเลย์สว่างขึ้นเพื่อแสดงว่ารีเลย์เปิดอยู่ (รีเลย์บางตัวมีไฟ LED เพื่อแสดงสถานะเปิดหรือปิด) และพลังงานถูกส่งไปยังปั๊ม ทำให้ปั๊มทำงานและสูบน้ำไปยังต้นไม้
💁 รีเลย์ยังสามารถใช้สลับระหว่างสองวงจรเอาต์พุตแทนที่จะเปิดหรือปิดวงจรเดียวได้ เมื่อคันโยกเคลื่อนที่ มันจะย้ายสวิตช์จากการทำให้วงจรเอาต์พุตหนึ่งสมบูรณ์ไปยังการทำให้วงจรเอาต์พุตอื่นสมบูรณ์ โดยปกติจะใช้การเชื่อมต่อพลังงานร่วมกันหรือการเชื่อมต่อกราวด์ร่วมกัน
✅ ทำการค้นคว้า: มีรีเลย์หลายประเภทที่มีความแตกต่าง เช่น วงจรควบคุมเปิดหรือปิดรีเลย์เมื่อจ่ายพลังงาน หรือมีวงจรเอาต์พุตหลายวงจร ค้นหาข้อมูลเกี่ยวกับรีเลย์ประเภทต่างๆ เหล่านี้
เมื่อคันโยกเคลื่อนที่ คุณมักจะได้ยินเสียงคลิกที่ชัดเจนเมื่อมันสัมผัสกับแม่เหล็กไฟฟ้า
💁 รีเลย์สามารถต่อสายเพื่อให้การเชื่อมต่อทำให้พลังงานไปยังรีเลย์ถูกตัด ซึ่งจะปิดรีเลย์ จากนั้นส่งพลังงานไปยังรีเลย์อีกครั้งเพื่อเปิดใหม่ และทำซ้ำเช่นนี้ต่อไป สิ่งนี้ทำให้รีเลย์คลิกอย่างรวดเร็วมากจนเกิดเสียงหึ่งๆ นี่คือวิธีการทำงานของกริ่งไฟฟ้าบางประเภทในอดีต
พลังงานของรีเลย์
แม่เหล็กไฟฟ้าไม่ต้องการพลังงานมากในการทำงานและดึงคันโยก มันสามารถควบคุมได้โดยใช้แรงดันไฟฟ้า 3.3V หรือ 5V จากชุดพัฒนา IoT วงจรเอาต์พุตสามารถรองรับพลังงานได้มากขึ้น ขึ้นอยู่กับรีเลย์ รวมถึงแรงดันไฟฟ้ากระแสหลักหรือระดับพลังงานที่สูงขึ้นสำหรับการใช้งานในอุตสาหกรรม ด้วยวิธีนี้ ชุดพัฒนา IoT สามารถควบคุมระบบชลประทานได้ ตั้งแต่ปั๊มขนาดเล็กสำหรับต้นไม้ต้นเดียว ไปจนถึงระบบอุตสาหกรรมขนาดใหญ่สำหรับฟาร์มเชิงพาณิชย์ทั้งหมด
ภาพด้านบนแสดงรีเลย์ Grove วงจรควบคุมเชื่อมต่อกับอุปกรณ์ IoT และเปิดหรือปิดรีเลย์โดยใช้แรงดันไฟฟ้า 3.3V หรือ 5V วงจรเอาต์พุตมีสองขั้ว ซึ่งขั้วใดขั้วหนึ่งสามารถเป็นพลังงานหรือกราวด์ วงจรเอาต์พุตสามารถรองรับได้ถึง 250V ที่ 10A เพียงพอสำหรับอุปกรณ์ที่ใช้พลังงานจากไฟฟ้ากระแสหลักหลากหลายประเภท คุณยังสามารถหารีเลย์ที่รองรับระดับพลังงานที่สูงกว่านี้ได้
ในภาพด้านบน พลังงานถูกจ่ายให้กับปั๊มผ่านรีเลย์ มีสายสีแดงเชื่อมต่อขั้ว +5V ของแหล่งจ่ายไฟ USB กับขั้วหนึ่งของวงจรเอาต์พุตของรีเลย์ และสายสีแดงอีกเส้นเชื่อมต่อขั้วอีกขั้วของวงจรเอาต์พุตกับปั๊ม สายสีดำเชื่อมต่อปั๊มกับกราวด์ของแหล่งจ่ายไฟ USB เมื่อรีเลย์เปิด มันจะทำให้วงจรสมบูรณ์ ส่ง 5V ไปยังปั๊ม ทำให้ปั๊มทำงาน
การควบคุมรีเลย์
คุณสามารถควบคุมรีเลย์จากชุดพัฒนา IoT ของคุณ
งาน - ควบคุมรีเลย์
ทำตามคำแนะนำที่เกี่ยวข้องเพื่อควบคุมรีเลย์โดยใช้อุปกรณ์ IoT ของคุณ:
การควบคุมต้นไม้ของคุณผ่าน MQTT
จนถึงตอนนี้ รีเลย์ของคุณถูกควบคุมโดยอุปกรณ์ IoT โดยตรงจากการอ่านค่าความชื้นในดินเพียงครั้งเดียว ในระบบชลประทานเชิงพาณิชย์ ตรรกะการควบคุมจะถูกกระจายศูนย์กลาง เพื่อให้สามารถตัดสินใจเรื่องการรดน้ำโดยใช้ข้อมูลจากเซ็นเซอร์หลายตัว และสามารถเปลี่ยนการตั้งค่าทั้งหมดได้ในที่เดียว เพื่อจำลองสิ่งนี้ คุณสามารถควบคุมรีเลย์ผ่าน MQTT
งาน - ควบคุมรีเลย์ผ่าน MQTT
-
เพิ่มไลบรารี MQTT/pip packages และโค้ดที่เกี่ยวข้องในโปรเจกต์
soil-moisture-sensor
ของคุณเพื่อเชื่อมต่อกับ MQTT ตั้งชื่อ Client ID ว่าsoilmoisturesensor_client
โดยเพิ่มคำนำหน้าด้วย ID ของคุณ⚠️ คุณสามารถอ้างอิง คำแนะนำสำหรับการเชื่อมต่อกับ MQTT ในโปรเจกต์ 1 บทเรียน 4 หากจำเป็น
-
เพิ่มโค้ดอุปกรณ์ที่เกี่ยวข้องเพื่อส่งข้อมูลเทเลเมทรีพร้อมการตั้งค่าความชื้นในดิน สำหรับข้อความเทเลเมทรี ให้ตั้งชื่อพร็อพเพอร์ตี้ว่า
soil_moisture
⚠️ คุณสามารถอ้างอิง คำแนะนำสำหรับการส่งข้อมูลเทเลเมทรีไปยัง MQTT ในโปรเจกต์ 1 บทเรียน 4 หากจำเป็น
-
สร้างโค้ดเซิร์ฟเวอร์ในเครื่องเพื่อสมัครรับข้อมูลเทเลเมทรีและส่งคำสั่งเพื่อควบคุมรีเลย์ในโฟลเดอร์ที่ชื่อว่า
soil-moisture-sensor-server
ตั้งชื่อพร็อพเพอร์ตี้ในข้อความคำสั่งว่าrelay_on
และตั้ง Client ID ว่าsoilmoisturesensor_server
โดยเพิ่มคำนำหน้าด้วย ID ของคุณ รักษาโครงสร้างเดียวกับโค้ดเซิร์ฟเวอร์ที่คุณเขียนในโปรเจกต์ 1 บทเรียน 4 เนื่องจากคุณจะเพิ่มโค้ดนี้ในภายหลังในบทเรียนนี้⚠️ คุณสามารถอ้างอิง คำแนะนำสำหรับการส่งข้อมูลเทเลเมทรีไปยัง MQTT และ การส่งคำสั่งผ่าน MQTT ในโปรเจกต์ 1 บทเรียน 4 หากจำเป็น
-
เพิ่มโค้ดอุปกรณ์ที่เกี่ยวข้องเพื่อควบคุมรีเลย์จากคำสั่งที่ได้รับ โดยใช้พร็อพเพอร์ตี้
relay_on
จากข้อความ ส่งค่า true สำหรับrelay_on
หากsoil_moisture
มีค่ามากกว่า 450 มิฉะนั้นส่งค่า false เช่นเดียวกับตรรกะที่คุณเพิ่มสำหรับอุปกรณ์ IoT ก่อนหน้านี้⚠️ คุณสามารถอ้างอิง คำแนะนำสำหรับการตอบสนองต่อคำสั่งจาก MQTT ในโปรเจกต์ 1 บทเรียน 4 หากจำเป็น
💁 คุณสามารถหาโค้ดนี้ได้ในโฟลเดอร์ code-mqtt
ตรวจสอบให้แน่ใจว่าโค้ดกำลังทำงานบนอุปกรณ์และเซิร์ฟเวอร์ในเครื่องของคุณ และทดสอบโดยการเปลี่ยนระดับความชื้นในดิน ไม่ว่าจะโดยการเปลี่ยนค่าที่ส่งโดยเซ็นเซอร์เสมือน หรือโดยการเปลี่ยนระดับความชื้นในดินโดยการเติมน้ำหรือถอดเซ็นเซอร์ออกจากดิน
การจัดการเวลาในเซ็นเซอร์และแอคชูเอเตอร์
ในบทเรียนที่ 3 คุณได้สร้างไฟกลางคืน - ไฟ LED ที่เปิดทันทีเมื่อเซ็นเซอร์วัดระดับแสงต่ำได้ เซ็นเซอร์แสงตรวจจับการเปลี่ยนแปลงของระดับแสงได้ทันที และอุปกรณ์สามารถตอบสนองได้อย่างรวดเร็ว โดยจำกัดเพียงความยาวของดีเลย์ในฟังก์ชัน loop
หรือ while True:
ในฐานะนักพัฒนา IoT คุณไม่สามารถพึ่งพาวงจรตอบสนองที่รวดเร็วเช่นนี้ได้เสมอไป
การจัดการเวลาสำหรับความชื้นในดิน
หากคุณทำบทเรียนที่แล้วเกี่ยวกับความชื้นในดินโดยใช้เซ็นเซอร์จริง คุณอาจสังเกตเห็นว่าค่าความชื้นในดินใช้เวลาสองสามวินาทีในการลดลงหลังจากที่คุณรดน้ำต้นไม้ นี่ไม่ใช่เพราะเซ็นเซอร์ช้า แต่เพราะน้ำใช้เวลาในการซึมผ่านดิน
💁 หากคุณรดน้ำใกล้กับเซ็นเซอร์มากเกินไป คุณอาจสังเกตเห็นค่าการอ่านลดลงอย่างรวดเร็วแล้วกลับขึ้นมาอีกครั้ง - สิ่งนี้เกิดจากน้ำที่อยู่ใกล้เซ็นเซอร์กระจายไปทั่วดินส่วนที่เหลือ ทำให้ความชื้นในดินบริเวณเซ็นเซอร์ลดลง
ในภาพด้านบน การวัดความชื้นในดินแสดงค่า 658 เมื่อรดน้ำ ค่าอ่านนี้จะไม่เปลี่ยนแปลงทันที เนื่องจากน้ำยังไม่ถึงเซ็นเซอร์ การรดน้ำอาจเสร็จสิ้นก่อนที่น้ำจะถึงเซ็นเซอร์ และค่าจะลดลงเพื่อสะท้อนระดับความชื้นใหม่
หากคุณกำลังเขียนโค้ดเพื่อควบคุมระบบชลประทานผ่านรีเลย์โดยอิงจากระดับความชื้นในดิน คุณจำเป็นต้องคำนึงถึงความล่าช้านี้และสร้างการตั้งเวลาที่ชาญฉลาดยิ่งขึ้นในอุปกรณ์ IoT ของคุณ
✅ ลองคิดดูว่าคุณจะทำสิ่งนี้ได้อย่างไร
ควบคุมการตั้งเวลาของเซ็นเซอร์และตัวกระตุ้น
ลองจินตนาการว่าคุณได้รับมอบหมายให้สร้างระบบชลประทานสำหรับฟาร์ม โดยพิจารณาจากประเภทของดิน ระดับความชื้นในดินที่เหมาะสมที่สุดสำหรับพืชที่ปลูกนั้นพบว่าตรงกับการอ่านแรงดันไฟฟ้าแบบแอนะล็อกที่ 400-450
คุณสามารถเขียนโปรแกรมอุปกรณ์ในลักษณะเดียวกับไฟกลางคืนได้ - ตลอดเวลาที่เซ็นเซอร์อ่านค่าได้มากกว่า 450 ให้เปิดรีเลย์เพื่อเปิดปั๊ม ปัญหาคือ น้ำใช้เวลาสักครู่กว่าจะไหลจากปั๊ม ผ่านดินไปยังเซ็นเซอร์ เซ็นเซอร์จะหยุดน้ำเมื่อมันตรวจพบระดับ 450 แต่ระดับน้ำจะยังคงลดลงเนื่องจากน้ำที่ปั๊มยังคงซึมผ่านดิน ผลลัพธ์ที่ได้คือการสิ้นเปลืองน้ำและความเสี่ยงต่อความเสียหายของราก
✅ จำไว้ว่า - น้ำมากเกินไปอาจแย่พอๆ กับน้ำน้อยเกินไป และยังเป็นการสิ้นเปลืองทรัพยากรที่มีค่า
วิธีแก้ปัญหาที่ดีกว่าคือการเข้าใจว่ามีความล่าช้าระหว่างการเปิดตัวกระตุ้นและคุณสมบัติที่เซ็นเซอร์อ่านเปลี่ยนแปลง ซึ่งหมายความว่าไม่เพียงแต่เซ็นเซอร์ควรรอชั่วครู่ก่อนที่จะวัดค่าอีกครั้ง แต่ตัวกระตุ้นจำเป็นต้องปิดชั่วครู่ก่อนที่จะทำการวัดเซ็นเซอร์ครั้งถัดไป
ควรเปิดรีเลย์นานแค่ไหนในแต่ละครั้ง? ควรระมัดระวังและเปิดรีเลย์เพียงช่วงเวลาสั้นๆ จากนั้นรอให้น้ำซึมผ่าน แล้วตรวจสอบระดับความชื้นอีกครั้ง ท้ายที่สุด คุณสามารถเปิดปั๊มอีกครั้งเพื่อเติมน้ำเพิ่มได้เสมอ แต่คุณไม่สามารถเอาน้ำออกจากดินได้
💁 การควบคุมเวลาประเภทนี้ขึ้นอยู่กับอุปกรณ์ IoT ที่คุณกำลังสร้าง คุณสมบัติที่คุณกำลังวัด และเซ็นเซอร์และตัวกระตุ้นที่ใช้
ตัวอย่างเช่น ฉันมีต้นสตรอเบอร์รี่ที่มีเซ็นเซอร์ความชื้นในดินและปั๊มที่ควบคุมโดยรีเลย์ ฉันสังเกตว่าเมื่อฉันเติมน้ำ ใช้เวลาประมาณ 20 วินาทีสำหรับการอ่านค่าความชื้นในดินจะคงที่ ซึ่งหมายความว่าฉันต้องปิดรีเลย์และรอ 20 วินาทีก่อนที่จะตรวจสอบระดับความชื้น ฉันชอบที่จะมีน้ำน้อยเกินไปมากกว่ามากเกินไป - ฉันสามารถเปิดปั๊มอีกครั้งได้เสมอ แต่ฉันไม่สามารถเอาน้ำออกจากต้นไม้ได้
ดังนั้นกระบวนการที่ดีที่สุดสำหรับรอบการรดน้ำควรเป็นดังนี้:
- เปิดปั๊มเป็นเวลา 5 วินาที
- รอ 20 วินาที
- ตรวจสอบความชื้นในดิน
- หากระดับยังคงสูงกว่าที่ต้องการ ให้ทำซ้ำขั้นตอนข้างต้น
5 วินาทีอาจนานเกินไปสำหรับปั๊ม โดยเฉพาะอย่างยิ่งหากระดับความชื้นสูงกว่าระดับที่ต้องการเพียงเล็กน้อย วิธีที่ดีที่สุดในการทราบเวลาที่ควรใช้คือการลองใช้ จากนั้นปรับเมื่อคุณมีข้อมูลเซ็นเซอร์ พร้อมกับการวนรอบข้อเสนอแนะอย่างต่อเนื่อง สิ่งนี้อาจนำไปสู่การตั้งเวลาที่ละเอียดขึ้น เช่น การเปิดปั๊มเป็นเวลา 1 วินาทีสำหรับทุกๆ 100 ที่สูงกว่าระดับความชื้นในดินที่ต้องการ แทนที่จะเป็น 5 วินาทีคงที่
✅ ลองค้นคว้าดู: มีข้อพิจารณาเรื่องเวลาอื่นๆ หรือไม่? พืชสามารถรดน้ำได้ทุกเวลาที่ความชื้นในดินต่ำเกินไป หรือมีช่วงเวลาที่เหมาะสมและไม่เหมาะสมในการรดน้ำพืชหรือไม่?
💁 การพยากรณ์อากาศสามารถนำมาพิจารณาเมื่อควบคุมระบบรดน้ำอัตโนมัติสำหรับการปลูกกลางแจ้ง หากคาดว่าฝนจะตก การรดน้ำสามารถหยุดไว้จนกว่าฝนจะหยุดตก ณ จุดนั้นดินอาจชื้นพอจนไม่จำเป็นต้องรดน้ำ ซึ่งมีประสิทธิภาพมากกว่าการสิ้นเปลืองน้ำโดยการรดน้ำก่อนฝนตก
เพิ่มการตั้งเวลาให้กับเซิร์ฟเวอร์ควบคุมพืชของคุณ
โค้ดเซิร์ฟเวอร์สามารถแก้ไขเพื่อเพิ่มการควบคุมรอบการตั้งเวลาการรดน้ำ และรอให้ระดับความชื้นในดินเปลี่ยนแปลงได้ ลอจิกของเซิร์ฟเวอร์สำหรับควบคุมการตั้งเวลารีเลย์คือ:
- รับข้อความเทเลเมทรี
- ตรวจสอบระดับความชื้นในดิน
- หากระดับความชื้นโอเค ไม่ต้องทำอะไร หากการอ่านสูงเกินไป (หมายถึงความชื้นในดินต่ำเกินไป) ให้:
- ส่งคำสั่งเพื่อเปิดรีเลย์
- รอ 5 วินาที
- ส่งคำสั่งเพื่อปิดรีเลย์
- รอ 20 วินาทีเพื่อให้ระดับความชื้นในดินคงที่
รอบการรดน้ำ กระบวนการตั้งแต่รับข้อความเทเลเมทรีจนถึงพร้อมประมวลผลระดับความชื้นในดินอีกครั้ง ใช้เวลาประมาณ 25 วินาที เรากำลังส่งระดับความชื้นในดินทุกๆ 10 วินาที ดังนั้นจึงมีการทับซ้อนกันที่ข้อความถูกส่งในขณะที่เซิร์ฟเวอร์กำลังรอให้ระดับความชื้นในดินคงที่ ซึ่งอาจเริ่มรอบการรดน้ำใหม่
มีสองตัวเลือกในการแก้ไขปัญหานี้:
- เปลี่ยนโค้ดอุปกรณ์ IoT ให้ส่งเทเลเมทรีทุกๆ นาที วิธีนี้รอบการรดน้ำจะเสร็จก่อนที่ข้อความถัดไปจะถูกส่ง
- ยกเลิกการสมัครรับเทเลเมทรีระหว่างรอบการรดน้ำ
ตัวเลือกแรกไม่ใช่ทางออกที่ดีเสมอไปสำหรับฟาร์มขนาดใหญ่ เกษตรกรอาจต้องการจับข้อมูลระดับความชื้นในดินในขณะที่ดินกำลังถูกรดน้ำเพื่อการวิเคราะห์ในภายหลัง เช่น เพื่อรับรู้การไหลของน้ำในพื้นที่ต่างๆ ของฟาร์มเพื่อเป็นแนวทางในการรดน้ำที่ตรงเป้าหมายมากขึ้น ตัวเลือกที่สองดีกว่า - โค้ดเพียงแค่เพิกเฉยต่อเทเลเมทรีเมื่อไม่สามารถใช้งานได้ แต่เทเลเมทรียังคงมีอยู่สำหรับบริการอื่นๆ ที่อาจสมัครรับข้อมูล
💁 ข้อมูล IoT ไม่ได้ถูกส่งจากอุปกรณ์เพียงเครื่องเดียวไปยังบริการเพียงบริการเดียว แต่หลายอุปกรณ์สามารถส่งข้อมูลไปยังตัวกลาง และหลายบริการสามารถฟังข้อมูลจากตัวกลางได้ ตัวอย่างเช่น บริการหนึ่งสามารถฟังข้อมูลความชื้นในดินและจัดเก็บในฐานข้อมูลเพื่อการวิเคราะห์ในภายหลัง อีกบริการหนึ่งสามารถฟังเทเลเมทรีเดียวกันเพื่อควบคุมระบบชลประทาน
งาน - เพิ่มการตั้งเวลาให้กับเซิร์ฟเวอร์ควบคุมพืชของคุณ
อัปเดตโค้ดเซิร์ฟเวอร์ของคุณเพื่อให้รีเลย์ทำงานเป็นเวลา 5 วินาที จากนั้นรอ 20 วินาที
-
เปิดโฟลเดอร์
soil-moisture-sensor-server
ใน VS Code หากยังไม่ได้เปิด ตรวจสอบให้แน่ใจว่าสภาพแวดล้อมเสมือนถูกเปิดใช้งาน -
เปิดไฟล์
app.py
-
เพิ่มโค้ดต่อไปนี้ในไฟล์
app.py
ด้านล่างการนำเข้าเดิม:import threading
คำสั่งนี้นำเข้า
threading
จากไลบรารีของ Python ซึ่งช่วยให้ Python สามารถรันโค้ดอื่นในขณะที่รอได้ -
เพิ่มโค้ดต่อไปนี้ก่อนฟังก์ชัน
handle_telemetry
ที่จัดการข้อความเทเลเมทรีที่ได้รับจากโค้ดเซิร์ฟเวอร์:water_time = 5 wait_time = 20
สิ่งนี้กำหนดระยะเวลาที่จะเปิดรีเลย์ (
water_time
) และระยะเวลาที่จะรอหลังจากนั้นเพื่อตรวจสอบความชื้นในดิน (wait_time
) -
ด้านล่างโค้ดนี้ เพิ่มโค้ดต่อไปนี้:
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
กำหนดว่ารีเลย์ควรเปิดหรือปิด -
หลังฟังก์ชัน
send_relay_code
เพิ่มโค้ดต่อไปนี้: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
วินาที จากนั้นสมัครรับเทเลเมทรีอีกครั้ง -
เปลี่ยนฟังก์ชัน
handle_telemetry
เป็นดังนี้: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
ฟังก์ชันนี้จะรันในเธรดแยก ทำงานในพื้นหลัง -
ตรวจสอบให้อุปกรณ์ IoT ของคุณกำลังทำงาน จากนั้นรันโค้ดนี้ เปลี่ยนระดับความชื้นในดินและสังเกตสิ่งที่เกิดขึ้นกับรีเลย์ - รีเลย์ควรเปิดเป็นเวลา 5 วินาที จากนั้นปิดอย่างน้อย 20 วินาที โดยจะเปิดอีกครั้งก็ต่อเมื่อระดับความชื้นในดินไม่เพียงพอ
(.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
💁 หากคุณต้องการใช้ปั๊มเพื่อสร้างระบบชลประทานจริง คุณสามารถใช้ ปั๊มน้ำ 6V พร้อม แหล่งจ่ายไฟ USB ตรวจสอบให้แน่ใจว่าแหล่งจ่ายไฟไปยังหรือจากปั๊มเชื่อมต่อผ่านรีเลย์
🚀 ความท้าทาย
คุณสามารถนึกถึงอุปกรณ์ IoT หรืออุปกรณ์ไฟฟ้าอื่นๆ ที่มีปัญหาคล้ายกัน ซึ่งใช้เวลาสักครู่สำหรับผลลัพธ์ของตัวกระตุ้นที่จะไปถึงเซ็นเซอร์ได้หรือไม่? คุณอาจมีอุปกรณ์เหล่านี้ในบ้านหรือโรงเรียนของคุณ
- พวกมันวัดคุณสมบัติอะไร?
- ใช้เวลานานแค่ไหนสำหรับคุณสมบัติที่จะเปลี่ยนแปลงหลังจากใช้ตัวกระตุ้น?
- เป็นเรื่องโอเคหรือไม่ที่คุณสมบัติจะเปลี่ยนแปลงเกินค่าที่ต้องการ?
- จะสามารถคืนค่ากลับไปยังค่าที่ต้องการได้อย่างไรหากจำเป็น?
แบบทดสอบหลังการบรรยาย
การทบทวนและการศึกษาด้วยตนเอง
- อ่านเพิ่มเติมเกี่ยวกับรีเลย์ รวมถึงการใช้งานในอดีตในระบบแลกเปลี่ยนโทรศัพท์บน หน้าวิกิพีเดียเกี่ยวกับรีเลย์
การบ้าน
สร้างรอบการรดน้ำที่มีประสิทธิภาพมากขึ้น
ข้อจำกัดความรับผิดชอบ:
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI Co-op Translator แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้