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

Cảm biến độ ẩm đất là một giải pháp được ứng dụng trong lĩnh vực nông nghiệp như chăm sóc cây trồng, giúp giám sát và điều chỉnh mức độ ẩm trong đất một cách chính xác và hiệu quả. Việc sử dụng cảm biến đất không chỉ mang lại lợi ích về tiết kiệm nước và tối ưu hóa việc tưới tiêu, mà còn giúp nâng cao hiệu suất cây trồng và bảo vệ môi trường.
Thông qua bài viết này sẽ giới thiệu về lợi ích của cảm biến đo độ ẩm đất và cách ứng dụng nó trong nông nghiệp qua đó còn giúp cho các bạn hiểu thêm cách lập trình cảm biến độ ẩm đất với Arduino.
Đọc thêm: Hướng dẫn sử dụng cảm biến độ ẩm điện dung 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 đất | 1 | Shopee | Cytron |
Dây cắm | 1 | Shopee | Cytron |
Cảm biến độ ẩm đất hoạt động như thế nào?
Nguyên lý cảm biến độ ẩm đất dựa trên sự tương tác giữa đất và điện trở. Khi đất ẩm, nước trong đất sẽ làm tăng khả năng dẫn điện của đất. Cảm biến độ ẩm đất sử dụng hai đầu cảm biến hoặc điện cực để đo điện trở của môi trường đất.

Cảm biến thường được làm từ hai đầu kim loại không rỉ như thép không gỉ hoặc đồng. Hai đầu kim loại này được chìm vào đất để tiếp xúc với đất xung quanh. Khi đất ẩm, nước trong đất sẽ tạo thành một lớp dẫn điện xung quanh các đầu kim loại, làm tăng khả năng dẫn điện của môi trường.
Cảm biến sẽ đo điện trở giữa hai đầu kim loại để xác định mức độ ẩm của đất. Khi đất khô, điện trở sẽ cao vì không có nước để tạo dẫn điện. Ngược lại, khi đất ẩm, điện trở sẽ thấp hơn do sự dẫn điện của nước trong đất.
Đọc thêm: Phát hiện mưa (Rain Sensor) sử dụng NodeMCU ESP8266
Tổng quan về phần cứng
Đầu cảm biến

Đầu cảm biến là phần tiếp xúc trực tiếp với đất để đo độ ẩm. Thường là hai đầu kim loại không rỉ như thép không gỉ hoặc đồng được chìm vào đất. Hai đầu kim loại này tạo ra một không gian tiếp xúc với đất, cho phép nước trong đất tương tác với chúng.
Module
Module cảm biến độ ẩm đất sử dụng một mạch so sánh LM393 để so sánh tín hiệu đầu ra từ bộ điện cực với một ngưỡng (threshold). Khi độ ẩm của đất vượt qua ngưỡng đã được cài đặt, mạch so sánh sẽ tạo ra tín hiệu đầu ra để biểu thị trạng thái độ ẩm của đất.

Để module hoạt động, thông thường nó sẽ được cung cấp nguồn điện DC từ 3.3V đến 5V. Có thể lấy trực tiếp từ board Arduino.
Sơ đồ chân cảm biến độ ẩm đất
Module cảm biến độ ẩm đất có 4 chân như hình bên dưới:

- VCC: Chân cung cấp nguồn cho cảm biến (thường là 3.3V hoặc 5V).
- GND: Chân đất (Ground).
- AO (Analog Output): Chân đầu ra analog, cung cấp tín hiệu analog tương ứng với độ ẩm của đất.
- DO (Digital Output): Chân đầu ra Digital, tạo ra tín hiệu số để biểu thị trạng thái độ ẩm của đất.
Đo độ ẩm của đất sử dụng chân Analog (A0)
Trong thí nghiệm đầu tiên này mình sẽ dùng một chân Analog (AO) để tìm ra các giá trị ngưỡng của cảm biến đất, hãy cùng mình thí nghiệm dự án thú vị này nhé.
Sơ đồ đấu nối
Chân Analog Output (AO) của cảm biến độ ẩm đất được kết nối đến chân A0 của board Arduino Uno R3. Chân VCC 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 module cảm biến độ ẩm đất này là tuổi thọ sẽ ngắn hơn khi thường xuyên tiếp xúc với độ ẩm. Việc liên tục cấp điện cho cảm biến trong khi chôn trong đất làm tăng tốc độ ăn mò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 sẽ đấu nối chân nguồn của cảm biến với chân Digital trên Arduino và đặt nó ở mức CAO hoặc THẤP khi cần. Vì vậy, mình sẽ nối chân VCC với chân số 7 của Arduino.

Cách tìm các giá trị ngưỡng của cảm biến đất
Dưới đây là một đoạn Code dùng để đọc giá trị từ chân Analog (A0) và hiển thị giá trị đó trên Serial Monitor.
// Sensor pins #define sensorPower 7 #define sensorPin A0 void setup() { pinMode(sensorPower, OUTPUT); // Initially keep the sensor OFF digitalWrite(sensorPower, LOW); Serial.begin(9600); } void loop() { //get the reading from the function below and print it Serial.print("Analog output: "); Serial.println(readSensor()); delay(1000); } // This function returns the analog soil moisture measurement int readSensor() { digitalWrite(sensorPower, HIGH); // Turn the sensor ON delay(10); // Allow power to settle int val = analogRead(sensorPin); // Read the analog value form sensor digitalWrite(sensorPower, LOW); // Turn the sensor OFF return val; // Return analog moisture value }
Để xác định giá trị ngưỡng, chúng ta sẽ đặt cảm biến độ ẩm đất vào hai trạng thái khác nhau, chẳng hạn là “đất khô” và “đất ẩm”. Theo dõi giá trị xuất hiện trên Serial Monitor khi cảm biến độ ẩm đất arduino ở mỗi trạng thái. Sau khi quan sát thì mình đưa ra 2 giá trị ngưỡng như sau:
- Đất khô khoảng 850
- Đất ẩm ướt khoảng 400

Xem ngay: Cảm biến độ ẩm | Hệ thống tưới tự động sử dụng Arduino
Code demo
Dưới đây sẽ là một ví dụ sử dụng ngưỡng để đo độ ẩm của đất:
- < 500 là ẩm ướt
- 500-750 trong phạm vi không cần tưới
- > 750 đất khô cần phải tưới
/* Change these values based on your calibration values */ #define soilWet 500 // Define max value we consider soil 'wet' #define soilDry 750 // Define min value we consider soil 'dry' // Sensor pins #define sensorPower 7 #define sensorPin A0 void setup() { pinMode(sensorPower, OUTPUT); // Initially keep the sensor OFF digitalWrite(sensorPower, LOW); Serial.begin(9600); } void loop() { //get the reading from the function below and print it int moisture = readSensor(); Serial.print("Analog Output: "); Serial.println(moisture); // Determine status of our soil if (moisture < soilWet) { Serial.println("Status: Soil is too wet"); } else if (moisture >= soilWet && moisture < soilDry) { Serial.println("Status: Soil moisture is perfect"); } else { Serial.println("Status: Soil is too dry - time to water!"); } delay(1000); // Take a reading every second for testing // Normally you should take reading perhaps once or twice a day Serial.println(); } // This function returns the analog soil moisture measurement int readSensor() { digitalWrite(sensorPower, HIGH); // Turn the sensor ON delay(10); // Allow power to settle int val = analogRead(sensorPin); // Read the analog value form sensor digitalWrite(sensorPower, LOW); // Turn the sensor OFF return val; // Return analog moisture value }
Các bạn có thể theo dõi các ngưỡng giá trị qua Serial Monitor.

Đo độ ẩm của đất sử dụng chân Digital (D0)
Tiếp theo, trong thí nghiệm này thay vì sử dụng chân Analog, mình sẽ dùng một chân Digital của Arduino để xác định ngưỡng của cảm biến độ ẩm đất, hãy cùng theo chân mình để tìm hiểu sự khác biệt giữa Analog và Digital nhé.
Sơ đồ đấu nối
Tương tự như sơ đồ trên, chân VCC của cảm biến được kết nối chân số 7 của Arduino, và chân GND của cảm biến được kết nối đến chân GND và chân dùng để đọc tín hiệu mình sẽ dùng chân số 8 trên board Arduino Uno R3 nhé.

Đặt giá trị ngưỡng cho cảm biến độ ẩm đất
Trên module cảm biến độ ẩm đất có một biến trở dùng để đặt ngưỡng độ ẩm, tín hiệu sẽ xuất ra mức THẤP và trạng thái đèn LED sáng lên (Đất ẩm ướt) và ngược lại.

Code demo
// Sensor pins #define sensorPower 7 #define sensorPin 8 void setup() { pinMode(sensorPower, OUTPUT); // Initially keep the sensor OFF digitalWrite(sensorPower, LOW); Serial.begin(9600); } void loop() { //get the reading from the function below and print it int val = readSensor(); Serial.print("Digital Output: "); Serial.println(val); // Determine status of our soil moisture situation if (val) { Serial.println("Status: Soil is too dry - time to water!"); } else { Serial.println("Status: Soil moisture is perfect"); } delay(1000); // Take a reading every second for testing // Normally you shoul take reading perhaps every 12 hours Serial.println(); } // This function returns the analog soil moisture measurement int readSensor() { digitalWrite(sensorPower, HIGH); // Turn the sensor ON delay(10); // Allow power to settle int val = digitalRead(sensorPin); // Read the analog value form sensor digitalWrite(sensorPower, LOW); // Turn the sensor OFF return val; // Return analog moisture value }
Đây là kết quả, trạng thái của cảm biến độ ẩm đất sẽ xuất hiện qua Serial Monitor.
