Cách thức hoạt động của cảm biến mực nước (Water Sensor) với Arduino

Cách thức hoạt động của cảm biến mực nước (Water Sensor) với Arduino

Cảm biến mực nước chất lỏng không chỉ là một cảm biến được ứng dụng rất nhiều trong việc học tập của học sinh và sinh viên. Với khả năng đo lường và theo dõi mức nước chính xác, cảm biến này tạo ra một môi trường học tập thú vị và cung cấp những trải nghiệm thực tế trong việc nghiên cứu. Thông qua bài viết các bạn sẽ nắm được cảm biến mức nước hoạt động như thế nào, cách tìm ra các giá trị ngưỡng để xây dựng các dự án thú vị.

Đọc thêm: Sử dụng cảm biến nước mưa (Rain Water Sensor) với Arduino

Các 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 mực nước 1 Shopee | Cytron
Dây cắm 1 Shopee | Cytron
Breadboard 1 Shopee | Cytron
Đèn LED 3 Shopee | Cytron
Điện trở 220R 3 Shopee | Cytron

Cảm biến mực nước hoạt động như thế nào?

Cảm biến mực nước chất lỏng là loại cảm biến dùng để đo mức nước hoặc chất lỏng trong bồn, hồ chứa, bể bơi hoặc trong các hệ thống khác. Cảm biến này hoạt động dựa trên nguyên lý đổi kháng (resistive sensing).

Cảm biến mức nước thường bao gồm các thanh kim loại song song, được đặt trong chất lỏng cần đo mức nước. Khi mức nước tăng lên và chạm vào thanh kim loại, dòng điện sẽ chạy qua một đường dẫn điện trở giữa hai thanh kim loại. Điện trở này thay đổi tùy thuộc vào mức độ tiếp xúc của chất lỏng với thanh kim loại. Cuối cùng, giá trị điện trở này sẽ được chuyển đổi sang tín hiệu điện tử, thông qua bộ chuyển đổi tương tự (ADC), để đo được mức nước.

Tùy thuộc vào mức độ tiếp xúc của chất lỏng, giá trị điện trở sẽ thay đổi, giúp cho việc đo mức nước trở nên dễ dàng và chính xác.

Tổng quan về phần cứng

Cảm biến mực nước chất lỏng có cấu tạo đơn giản gồm các thanh kim loại song song được đặt trong chất lỏng cần đo mức. Các thanh kim loại này làm nhiệm vụ tiếp xúc trực tiếp với chất lỏng để đo mức nước.

Phía trên mạch có một đèn LED nguồn, sẽ sáng lên khi cảm biến được cấp nguồn.

Sơ đồ chân cảm biến mực nước

Cảm biến mức nước có sơ đồ chân khá đơn giản, bao gồm 3 chân, VCC, GND và S (Signal).

  • Chân + (VCC): Kết nối đến nguồn điện 3.3V đến 5V
  • Chân – (GND): Kết nối đến chân đất (GND)
  • Chân S: Kết nối đến chân đầu ra, truyền tín hiệu đo mức nước

Sơ đồ đấu nối cảm biến mực nước với Arduino

Mình sẽ sử dụng chân S của cảm biến mực nước kết nối đến chân A0 của board Arduino Uno R3. Chân (+) của cảm biến được kết nối đến nguồn cấp 5V của Arduino, và chân GND của cảm biến được kết nối đến chân GND.

Tuy nhiên, một vấn đề của cảm biến đo mực nước giống như cảm biến nước mưa cảm biến độ ẩm đất là tuổi thọ sẽ ngắn hơn khi thường xuyên tiếp xúc với môi trường nước. Việc liên tục cấp điện cho cảm biến làm tăng tốc độ ăn mòn của cảm biến.

Để hạn chế vấn này, chỉ nên bật cảm biến khi đọc kết quả.

Vì vậy thay vì đấu chân (+) —> 5V của Arduino mình sẽ nối chân nguồn của cảm biến với chân Digital (7) và đặt nó ở mức CAO hoặc THẤP khi cần.

Đọc thêm: Sử dụng cảm biến độ ẩm đất (Soil Moisture Sensor) với Arduino

Code cảm biến mực nước

Dưới đây sẽ là một đoạn Code mẫu cách in giá trị của cảm biến đo mức nước Arduino lên màn hình.

// Sensor pins
#define sensorPower 7
#define sensorPin A0

// Value for storing water level
int val = 0;

void setup() {
	// Set D7 as an OUTPUT
	pinMode(sensorPower, OUTPUT);
	
	// Set to LOW so no power flows through the sensor
	digitalWrite(sensorPower, LOW);
	
	Serial.begin(9600);
}

void loop() {
	//get the reading from the function below and print it
	int level = readSensor();
	
	Serial.print("Water level: ");
	Serial.println(level);
	
	delay(1000);
}

//This is a function used to get the reading
int readSensor() {
	digitalWrite(sensorPower, HIGH);	// Turn the sensor ON
	delay(10);				// wait 10 milliseconds
	val = analogRead(sensorPin);		// Read the analog value form sensor
	digitalWrite(sensorPower, LOW);		// Turn the sensor OFF
	return val;				// send current reading
}

Như vậy là các bạn cũng đã thấy sự thay đổi của cảm biến, khi không có nước cảm biến sẽ ở mức 0, và giá trị tăng khi mực nước dần dần tăng lên.

Giải thích Code

// Sensor pins
#define sensorPower 7
#define sensorPin A0

Khai báo các chân cho cảm biến mực nước. sensorPower là chân được sử dụng để cung cấp nguồn cho cảm biến và sensorPin là chân được sử dụng để đọc giá trị analog từ cảm biến.

void setup() {
	// Set D7 as an OUTPUT
	pinMode(sensorPower, OUTPUT);
	
	// Set to LOW so no power flows through the sensor
	digitalWrite(sensorPower, LOW);
	
	Serial.begin(9600);
}

Trong hàm setup(), đặt chân sensorPower là OUTPUT và đặt nó ở mức LOW để không có dòng điện đi qua cảm biến. Khởi tạo giao tiếp Serial với tốc độ 9600 baud.

void loop() {
	//get the reading from the function below and print it
	int level = readSensor();
	
	Serial.print("Water level: ");
	Serial.println(level);
	
	delay(1000);
}

Trong hàm loop(), gọi hàm readSensor() để đọc giá trị mức nước từ cảm biến. Giá trị đọc được in ra bằng cách sử dụng Serial để hiển thị trên cổng nối tiếp.

int readSensor() {
	digitalWrite(sensorPower, HIGH);	// Turn the sensor ON
	delay(10);				// wait 10 milliseconds
	val = analogRead(sensorPin);		// Read the analog value form sensor
	digitalWrite(sensorPower, LOW);		// Turn the sensor OFF
	return val;				// send current reading
}

Hàm readSensor() được sử dụng để đọc giá trị từ cảm biến. Đầu tiên, bật nguồn cho cảm biến bằng cách đặt chân sensorPower ở mức HIGH. Sau đó, chờ 10 milliseconds để cho cảm biến ổn định. Tiếp theo, sử dụng hàm analogRead() để đọc giá trị analog từ chân sensorPin và lưu trữ giá trị đọc vào biến val. Cuối cùng, tắt nguồn cảm biến mực nước bằng cách đặt chân sensorPower ở mức LOW và trả về giá trị đọc hiện tại.

Tìm các giá trị ngưỡng

Để tìm các giá trị ngưỡng của cảm biến ta thực hiện các bước sau:

Chuẩn bị một số mẫu chất lỏng với các mức khác nhau, chẳng hạn như không có nước, mức nước trung bình và mức nước cao.

Kết nối cảm biến đo mức nước chất lỏng với Arduino và thực hiện đo lường từ cảm biến, ghi lại giá trị đọc tương ứng với từng mức nước.

Sau một số thử nghiệm thì mình đưa ra các giá trị ngưỡng như sau:

  • Không có nước (0)
  • Mức nước trung bình (~420)
  • Mức nước cao (~520)

Dự án Arduino: cảnh báo mực nước bằng đèn LED

Sau khi tìm được các giá trị ngưỡng của cảm biến mực nước, ta sẽ sử dụng vào thực hiện một dự án đo mức nước và cảnh qua thông qua 3 đèn LED.

Sơ đồ đấu nối

Nó giống như sơ đồ đấu nối trong phần demo ở trên, nhưng ở đây mình sẽ mắc thêm 3 đèn LED vào các chân 2, 3, 4 để thực hiện việc cảnh báo khi giá trị ngưỡng ở các mức tương ứng.

Code

Các bạn cần quan tâm đến hai biến: lowerThresholdupperThreshold dùng để thiết lập ngưỡng cho cảm biến mực nước

Nếu đầu ra giảm dưới ngưỡng, đèn LED màu đỏ sẽ sáng lên, nếu nó tăng lên trên ngưỡng, đèn LED màu xanh lá cây sẽ sáng và nếu ở giữa, đèn LED màu vàng sẽ sáng.

/* Change these values based on your calibration values */
int lowerThreshold = 420;
int upperThreshold = 520;

// Sensor pins
#define sensorPower 7
#define sensorPin A0

// Value for storing water level
int val = 0;

// Declare pins to which LEDs are connected
int redLED = 2;
int yellowLED = 3;
int greenLED = 4;

void setup() {
	Serial.begin(9600);
	pinMode(sensorPower, OUTPUT);
	digitalWrite(sensorPower, LOW);
	
	// Set LED pins as an OUTPUT
	pinMode(redLED, OUTPUT);
	pinMode(yellowLED, OUTPUT);
	pinMode(greenLED, OUTPUT);

	// Initially turn off all LEDs
	digitalWrite(redLED, LOW);
	digitalWrite(yellowLED, LOW);
	digitalWrite(greenLED, LOW);
}

void loop() {
	int level = readSensor();

	if (level == 0) {
		Serial.println("Water Level: Empty");
		digitalWrite(redLED, LOW);
		digitalWrite(yellowLED, LOW);
		digitalWrite(greenLED, LOW);
	}
	else if (level > 0 && level <= lowerThreshold) {
		Serial.println("Water Level: Low");
		digitalWrite(redLED, HIGH);
		digitalWrite(yellowLED, LOW);
		digitalWrite(greenLED, LOW);
	}
	else if (level > lowerThreshold && level <= upperThreshold) {
		Serial.println("Water Level: Medium");
		digitalWrite(redLED, LOW);
		digitalWrite(yellowLED, HIGH);
		digitalWrite(greenLED, LOW);
	}
	else if (level > upperThreshold) {
		Serial.println("Water Level: High");
		digitalWrite(redLED, LOW);
		digitalWrite(yellowLED, LOW);
		digitalWrite(greenLED, HIGH);
	}
	delay(1000);
}

//This is a function used to get the reading
int readSensor() {
	digitalWrite(sensorPower, HIGH);
	delay(10);
	val = analogRead(sensorPin);
	digitalWrite(sensorPower, LOW);
	return val;
}

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments