Giao tiếp cảm biến lưu lượng nước với màn hình LCD 16×2 và Arduino
Trong hướng dẫn này, các bạn sẽ sử dụng Arduino để đọc tín hiệu từ cảm biến lưu lượng nước và hiển thị kết quả lưu lượng lên màn hình LCD 16×2. Cảm biến đo lưu lượng nước sẽ gửi tín hiệu xung tương ứng với lưu lượng qua chân kết nối với Arduino. Arduino sẽ đếm số xung và tính toán lưu lượng nước dựa trên công thức và thông số kỹ thuật của cảm biến.
Sau đó, Arduino sẽ gửi thông tin lưu lượng nước đến màn hình LCD 16×2 để hiển thị. Với sự kết hợp giữa cảm biến lưu lượng dòng chảy, Arduino và màn hình LCD 16×2, các bạn có thể tạo ra một giao diện đơn giản và trực quan để theo dõi lưu lượng nước một cách dễ dàng và thuận tiện.
Linh kiện cần thiết cho dự án
TÊN LINH KIỆN | SỐ LƯỢNG | NƠI BÁN |
Arduino Uno R3 | 1 | Shopee | Cytron |
Cảm biến đo lưu lượng nước YFS201 | 1 | Shopee | Cytron |
Màn hình LCD 16×2 | 1 | Shopee | Cytron |
Biến trở vuông 10K | 1 | Shopee | Cytron |
Điện trở 220R | 1 | Shopee | Cytron |
Dây cắm | 10-20 | Shopee | Cytron |
Breadboard | 1 | Shopee | Cytron |
Tổng quan về cảm biến lưu lượng nước YFS201
Cảm biến đo lưu lượng nước YFS201 là một loại cảm biến dùng để đo và theo dõi lưu lượng nước chảy qua ống dẫn. Nó được sử dụng rộng rãi trong các ứng dụng liên quan đến giám sát và điều khiển lưu lượng nước trong các hệ thống thủy lực, hệ thống làm mát, hệ thống cấp nước và các ứng dụng công nghiệp khác.
Thông số kỹ thuật
- Điện áp hoạt động: 5V DC
- Dòng tiêu thụ: ≤15mA
- Dải lưu lượng: 1-30L/phút
- Độ chính xác: ±3%
- Đầu ra tín hiệu: Tín hiệu xung tương ứng với lưu lượng nước
- Kết nối: 3 chân (Vcc, GND, Output)
- Vật liệu vỏ: Nhựa ABS
- Nhiệt độ hoạt động: 0-80°C
- Áp suất làm việc tối đa: 1.75MPa
- Tuổi thọ: ≥10 triệu lần
Nguyên lý hoạt động cảm biến lưu lượng nước YFS201
Cảm biến lưu lượng nước dựa trên nguyên lý cảm ứng từ Hall là một thiết bị được sử dụng để đo lưu lượng nước trong các ứng dụng và hệ thống khác nhau. Cảm biến này sử dụng hiện tượng Hall để phát hiện và đo lượng dòng chảy của nước trong ống dẫn.
Nguyên lý hoạt động của cảm biến lưu lượng nước Hall dựa trên sự thay đổi trong từ trường khi dòng chảy nước qua một dây dẫn dạng ống. Cảm biến chứa một cặp nam châm và hai điện cực Hall. Khi nước chảy qua ống, nó tạo ra một từ trường. Dòng chảy của nước sẽ tác động lên từ trường và tạo ra một tín hiệu điện tương ứng.
Sơ đồ chân cảm biến đo lưu lượng nước YFS201
- Dây đỏ: Chân VCC thường được cấp nguồn 5V
- Dây đen: Chân GND, được nối đất
- Dây vàng: Chân tín hiệu đầu ra, thường được kết nối với Arduino
Sơ đồ đấu nối cảm biến lưu lượng nước với Arduino
Sơ đồ đấu nối màn hình LCD 16×2 với Arduino Uno R3
LCD 16X2 | Arduino |
---|---|
D4 – D7 | 9, 10, 11, 12 |
E | 7 |
RS | 4 |
VEE | POT (Middle Leg) |
VSS | Ground |
VDD | +5V |
D+ | +5V |
D- | Ground |
Sơ đồ đấu nối Arduino với cảm biến lưu lượng nước YFS201
Arduino | Water Flow Sensor |
---|---|
D2 | Signal Output |
5V | VCC |
GND | GND |
Code cảm biến lưu lượng nước
Đoạn code này cho phép Arduino đọc tín hiệu từ cảm biến lưu lượng dòng chảy YF-S201 và tính toán tỷ lệ dòng chảy của nước. Kết quả được hiển thị trên màn hình LCD 16×2 và gửi thông qua giao tiếp Serial để theo dõi trên máy tính.
/*YF- S201 water Flow sensor code for Arduino */ #include <LiquidCrystal.h> LiquidCrystal lcd(4, 7, 9, 10, 11, 12); const int Output_Pin = 2; volatile int Pulse_Count; unsigned int Liter_per_hour; unsigned long Current_Time, Loop_Time; void setup() { pinMode(Output_Pin, INPUT); Serial.begin(9600); attachInterrupt(0, Detect_Rising_Edge, FALLING); Current_Time = millis(); Loop_Time = Current_Time; lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0,0); lcd.print("Water Flow Meter"); lcd.setCursor(0,1); lcd.print("ArduinoKIT"); } void loop () { Current_Time = millis(); if(Current_Time >= (Loop_Time + 1000)) { Loop_Time = Current_Time; Liter_per_hour = (Pulse_Count * 60 / 7.5); if(Pulse_Count != 0){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Rate: "); lcd.print(Liter_per_hour); lcd.print(" L/M"); Pulse_Count = 0; Serial.print(Liter_per_hour, DEC); Serial.println(" Liter/hour"); } else { Serial.println(" flow rate = 0 "); lcd.clear(); lcd.setCursor(0,0); lcd.print("Rate: "); lcd.print( Liter_per_hour ); lcd.print(" L/M"); } } } void Detect_Rising_Edge () { Pulse_Count++; }
Giải thích code
#include <LiquidCrystal.h>
Được sử dụng để khai báo thư viện LiquidCrystal để điều khiển màn hình LCD 16×2.
LiquidCrystal lcd(4, 7, 9, 10, 11, 12); const int Output_Pin = 2;
Khai báo đối tượng LiquidCrystal với các chân kết nối của LCD Arduino được định nghĩa là 4, 7, 9, 10, 11 và 12.
Khai báo chân đầu ra của cảm biến đo lưu lượng nước, ở đây là chân D2.
volatile int Pulse_Count; unsigned int Liter_per_hour; unsigned long Current_Time, Loop_Time;
Khai báo biến và khởi tạo giá trị ban đầu.
void setup() { pinMode(Output_Pin, INPUT); Serial.begin(9600); attachInterrupt(0, Detect_Rising_Edge, FALLING); Current_Time = millis(); Loop_Time = Current_Time; lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0,0); lcd.print("Water Flow Meter"); lcd.setCursor(0,1); lcd.print("ArduinoKIT"); }
Cấu hình các chân và các thao tác khởi tạo ban đầu của Arduino, cài đặt ngắt và hiển thị thông báo trên màn hình LCD 16×2.
void loop () { Current_Time = millis(); if(Current_Time >= (Loop_Time + 1000)) { Loop_Time = Current_Time; Liter_per_hour = (Pulse_Count * 60 / 7.5); if(Pulse_Count != 0){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Rate: "); lcd.print(Liter_per_hour); lcd.print(" L/M"); Pulse_Count = 0; Serial.print(Liter_per_hour, DEC); Serial.println(" Liter/hour"); } else { Serial.println(" flow rate = 0 "); lcd.clear(); lcd.setCursor(0,0); lcd.print("Rate: "); lcd.print( Liter_per_hour ); lcd.print(" L/M"); } } }
Vòng lặp chính của chương trình. Tính toán tỷ lệ dòng chảy của nước và hiển thị trên màn hình LCD 16×2. Nếu không có dòng chảy nước, hiển thị thông báo và giá trị 0.
void Detect_Rising_Edge () { Pulse_Count++; }
Hàm ngắt được kích hoạt bởi sự thay đổi của chân đầu ra của cảm biến lưu lượng dòng chảy. Mỗi khi có sự thay đổi, biến Pulse_Count
sẽ được tăng lên.
Cái này hay quá, cảm ơn bạn chia sẻ, mà mình thấy có một vấn đề là khi mất điện thì khối lượng thể tích nước (lít) sẽ chạy lại từ 0, bạn có cách nào để khi có điện trở lại thì thể tích nước sẽ đếm tiếp không.