Dự án bật tắt máy bơm nước - Tự bơm nước khi hết nước - Sử dụng module relay và siêu âm

Thấy bài viết của bạn Hải Đăng PPK khá hay, cũng nói đến về dự án bật tắt đơn giản nhưng đúng nhu cầu. Mình đã làm thành công, tuy nhiên, mình dùng một cảm biến siêu âm để bơm nước cho cái thùng nước nhà mình. Cảm ơn Hải Đăng PPK nhiều nhiều nhé!

I. Nguyên lý

Mình sẽ đi thẳng vào vấn đề nguyên lý để giúp bạn có cái nhìn rõ ràng luôn. Mình sẽ đặt cảm biến siêu âm ở trên nắp thùng, nó sẽ kiểm tra độ cao tương đối giữa nó và mực nước trong thùng. Nếu nó vượt ngưỡng cao thì ngừng bơm nước (nếu đang bơm nước) và vượt ngưỡng thấp thì bơm nước nếu đang ngưng bơm nước.

II. Phần cứng

III. Nối mạch

Arduino Module Relay Module siêu âm
5V 5V 5V
GND GND GND
7 Tín hiệu  
2   Trig
3   Echo

IV. Lập trình

Các bạn nhớ cài thư viện I2C LCD nhé, tìm trên cộng đồng một tí là ra thôi ạ!

//1 Mach Arduino Nano
//1 Cam bien khoang cach (HC-SR04)
//1 Man hinh lcd 16X2 (su dung i2c lcd)
//1 Relay (5 V)
//Code chinh sua va viet lai boi Kenny Nguyen (Toi yeu Arduino)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#define BACKLIGHT_PIN     13
const int chipSelect = 4;
#define trigPin 2 // Chan triger cua cam bien gan vao pin so 3 cua arduino
#define echoPin 3  // chan echo cua cam bien gan vao pin so 3 cua arduino
#define re1 7 // pin for relay
//#define re2 8
#define lenght 16.0 // chieu dai 16 cot cua man hinh
double percent = 100.0;
unsigned char b;
unsigned int peace;

int i = 0;

uint8_t bar0[8]  =
{
	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
};
uint8_t bar1[8]  =
{
	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10
};
uint8_t bar2[8]  =
{
	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18
};
uint8_t bar3[8]  =
{
	0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C
};
uint8_t bar4[8]  =
{
	0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E
};
uint8_t bar5[8]  =
{
	0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F
};
LiquidCrystal_I2C lcd(0x27, 16, 2);  // thiet lap man hinh dia chi LCD 0x20 cho 16 ki tu va hien thi 2 dong tren man hinh
int secs = 0;
int secs2 = 0;
int mins = -1;
int hrs = 0;
boolean isAM = true;

int milliDivSecs = 1000;
int milliDivMins = 60000;
int milliDivHrs = 360000;

unsigned long prevmillis = 0;

int interval = 1000;

void setup()
{
	Serial.begin(9600);
	pinMode(trigPin, OUTPUT);
	pinMode(echoPin, INPUT);
	pinMode(re1, OUTPUT);
	pinMode(13, OUTPUT);
	while(!Serial);
	Serial.println("Khoi tao hoan tat");
	lcd.init();
	     // khoi tao man hinh LCD
	lcd.backlight();
	lcd.createChar(0, bar0);
	lcd.createChar(1, bar1);
	lcd.createChar(2, bar2);
	lcd.createChar(3, bar3);
	lcd.createChar(4, bar4);
	lcd.createChar(5, bar5);

}

void loop()
{
	{
		Serial.print(hrs);
		Serial.print(" : ");
		Serial.print(mins);
		Serial.print(" : ");
		Serial.print(secs);
		Serial.print(" , ");
	}

	unsigned long currmillis = millis();
	long duration, distance;
	digitalWrite(trigPin, LOW);
	delayMicroseconds(2);
	digitalWrite(trigPin, HIGH);
	delayMicroseconds(10);
	digitalWrite(trigPin, LOW);
	duration = pulseIn(echoPin, HIGH);
	distance = (duration / 2) / 29.1;
// thiet lap muc nuoc su dung xuong 30 cm thi tu dong bat relay
	if (distance >= 30)
	{
		digitalWrite (re1, HIGH);
		digitalWrite (13 , HIGH);

		Serial.print(" ON ");
		lcd.setCursor(14, 0);
		lcd.print("ON");
	}
// thiet lap muc nuoc len den 10 cm thi tu dong tat relay
	if (distance < 10)
	{
		digitalWrite (re1, LOW);
		digitalWrite (13, LOW);

		Serial.print(" OF ");
		lcd.setCursor(14, 0);
		lcd.print("OF");
	}

	lcd.setCursor(0, 0);
	lcd.print(distance);
	Serial.print(distance);
	Serial.print(" CM , ");
	percent = ((30. - distance) / 30.) * 100.;
	Serial.print(percent);

	Serial.println(" %");
	lcd.print(" CM-");
	lcd.print(percent);
	lcd.print("%");
	lcd.setCursor(0, 1);

	double a = lenght / 100.*percent;
	if (a >= 1)
	{
		for (int i = 1; i < a; i++)
		{
			lcd.write(5);
			b = i;
		}
		a = a - b;
	}
	peace = a * 5;

	switch (peace)
	{
		case 0:
			break;
		case 1:
			lcd.write(0);
			break;
		case 2:
			lcd.write(1);
			break;
		case 3:
			lcd.write(2);
			break;
		case 4:
			lcd.write(3);
			break;
		case 5:
			lcd.write(4);
			break;
		case 6:
			lcd.write(5);
			break;
	}

	for (int i = 0; i < (lenght - b); i++)
	{
		lcd.print(" ");
	}
	delay (1000);
	if(secs == 0)
	{
		mins = mins + 1;
		updateMin();
	}



	secs = (millis() / milliDivSecs) % 60;

}

void updateMin()
{
	if(mins > 59)
	{
		hrs = hrs + 1;
		updateHrs();
		if(hrs == 11 && mins > 59)
		{

		}
		mins = 0;
	}
}
void updateHrs()
{


	if(hrs > 12)
	{

		hrs = 1;
	}
}

V. Kết luận

Chúc các bạn thành công với dự án này! Thật hạnh phúc khi thấy cộng đồng ngày càng phát triển, mình muốn đóng góp một tí, mong các bạn đừng ngại comment nhé!

Youtube: 
Demo
Những hình ảnh về dự án: 
Bài viết truyền cảm hứng: 
lên
20 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Xe điều khiển bằng tay game Dual Shock3 thông qua Bluetooth

Vừa bắt đầu với arduino được hơn 1 tuần, có tham khảo qua các nguồn từ "trung ương đến địa phương", nắm được 1 số kiến thức cơ bản nên mình bắt đầu thực hiện 1 sản phẩm để đúc kết kinh nghiệm. Trong số đó thì xe điều khiển là dễ nhất. Kết hợp với cái tay game ps3 nằm lăn lóc ở góc nhà. Thế là có 1 chiếc xe điều khiển từ xa. Bắt đầu nhé.

lên
17 thành viên đã đánh giá bài viết này hữu ích.

Làm xe điều khiển từ xa bằng Bluetooth - Điều khiển bằng Android với App Inventor

Mình rất thích điện tử nhưng không học về ngành điện tử. Rất may là có Adruino, rồi có cộng đồng Adruino Việt Nam, đặc biệt là sự nhiệt tình của tất cả các bạn trong cộng đồng, mình đã làm được 1 chiếc xe điều khiển từ xa. Cho con chơi là lí do phụ thôi, còn tìm hiểu, học tập là chính. Hôm nay chia sẻ cùng các bạn, cùng gửi lời cảm ơn đến tất cả các bạn trong cộng đồng. Có bạn thì giúp đỡ trực tiếp, có bạn thì viết bài, rồi có bạn thì bình luận, nêu câu hỏi. Tất cả đều có giá trị đối với mình.

Ngại viết bài nên mình đăng dưới dạng ảnh.

lên
26 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Lập trình Arduino bằng Javascript trong môi trường NodeJS - Chuyện thật hay đùa?

Hồi giờ đã nghe đến việc lập trình Arduino bằng C/C++, đã nghe đến việc lập trình Arduino kéo thả, tôi tự hỏi, liệu có thể dùng Javascript trong môi trường NodeJS - môi trường lập trình thần thánh hiện nay với lượng thư viện đến hơn 1 triệu trên toàn bộ thế giới này - để lập trình cho con Arduino cùi bắp của mình hay không? Và hãy tin tôi đi, bạn sẽ bất ngờ!

lên
12 thành viên đã đánh giá bài viết này hữu ích.

Hướng dẫn sử dụng cảm biến nhiệt độ DS18B20 (-55°C đến +125°C) sai số ±0.5°C

Lại quay về vấn đề đo nhiệt độ, như ở bài trước, mình đã dùng cả LM35, cả TMP36. Nhưng rốt cuộc vẫn không hiệu quả, lần này mình đang sử dụng con DS18B20 này và cảm thấy khá ổn hơn so với lần trước. Nhiệt độ ít bị chênh lệch hơn và như quảng cáo là chỉ có sai số ±0.5°C thôi (nếu nhiệt độ trong phạm vi -10°C to +85°C, đáng để thử phải không nào?

lên
18 thành viên đã đánh giá bài viết này hữu ích.