Trong các dự án tưới cây tự động, nông nghiệp thông minh, vườn DIY, cảm biến độ ẩm đất là thành phần gần như bắt buộc.
Thay vì dùng loại điện trở (dễ gỉ, nhanh hỏng), bài này tập trung vào Soil Moisture capacitive – ổn định và bền hơn rất nhiều.
Chúng ta sẽ:
- Đọc độ ẩm đất bằng ESP32
- Chuẩn hoá dữ liệu (%)
- Gửi dữ liệu realtime lên IoTLabs Cloud MQTT
1. Cảm biến Soil Moisture (capacitive) là gì?
Khác với loại điện trở:
- Không đo dòng điện qua đất
- Đo sự thay đổi điện dung theo độ ẩm
- Ít bị ăn mòn → dùng lâu dài ngoài trời
👉 Đây là loại nên dùng cho IoT thực tế, không chỉ demo.
2. Khi nào nên dùng cảm biến này?
Rất phù hợp cho:
- Tưới cây tự động
- Theo dõi độ ẩm chậu cây
- Nông nghiệp nhỏ / smart garden
- Outdoor IoT
Không phù hợp nếu:
- Cần độ chính xác nông nghiệp cao cấp (cảm biến công nghiệp)
3. Chuẩn bị phần cứng
Thiết bị
- ESP32-C3 SuperMini
- Cảm biến Soil Moisture capacitive
- Đất khô / đất ướt để test
Đặc điểm tín hiệu
- Output: Analog (ADC)
- Điện áp: 3.3V – 5V (đa số chạy tốt với 3.3V)
4. Nối dây cảm biến với ESP32
| Soil Sensor | ESP32-C3 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| AO | GPIO2 (ADC) |
📌 GPIO ADC có thể thay đổi tuỳ board, nhưng GPIO2 rất phổ biến.
5. Hiệu chuẩn độ ẩm đất (rất quan trọng)
Cảm biến không trả % sẵn, bạn phải tự chuẩn hoá.
Bước hiệu chuẩn
- Cắm vào đất khô hoàn toàn → đọc
dryValue - Cắm vào đất ướt / nước → đọc
wetValue
Ví dụ:
dryValue ≈ 2800wetValue ≈ 1200
6. Ví dụ 1: Đọc độ ẩm đất local (Serial)
#define SOIL_PIN 2
int dryValue = 2800;
int wetValue = 1200;
int readSoilPercent() {
int raw = analogRead(SOIL_PIN);
int percent = map(raw, dryValue, wetValue, 0, 100);
percent = constrain(percent, 0, 100);
return percent;
}
void setup() {
Serial.begin(115200);
pinMode(SOIL_PIN, INPUT);
}
void loop() {
int moisture = readSoilPercent();
Serial.print("Soil moisture: ");
Serial.print(moisture);
Serial.println(" %");
delay(1000);
}
📌 Giá trị % này mang tính tương đối, nhưng rất đủ dùng cho automation.
7. Dữ liệu độ ẩm đất trong tư duy IoT
Đây là telemetry chậm, không cần gửi liên tục.
Gợi ý:
- Chu kỳ: 30s – 5 phút
- Dùng cho:
- Chart theo ngày
- Rule tưới cây
Payload:
{
"ts": 1760000000,
"metrics": {
"soil_moisture": 42
}
}
8. Ví dụ 2: Gửi độ ẩm đất realtime lên IoTLabs Cloud MQTT
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#define SOIL_PIN 2
int dryValue = 2800;
int wetValue = 1200;
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";
const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";
const char* MQTT_TOPIC =
"iotlabs/<orgId>/devices/<deviceId>/telemetry";
WiFiClientSecure net;
PubSubClient mqtt(net);
int readSoilPercent() {
int raw = analogRead(SOIL_PIN);
int percent = map(raw, dryValue, wetValue, 0, 100);
return constrain(percent, 0, 100);
}
void connectWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(500);
}
void connectMQTT() {
net.setInsecure();
mqtt.setServer(MQTT_HOST, MQTT_PORT);
while (!mqtt.connected()) {
mqtt.connect("esp32c3-soil", MQTT_USER, MQTT_PASS);
delay(1000);
}
}
unsigned long lastSend = 0;
void setup() {
Serial.begin(115200);
pinMode(SOIL_PIN, INPUT);
connectWiFi();
connectMQTT();
}
void loop() {
if (!mqtt.connected()) connectMQTT();
mqtt.loop();
if (millis() - lastSend > 60000) { // 1 phút
lastSend = millis();
int moisture = readSoilPercent();
long ts = millis() / 1000;
String payload = "{";
payload += "\"ts\":" + String(ts) + ",";
payload += "\"metrics\":{";
payload += "\"soil_moisture\":" + String(moisture);
payload += "}}";
mqtt.publish(MQTT_TOPIC, payload.c_str());
Serial.println(payload);
}
}
9. Kinh nghiệm thực tế khi dùng Soil Moisture
- Luôn dùng capacitive, tránh loại điện trở
- Không cắm ngập phần mạch
- Hiệu chuẩn lại khi:
- Đổi loại đất
- Đổi chậu / môi trường
- Có thể bọc keo/silicone phần trên để tăng độ bền
10. Ứng dụng thực tế
Sau bài này, bạn có thể làm:
- Tưới cây tự động theo ngưỡng
- Dashboard độ ẩm đất theo ngày/tuần
- Cảnh báo cây khô
- Kết hợp relay / valve nước
👉 Đây là bài bản lề cho smart garden.
11. Tổng kết Bài 28
Bạn đã:
- Hiểu cảm biến độ ẩm đất capacitive
- Biết cách hiệu chuẩn ADC
- Chuẩn hoá dữ liệu thành %
- Gửi telemetry realtime lên IoTLabs Cloud


