หน้าแรก ดูโปรเจกต์ทั้งหมด
Intermediate

โปรเจกต์ Arduino ESP32 DIY Water Level Sensor และ DIY Level Indicator

โปรเจกต์สร้าง DIY Water Level Sensor และ DIY Level Indicator (ราคาประหยัด) เพื่อวัดระดับน้ำ 5 ระดับใน Reservoir Tank

โปรเจกต์ Arduino ESP32 DIY Water Level Sensor และ DIY Level Indicator

วิดีโอสาธิต

Video

▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์

68,949 การดู
8 ถูกใจ

รายการอุปกรณ์และเครื่องมือ

1x Capacitor 1 nF
-
1x Capacitor 220 nF
-
1x Water Level Sensor
🛒 สั่งซื้อ
6x Resistor 680 k Ohm
-
1x Water Level Indicator
🛒 สั่งซื้อ
}

แอปพลิเคชันและแพลตฟอร์ม

รายละเอียดและวิธีทำ

ถังเก็บน้ำถูกนำไปใช้งานในหลายรูปแบบ เช่น ในรถบ้าน (Caravan หรือ Camper) หรือในระบบรดน้ำต้นไม้ เป็นต้น บ่อยครั้งที่เราไม่สามารถมองเห็นปริมาณน้ำที่เหลืออยู่ในถังได้โดยตรง มีหลายวิธีในการวัดระดับน้ำในถังเก็บน้ำ ซึ่งคุณสามารถเลือกซื้อชุดสำเร็จรูปที่มีราคาสูง หรือจะสร้างขึ้นมาเองก็ได้!

แทนที่จะเป็น: Bring your Own Device -> MAKE YOUR OWN DEVICE!

ผมตัดสินใจสร้าง Water Level Sensor และ Water Level Indicator ที่แสดงผลได้ 5 ระดับ

คุณสามารถรับชมผลลัพธ์ได้ที่นี่:

Sensor กำลังเคลื่อนที่ลงและขึ้น โดย Indicator แสดงระดับน้ำ (ความเร็ว x3)

Step 1: การสร้าง Water Level Sensor

DIY Sensor นี้สร้างขึ้นจากวัสดุที่เรียบง่าย:

  • สายไฟ 6 ชิ้น (ทองแดง 1.5 มม. หุ้ม PVC สีดำ) ปอกปลายทั้งสองด้านประมาณ 1 ซม.
  • ท่อร้อยสายไฟขนาด 3/4 นิ้ว ที่มีความยาวพอดีกับความลึกของถังเก็บน้ำ
  • ข้อต่อท่อ PVC ขนาด 3/4 นิ้ว 1 อัน
  • 680KOhm Resistor 6 ตัว
  • Capacitor 1 nF 1 ตัว (สำหรับลดสัญญาณรบกวน)
  • สาย Audio ราคาถูก
  • แผ่น Prototype PCB แบบสองหน้า
อุปกรณ์ที่ใช้สำหรับ Water Level Sensor

โปรดทราบว่าการเจาะรูขนาด 5 มม. บางส่วนบนท่อนั้นเป็นสิ่งจำเป็น

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

แผนผังอิเล็กทรอนิกส์ของ Sensor มีดังนี้:

วงจร Ladder network ที่ใช้ 680 KOhm Resistor 6 ตัว

ส่วนประกอบทั้งหมดถูกประกอบและบัดกรีเข้าด้วยกัน:

ชุด Sensor ที่ประกอบเสร็จสมบูรณ์

ชุดประกอบถูกใส่ไว้ในข้อต่อท่อขนาด 3/4 นิ้ว และเติม Silicone แบบใสเพื่อให้กันน้ำ

สายที่ใช้เชื่อมต่อ Sensor เข้ากับ Arduino คือสาย Audio ราคาถูกจากร้าน ACTION ในท้องถิ่น

สายที่ใช้สำหรับเชื่อมต่อ Sensor

Water Level Sensor ที่ประกอบเสร็จสมบูรณ์แสดงอยู่ด้านล่าง:

Sensor ที่เสร็จสมบูรณ์

Step 2: การสร้าง Water Level Indicator

ส่วนประกอบที่ใช้สำหรับ Indicator ได้แก่:

  • แผ่นรองตัดสีเทาเข้ม (จาก ACTION) เจาะรูตามที่เห็นในภาพถัดไป และใช้ตะไบแต่งรูให้เป็นรูปสี่เหลี่ยม
  • สาย LED strip ที่ประกอบด้วย WS2812 LED 5 ดวง (ตัดมาจากเส้นยาว)
  • กระดาษ Photo พิมพ์ระดับน้ำ 5 ระดับ (1%, 25%, 50%, 75%, 100%)
  • แผ่นฟอยล์ใสสำหรับป้องกันรอยพิมพ์
  • ฟอยล์อลูมิเนียมสำหรับปิดทับ (จัดการยากนิดหน่อย แต่นี่คือสิ่งที่ผมเลือกใช้)
ชิ้นส่วนที่ใช้สำหรับ Level Indicator

ผลลัพธ์สุดท้ายของการประกอบแสดงอยู่ด้านล่าง:

Water Level Indicator ที่เสร็จสมบูรณ์

Step 4: การติดตั้งอุปกรณ์อิเล็กทรอนิกส์

การติดตั้งบน Breadboard แสดงในภาพต่อไปนี้:

การติดตั้งบน 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 (0 - 4095 Bits)

ในทางทฤษฎี เมื่อ 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 แม้จะให้ผลลัพธ์ที่เสถียร แต่มันจะปิดตัวลง (เข้าสู่โหมดพัก) หลังจากผ่านไปครู่หนึ่ง เนื่องจากระบบกินกระแสไฟต่ำมาก

Step 3: การเขียนซอฟต์แวร์

ฟังก์ชัน Loop ใน Arduino Sketch นั้นเรียบง่ายและประกอบด้วยการเรียกใช้เพียง 2 ฟังก์ชัน:

void loop(){
MEASUREWATERLEVEL ();
INDICATEWATERLEVEL ();
delay(1000); // ตรวจสอบค่าใหม่ทุกๆ 1 วินาที;

การวัดผลทุก 1 วินาทีมีไว้เพื่อการทดลองและสาธิตเท่านั้น ในการใช้งานจริงจะวัดถี่น้อยกว่านี้มาก (ขึ้นอยู่กับว่าน้ำในถังถูกใช้งานเร็วแค่ไหน)

Plot monitor ของ Arduino IDE และ Serial monitor มีประโยชน์มากในระหว่างการทดลอง ภาพกราฟจาก Plot monitor แสดงอยู่ด้านล่าง

กราฟจาก Arduino IDE 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 หลายส่วน เช่น:

  • การกำหนดขา (Pin allocation)
  • ค่าใน LEVELarray โดยคำนึงถึงว่า Uno มี 10 bit ADC (ที่ขา A0) วิธีที่ง่ายที่สุดคือลองหารค่าด้วย 4
  • สัญญาณ Trigger pulse 5V ไปยัง Sensor (แทนที่จะเป็น 3.3V) ไม่ควรส่งผลกระทบใดๆ

คุณอาจพบ Resistor 680 kOhm เพิ่มเติมในการติดตั้งจริงบน Breadboard เมื่อเทียบกับแผนผัง Fritzing นั่นเป็นเพราะในตอนแรก ผมต้องการให้สาย Sensor "0" แยกออกจาก Ladder network (เพื่อการทดลอง) ผมจึงใช้สาย Sensor แบบ 3 เส้น ในขณะที่การออกแบบขั้นสุดท้ายใช้เพียง 2 เส้นเท่านั้น

ผมสนใจที่จะทราบว่ามีใครกำลังจะนำโปรเจกต์นี้ไปสร้างตามหรือไม่

พัฒนาและผลิตโดย Pierre Pennings (ธันวาคม 2018)

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: arduino-esp32-diy-water-level-sensor-and-diy-level-indicator-a8d507
1120 บาท
PromptPay QR Code