I. Sơ đồ
Sơ đồ mạch của mình tương tự bài viết Arduino: Bật tắt máy bơm nước - Sử dụng module siêu âm, các bạn tham khảo thêm nhé.
Mình chỉ thêm phần hiển thị mực nước bằng LED và nút bấm để bật tắt bằng tay.
II. Đấu nối
Mô phỏng trên Proteus
III. Lập trình
III. Thành quả
Hoạt động của Project như sau:
Khi hết nước tự động bơm, khi nước đầy tự động tắt bơm (về khoảng cách mình để trong mạch là theo mô phỏng trên Proteus nhé, các bạn căn chỉnh ở thực tế và đưa vào giá trị chính xác)
Trạng thái mực nước được chỉ thị theo 6 LED (có thể mở rộng thêm nhiều LED tùy ý)
Khi ở mực nước thấp (chỉ còn 2 LED đỏ chỉ thị), 2 đèn LED đỏ sẽ nhấp nháy để cảnh báo
Có thể dùng Button để Bật hay Tắt máy bơm bất kỳ lúc nào
const int trig = 8; // chân trig của HC-SR04 const int echo = 7; // chân echo của HC-SR04 const int relay = 13; // chân máy bơm byte ledPin[] = {A5,A4,A3,A2,A1,A0}; // Mảng lưu vị trí các chân đèn LED byte pinCount; // Khai báo biến pinCount dùng cho việc lưu tổng số chân LED byte muc_nuoc = 2; int moc_tren = 780; // Thay đổi theo thực tế int moc_duoi = 330; // Thay đổi theo thực tế bool relay_status = 0; // Trạng thái relay: 0 là tắt, 1 là bật void setup() { Serial.begin(9600); // giao tiếp Serial với baudrate 9600 pinMode(trig,OUTPUT); // chân trig sẽ phát tín hiệu pinMode(echo,INPUT); // chân echo sẽ nhận tín hiệu pinMode(relay,OUTPUT); pinCount = sizeof(ledPin); // Lấy số lượng LED for (byte i=0;i<pinCount;i++) { pinMode(ledPin[i],OUTPUT); //Các chân LED là OUTPUT digitalWrite(ledPin[i],LOW); //Mặc định các đèn LED sẽ tắt } pinMode(2,INPUT_PULLUP); // Bật điện trở trong cho Pin 2, chân Button // Khởi tạo ngắt để bật tắt relay bằng tay attachInterrupt(0, bat_tat_relay, FALLING); // gọi hàm battatled liên tục khi còn nhấn nút } void loop() { unsigned long duration; // biến đo thời gian int distance; // biến lưu khoảng cách /* Phát xung từ chân trig */ digitalWrite(trig,0); // tắt chân trig delayMicroseconds(2); digitalWrite(trig,1); // phát xung từ chân trig delayMicroseconds(5); // xung có độ dài 5 microSeconds digitalWrite(trig,0); // tắt chân trig /* Tính toán thời gian */ // Đo độ rộng xung HIGH ở chân echo. duration = pulseIn(echo,HIGH); // Tính khoảng cách đến vật. distance = int(duration/2/29.412); // thiet lap muc nuoc su dung xuong moc_tren thi tu dong bat relay if (distance > moc_tren) { digitalWrite (relay, HIGH); relay_status = 1; } // thiet lap muc nuoc len den moc_duoi thi tu dong tat relay if (distance < moc_duoi) { digitalWrite (relay, LOW); relay_status = 0; } // Phần hiển thị mực nước bằng LED tat_led(); muc_nuoc = (moc_tren - distance)/((moc_tren - moc_duoi)/pinCount) + 1; // Nếu gần hết nước thì nháy LED if (muc_nuoc < 3) { delay(200); } bat_led(); /* In kết quả ra Serial Monitor */ Serial.print(distance); Serial.println("cm"); delay(200); } void tat_led() { for (byte i = 0;i < pinCount; i++) { digitalWrite(ledPin[i],LOW); // Tắt đèn } } void bat_led() { for (byte i=0; i < muc_nuoc; i++) { digitalWrite(ledPin[i],HIGH); //Bật đèn } } void bat_tat_relay() { relay_status = !relay_status; // Đảo trạng thái relay digitalWrite(relay,relay_status); // Xuất giá trị của relay }
III. Thành quả
Hoạt động của Project như sau:
Khi hết nước tự động bơm, khi nước đầy tự động tắt bơm (về khoảng cách mình để trong mạch là theo mô phỏng trên Proteus nhé, các bạn căn chỉnh ở thực tế và đưa vào giá trị chính xác)
Trạng thái mực nước được chỉ thị theo 6 LED (có thể mở rộng thêm nhiều LED tùy ý)
Khi ở mực nước thấp (chỉ còn 2 LED đỏ chỉ thị), 2 đèn LED đỏ sẽ nhấp nháy để cảnh báo
Có thể dùng Button để Bật hay Tắt máy bơm bất kỳ lúc nào
Không có nhận xét nào:
Đăng nhận xét