MẠCH ĐO VÀ HIỂN THỊ MỰC NƯỚC SỬ DỤNG ARDUINO
Đây là mạch thông báo mực nước giúp người dùng có thể biết được lượng nước trong bể nước trên cao. Mạch có thể nâng cấp lên để kiểm soát mực nước trong bể bằng cách bật máy bơm khi mực nước ở mức thấp và tắt bơm khi mực nước ở mức cao. Do đó, mạch thông báo mực nước sử dụng Arduino giúp ngăn ngừa tình trạng thiếu nước trong bể trên cao. Mạch là sử dụng các linh kiện không dây vì vậy nó rất dễ cài đặt và có thể hoạt động tới 100 mét.
Có hai mạch được sử dụng: Mạch phát và mạch thu. Mạch phát sử dụng cảm biến siêu âm để đo mực nước theo khoảng cách. Dữ liệu này được gửi đến mạch thu bằng cách sử dụng giao tiếp RF. Mực nước được hiển thị theo tỷ lệ phần trăm trên mô-đun LCD 16 × 2, được gắn với mạch thu.
Nguyên lí làm việc
Cảm biến siêu âm được sử dụng trong mạch phát, đo khoảng cách mực nước bồn. Khoảng cách được đo bằng cm và được gửi đến mạch thu bằng giao tiếp RF.
Mạch thu nhận dữ liệu từ mạch phát và chuyển đổi theo tỷ lệ phần trăm và hiển thị trên LCD.
Cảm biến siêu âm có 2 bộ phận truyền và nhận tín hiệu là Trigger và Echo. Trigger phát ra sóng âm thanh ở tần số cao. Những sóng âm thanh này được truyền qua bồn nước từ trên xuống dưới. Khi các sóng âm chạm vào mặt nước và thì được phản xạ trở lại dưới dạng sóng Echo. Cảm biến mực nước Arduino đo khoảng thời gian truyền nhận giữa Echo và Trigger. Sau khi tính toán sẽ cho ra khoảng cách tương ứng.
Mạch phát:
Trong mạch này, cảm biến siêu âm được nối với chân D9 và D10 của Arduino. Cảm biến siêu âm được cấp nguồn bởi chân Vcc và GND, các chân này nối với chân Vcc và GND của Arduino. Dữ liệu đo được truyền đi bởi mạch phát RF. Chân Data của mạch phát RF được nối với chân D4 của Arduino Nano. Các chân Vcc và GND của mạch phát RF nối với các chân Vcc và GND của Arduino. Trong mạch phát này, Anten được sử dụng được nối với chân ANT của mạch phát RF, mạch sử dụng nguồn 9V. Nguồn này nối với chân Vin và GND của Arduino.
Mạch thu:
Trong mạch thu, Bộ thu RF nhận dữ liệu từ mạch phát. Chân Data của Bộ thu RF nối với chân D4 của Arduino. Mực nước được hiển thị trên LCD và LCD nối với Arduino từ chân D4 đến D9. LCD được cấp nguồn từ chân Vcc và GND qua Arduino. Mạch thu cũng sử dụng nguồn 9V thông qua một công tắc, được nối giữa pin Vcc và GND của Arduino. Mạch được hiển thị như hình dưới đây.
Sơ đồ mạch in PCB
Mạch thu
Mạch phát
Chương trình viết cho mạch phát
#include
#include
Ultrasonic ultrasonic(11,10);
RCSwitch mySwitch = RCSwitch();
int i;
void setup() {
mySwitch.enableTransmit(4);
}
void loop() {
i = mobitool.neting(CM);
mySwitch.send(i, 24);
delay(100);
}
Đầu tiên là khái báo các thư viện. “RCSwitch.h” được sử dụng cho bộ phát RF và “Ultrasonic.h” dùng cho cảm biến siêu âm.
Chân của cảm biến siêu âm được khai báo bằng tên Ultrasonic trong dòng 4, chân 11 là Trig và chân10 là Echo. Trong dòng 5, “RCSwitch” được khai báo cho bộ phát theo tên là “mywwitch”. Trong dòng 7, biến i được khai báo theo kiểu “int”. Bộ phát được kích hoạt bởi hàm “myww.enableTransmit (4)”, trong đó chân data của mạch phát được nối với chân D4 của Arduino.
Trong vòng lặp void, khoảng cách được đo bằng hàm “Ultrasonic.Ranging (CM)” và nó được gán theo biến i, khoảng cách này tính bằng cm.
Trong dòng 15, khoảng cách đo được truyền bởi hàm “mobitool.net (i, 24)”, trong đó, i là khoảng cách và 24 là định dạng bit. Arduino sẽ gửi dữ liệu sau mỗi 100 ms.
Chương trình viết cho mạch thu
#include
#include
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
RCSwitch mySwitch = RCSwitch();
float level;
int Hval=2;
int Lval=12;
int BUZZER = 10 ;
void setup() {
mySwitch.enableReceive(0);
lcd.begin(16, 2);
lcd.print(“WATER LEVEL INDI”);
pinMode(BUZZER,OUTPUT);
}
void loop() {
if (mySwitch.available()) {
level = mobitool.neteceivedValue();
level = level/(Lval – Hval);
level = level*100;
if (level>100) {level=100;}
lcd.setCursor(0, 1);
lcd.print(“LEVEL “);
lcd.print(level);
lcd.print(” % “);
mySwitch.resetAvailable();
}
digitalWrite(BUZZER,HIGH);
if (level > 99) {digitalWrite(BUZZER,HIGH); delay(100); digitalWrite(BUZZER,LOW); delay(100);}
else {digitalWrite(BUZZER,LOW);}
}
Đầu tiên khai báo 2 thư viện: “RC RCSwitch.h” sử dụng để liên lạc RF giữa bộ phát và bộ thu và “LiquidCstall.h” được sử dụng cho màn hình LCD.
Dòng 4, các chân Arduino được khai báo, được kết nối với LCD. Tổng cộng có 6 chân được kết nối với Arduino là D4, D5, D6, D7, D8, D9. Trong dòng 5, “RCSwitch” đã được khai báo với tên là tên “mySwitch”.
Dòng 7, biến “level” được khai báo theo kiểu “float” để hiển thị mực nước. Trong dòng 9 và 10, “Hval” và “Lval” được khai báo theo kiểu “int” trong đó, “Hval” là giá trị mức cao của mực nước và “Lval” là giá trị mức thấp của mực nước. Khai báo chân BUZZER theo kiểu “int”.
Bộ thu RF được kích hoạt bởi hàm “myww.enableReceiver (0)”, trong đó 0 là chân ngắt (INT0) và là chân D2 của Arduino.
Dòng 16, LCD kích hoạt thông qua lệnh “LCD.begin (16, 2)” và trong dòng 17, “LCD.print” có chức năng xuất ra màn hình LCD mực nước ở hàng đầu tiên của màn hình.
Dòng 19, khai báo chân BUZZER là OUTPUT.
Trong vòng lặp (void loop) nếu lệnh “if (mobitool.net Available ())” đúng, chương trình sẽ thực hiện các lệnh trong vòng lặp. Ở dòng 25, dữ liệu từ Bộ thu RF được giải mã bởi hàm “myww.getRecivingValue” và được lưu trong biến “level”.
Dòng 27 và 28, biến “Level” được xử lý và chuyển đổi thành tỷ lệ phần trăm. Dòng 30, sử dụng điều kiện của “If” để giới hạn tỷ lệ phần trăm.
Trong dòng 32, 33, 34, 35, “level” được hiện trên màn hình LCD và trong dòng 37 hàm “mobitool.net Available ()” được sử dụng để cài lại mô-đun RF.
Cuối cùng khi điều kiện “if (level > 99)” đúng thì chuông sẽ kêu trong khoảng thời gian 100ms.