โปรเจกต์ Arduino ESP32 DIY Water Level Sensor และ DIY Level Indicator
โปรเจกต์สร้าง DIY Water Level Sensor และ DIY Level Indicator (ราคาประหยัด) เพื่อวัดระดับน้ำ 5 ระดับใน Reservoir Tank
โปรเจกต์สร้าง DIY Water Level Sensor และ DIY Level Indicator (ราคาประหยัด) เพื่อวัดระดับน้ำ 5 ระดับใน Reservoir Tank
▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์
ถังเก็บน้ำถูกนำไปใช้งานในหลายรูปแบบ เช่น ในรถบ้าน (Caravan หรือ Camper) หรือในระบบรดน้ำต้นไม้ เป็นต้น บ่อยครั้งที่เราไม่สามารถมองเห็นปริมาณน้ำที่เหลืออยู่ในถังได้โดยตรง มีหลายวิธีในการวัดระดับน้ำในถังเก็บน้ำ ซึ่งคุณสามารถเลือกซื้อชุดสำเร็จรูปที่มีราคาสูง หรือจะสร้างขึ้นมาเองก็ได้!
แทนที่จะเป็น: Bring your Own Device -> MAKE YOUR OWN DEVICE!
ผมตัดสินใจสร้าง Water Level Sensor และ Water Level Indicator ที่แสดงผลได้ 5 ระดับ
คุณสามารถรับชมผลลัพธ์ได้ที่นี่:
DIY Sensor นี้สร้างขึ้นจากวัสดุที่เรียบง่าย:

โปรดทราบว่าการเจาะรูขนาด 5 มม. บางส่วนบนท่อนั้นเป็นสิ่งจำเป็น
หลักการทำงานของ Water Level Sensor อ้างอิงจากคุณสมบัติการนำไฟฟ้าของน้ำ ยิ่งมีความเค็มสูง การนำไฟฟ้าก็จะยิ่งดี ซึ่งเทียบเท่ากับความต้านทานที่ต่ำลง ค่าการนำไฟฟ้าเฉลี่ยของน้ำประปาที่จ่ายในพื้นที่ของผมอยู่ที่ประมาณ 35 mS/m ยิ่งมีหัววัดทองแดงอยู่ในน้ำมากเท่าไหร่ ความต้านทานของ Ladder network ก็จะยิ่งต่ำลง ค่าความต้านทานที่ต่ำลงนี้จะส่งผลให้แรงดันไฟฟ้าอินพุตที่ส่งไปยัง 12 bit ADC ที่ขา GPIO ของ ESP32 สูงขึ้น ด้วยการตั้งค่าแบบนี้ เราจะสามารถวัดระดับน้ำที่แตกต่างกันได้ 5 ระดับ
แผนผังอิเล็กทรอนิกส์ของ Sensor มีดังนี้:

ส่วนประกอบทั้งหมดถูกประกอบและบัดกรีเข้าด้วยกัน:
ชุดประกอบถูกใส่ไว้ในข้อต่อท่อขนาด 3/4 นิ้ว และเติม Silicone แบบใสเพื่อให้กันน้ำ
สายที่ใช้เชื่อมต่อ Sensor เข้ากับ Arduino คือสาย Audio ราคาถูกจากร้าน ACTION ในท้องถิ่น

Water Level Sensor ที่ประกอบเสร็จสมบูรณ์แสดงอยู่ด้านล่าง:
ส่วนประกอบที่ใช้สำหรับ Indicator ได้แก่:
ผลลัพธ์สุดท้ายของการประกอบแสดงอยู่ด้านล่าง:
การติดตั้งบน Breadboard แสดงในภาพต่อไปนี้:
ในการติดตั้งนี้ผมใช้ ESP32 (Node MCU) เหตุผลที่เลือกเพราะผมวางแผนที่จะขยายฟังก์ชันการใช้งานเพื่อสร้างระบบรดน้ำต้นไม้ที่สมบูรณ์แบบ พร้อมการมอนิเตอร์และแจ้งเตือนออนไลน์ (ESP32 มี WiFi และ Bluetooth ในตัว)
แผนผังวงจร (สร้างด้วย Fritzing) มีดังนี้:

ESP32 ใช้ไฟ 5V จากพอร์ต USB และมี Regulator 3.3V ในตัว ขาเอาต์พุต GPIO หนึ่งขาจะเชื่อมต่อโดยตรงกับ Water Level Sensor และส่งสัญญาณ 3.3V ไปยัง Sensor เป็นเวลาเพียง 200 มิลลิวินาที เพื่อหลีกเลี่ยงผลกระทบจาก Electrolysis และการกัดกร่อนของปลายทองแดงที่ตามมา
เอาต์พุตจาก Sensor เชื่อมต่อกับ Resistor ขนาด 1 M Ohm สองตัวที่สร้าง "Virtual Wheatstone bridge" ร่วมกับ Sensor และชุดเปรียบเทียบในซอฟต์แวร์
ผมใช้วิธีนี้เพราะพฤติกรรมของ Ladder network ในน้ำเมื่อเทียบกับระดับน้ำนั้นไม่เป็นเชิงเส้น (Non-linear) (ดูแผนภูมิด้านล่าง):

ในทางทฤษฎี เมื่อ Sensor ไม่ได้อยู่ในน้ำ ค่าที่วัดได้ที่ขา Sensor จะอยู่ที่ประมาณ 1.0855 V ซึ่งเทียบเท่ากับ 1347 bits ความคลาดเคลื่อนจากกราฟสามารถอธิบายได้จากค่า Tolerance ของ Resistor, ความต้านทานในสาย Sensor, ความคลาดเคลื่อนของแหล่งจ่ายไฟ 3.3V ของ ESP32 และความเป็น Non-linear ใน 12 Bits ADC ของ ESP32 รวมถึงสัญญาณรบกวนในวงจร
ไฟ 5V สำหรับ LED 5 ดวงใน Level Indicator นำมาจากขา 5V โดยตรง (เชื่อมต่อกับอินพุต 5V จากพอร์ต USB)
ระหว่างการทดลอง พบว่าการใช้ที่ชาร์จโทรศัพท์ 5V ให้ผลลัพธ์ที่ต่างจากการใช้พอร์ต USB ของ PC หรือจาก Power bank สำหรับ Power bank แม้จะให้ผลลัพธ์ที่เสถียร แต่มันจะปิดตัวลง (เข้าสู่โหมดพัก) หลังจากผ่านไปครู่หนึ่ง เนื่องจากระบบกินกระแสไฟต่ำมาก
ฟังก์ชัน Loop ใน Arduino Sketch นั้นเรียบง่ายและประกอบด้วยการเรียกใช้เพียง 2 ฟังก์ชัน:
void loop(){
MEASUREWATERLEVEL ();
INDICATEWATERLEVEL ();
delay(1000); // ตรวจสอบค่าใหม่ทุกๆ 1 วินาที;
การวัดผลทุก 1 วินาทีมีไว้เพื่อการทดลองและสาธิตเท่านั้น ในการใช้งานจริงจะวัดถี่น้อยกว่านี้มาก (ขึ้นอยู่กับว่าน้ำในถังถูกใช้งานเร็วแค่ไหน)
Plot monitor ของ Arduino IDE และ Serial monitor มีประโยชน์มากในระหว่างการทดลอง ภาพกราฟจาก Plot monitor แสดงอยู่ด้านล่าง

กราฟแสดงผลการวัด (ทุก 1 วินาที) ของ Sensor ขณะจุ่มลงและยกขึ้นจากน้ำ (เส้นสีเขียว) เส้นสีแดงแสดงค่าอ้างอิงที่ตั้งไว้ใน LEVELarray [] ค่าเหล่านี้ถูกกำหนดโดยการทดลองและแสดงให้เห็นอย่างชัดเจนถึงพฤติกรรม Non-linear ของ Sensor
// 0 1 2 3 4 5
int LEVELarray [6] = {1125,1245,1450,1720,2080,2630} ;
ระดับ "0" ใช้เมื่อไม่มีน้ำในถัง ระดับ "5" ใช้เมื่อน้ำเต็มถัง
พฤติกรรม Non-linear ของ Sensor สามารถแก้ไขได้โดยการสร้าง Ladder network ที่ใช้ค่า Resistor แบบไม่สม่ำเสมอ
แต่ผมสรุปว่ามันง่ายกว่ามากที่จะจัดการเรื่องนี้ในซอฟต์แวร์
นอกจากนี้ อาการสั่นของค่า (Jitter) ตามธรรมชาติที่เกิดขึ้นในค่า Sensor ที่วัดได้ สามารถกำจัดออกได้อย่างง่ายดายในซอฟต์แวร์โดยการอนุญาตให้มีค่า Tolerance เช่น 4% (และสังเกตว่ามี Capacitor 220nF ต่อขนานกับ Resistor 1 M Ohm ทั้งสองตัว)
for (int i = 0; i < 6 ; i++)
{
if ((WaterLevelValue > (LEVELarray[i] * 0.96)) && (WaterLevelValue < (LEVELarray[i] * 1.04)))
// ยอมให้มีส่วนต่าง 4% จากค่าที่วัดได้เพื่อกำจัด Jitter และสัญญาณรบกวน
{
level = i;
}
สุดท้าย ระดับน้ำที่กำหนดได้จะถูกนำมาแสดงผลบน Level Indicator ด้วยสีต่างๆ ซึ่งทำได้ง่ายมากด้วย Library <Adafruit_NeoPixel.h>:
redVal = color_scheme[level*3];
greenVal = color_scheme[level*3 + 1];
blueVal = color_scheme[level*3 + 2];
strip.setPixelColor(level-1, strip.Color(redVal, greenVal, blueVal) );
strip.show();
สำหรับการดาวน์โหลด Sketch ผ่านพอร์ต USB ลงใน ESP32 จำเป็นต้องกดปุ่ม Boot ค้างไว้
หมายเหตุ:
เมื่อใช้ Arduino ทั่วไป (เช่น Uno) แทน ESP32 จะต้องมีการเปลี่ยนแปลงใน Code หลายส่วน เช่น:
คุณอาจพบ Resistor 680 kOhm เพิ่มเติมในการติดตั้งจริงบน Breadboard เมื่อเทียบกับแผนผัง Fritzing นั่นเป็นเพราะในตอนแรก ผมต้องการให้สาย Sensor "0" แยกออกจาก Ladder network (เพื่อการทดลอง) ผมจึงใช้สาย Sensor แบบ 3 เส้น ในขณะที่การออกแบบขั้นสุดท้ายใช้เพียง 2 เส้นเท่านั้น
ผมสนใจที่จะทราบว่ามีใครกำลังจะนำโปรเจกต์นี้ไปสร้างตามหรือไม่
พัฒนาและผลิตโดย Pierre Pennings (ธันวาคม 2018)
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้