Bỏ qua, đến nội dung chính
Nastrotek
Giải pháp IoTIoT SolutionsMới

Smart Garden: Theo dõi đất, ánh sáng và tưới nước

Cách mình làm hệ thống vườn thông minh bằng ESP32 để theo dõi độ ẩm đất, ánh sáng, mực nước và tưới cây vừa đủ mà không biến ban công thành một mớ dây.

Chia sẻ

LinkedInFacebookX
Hệ thống vườn thông minh dùng ESP32 theo dõi đất, ánh sáng và tưới nước cho các chậu rau thơm trên ban công

Nếu bạn làm một hệ tương tự, mình khuyên hiệu chuẩn trên chính chậu cây của bạn trước khi cho phép bơm tự chạy.

Mấy chậu rau thơm trên ban công là một bài toán IoT khá vui: đủ gần để mình nhìn thấy mỗi ngày, nhưng cũng đủ dễ quên khi bận vài hôm. Lần đầu nghĩ tới “smart garden”, mình từng muốn gắn thật nhiều cảm biến rồi làm dashboard thật đẹp. Sau một thời gian thử, mình nhận ra ba câu hỏi quan trọng hơn nhiều: đất có đang khô thật không, cây nhận được bao nhiêu ánh sáng, và lần tưới vừa rồi có diễn ra an toàn không?

Bài này là cách mình gom ba câu hỏi đó vào một hệ thống ESP32 nhỏ. Nó hợp với vài chậu cây ở ban công hoặc cạnh cửa sổ, không phải hệ thống tưới cho cả khu vườn. Mục tiêu là theo dõi đủ để hiểu cây, tự tưới có kiểm soát và vẫn cho phép mình can thiệp bằng tay.

Bản MVP mình sẽ làm

KhốiLựa chọn gọn cho 2–4 chậu
Điều khiểnESP32-C3 hoặc ESP32 DevKit
Độ ẩm đấtCảm biến điện dung 3.3 V, mỗi chậu một đầu dò
Ánh sángBH1750 qua I2C, đặt gần tán cây
Mực nướcPhao từ hoặc cảm biến mức nước dạng công tắc
TướiBơm nhu động 5 V hoặc bơm chìm nhỏ, điều khiển bằng MOSFET
Kết nốiMQTT tới Home Assistant, hoặc web page nội bộ
NguồnAdapter DC cách điện; bơm và ESP32 có đường cấp phù hợp nhưng chung mass

Mình thích bơm nhu động cho vài chậu nhỏ vì nước chỉ chạm vào ống, lưu lượng dễ ước lượng và ít bị chảy tự do sau khi tắt. Bơm chìm rẻ hơn nhưng cần đặt trong bình, nên phải chú ý mực nước tối thiểu và hiện tượng siphon.

BH1750 đo độ rọi theo lux, dễ tích hợp hơn quang trở nếu mục tiêu là theo dõi xu hướng ánh sáng. Tuy vậy, lux phản ánh độ sáng theo cảm nhận của mắt người, không thay thế cảm biến PAR chuyên dụng. Với một vườn ban công nhỏ, mình dùng nó để so sánh vị trí và số giờ sáng giữa các ngày, không dùng một con số lux duy nhất để “chẩn đoán” cây.

Hiệu chuẩn đất trước khi cho phép tưới

Cảm biến điện dung phù hợp hơn với loại hai que kim loại lộ ra vì không cho dòng DC chạy trực tiếp qua đất. Nó vẫn không phải là thiết bị cắm xuống rồi quên: phần mạch phía trên cần ở ngoài đất, tránh nước tưới và nên được che mưa.

Hiệu chuẩn cảm biến độ ẩm đất điện dung bằng mẫu đất khô và đất ướt trên bàn thử ESP32

Đừng dùng thẳng con số phần trăm trong code mẫu. Mình đo hai mốc khô và ướt với chính loại đất, chậu và cảm biến sẽ dùng ngoài vườn.

Mình hiệu chuẩn theo cách đơn giản:

  1. Cắm đầu dò đúng độ sâu dự kiến vào mẫu đất khô, chờ số ổn định rồi lấy trung bình của 20–30 mẫu. Lưu là rawDry.
  2. Tưới đều mẫu đất tới độ ẩm cao nhưng không biến thành bùn hay để nước đọng. Chờ nước phân bố rồi ghi rawWet.
  3. Đổi giá trị ADC thành thang tương đối 0–100%, sau đó giới hạn kết quả trong khoảng này.
  4. Đặt đầu dò vào chậu thật, theo dõi vài chu kỳ khô–tưới và chọn ngưỡng dựa trên cây, không dựa vào cảm giác về con số.
int soilPercent(int raw, int rawDry, int rawWet) {
  int value = map(raw, rawDry, rawWet, 0, 100);
  return constrain(value, 0, 100);
}

Trên ESP32 đời đầu có Wi-Fi, mình ưu tiên chân ADC1. Hướng dẫn phần cứng của Espressif khuyến nghị ADC1 thay cho ADC2 khi Wi-Fi hoạt động và gợi ý tụ 0,1 µF từ đầu vào ADC xuống GND để giảm nhiễu. Firmware cũng nên đọc nhiều mẫu, bỏ giá trị bất thường rồi lấy trung bình.

Nếu có nhiều chậu, mỗi đầu dò cần bộ rawDry/rawWet riêng. Hai cảm biến nhìn giống hệt nhau vẫn có thể lệch đáng kể; dùng chung một cặp mốc chỉ làm dashboard trông đều hơn chứ không làm phép đo đúng hơn.

Logic tưới: ít thông minh hơn nhưng an toàn hơn

Mình không để một lần đọc thấp bật bơm ngay. Một state machine nhỏ sẽ dễ tin hơn:

MONITOR
  đất khô dưới ngưỡng trong 3 lần đo liên tiếp
  + bình còn nước
  + đang trong khung giờ cho phép
  -> WATER

WATER
  chạy bơm 5–10 giây
  -> SOAK

SOAK
  chờ 10–20 phút để nước ngấm
  đo lại; nếu vẫn khô thì cho phép thêm một chu kỳ
  -> MONITOR hoặc LOCKOUT

Khoảng SOAK rất quan trọng. Nếu vừa bơm vừa nhìn đầu dò, nước chưa kịp lan tới cảm biến và firmware có thể bơm quá tay. Mỗi ngày cũng cần giới hạn tổng thời gian bơm hoặc tổng số chu kỳ. Khi vượt giới hạn, hệ thống khóa tưới và gửi cảnh báo thay vì cố cứu một số đo có thể đang sai.

Cụm bơm nhu động, ống silicone và bình nước của hệ thống tưới cây ESP32 đặt tách khỏi mạch điều khiển

Bơm và bình nước nằm thấp hơn hộp điện tử. Một lần tưới có giới hạn thời gian và cảm biến mực nước giúp hệ thống dừng an toàn khi bình cạn.

Mạch công suất không nên cấp nguồn trực tiếp từ GPIO. Với bơm DC nhỏ, mình dùng MOSFET logic-level, diode flyback, điện trở kéo xuống gate và nguồn đủ dòng khởi động. Bản dùng relay vẫn chạy được, nhưng relay cơ ồn, tốn điện hơn và đóng cắt dễ đưa nhiễu vào dây I2C/ADC.

Các điều kiện dừng mình luôn có:

  • Công tắc mực nước báo cạn thì không chạy bơm.
  • Mỗi lần chạy có timeout độc lập, kể cả khi app hoặc MQTT mất kết nối.
  • ESP32 vừa reset thì output điều khiển bơm phải ở trạng thái tắt.
  • Manual mode cũng bị giới hạn timeout; nút “ON” không có nghĩa là bơm mãi.
  • Hộp điện tử đặt cao hơn bình nước, dây có drip loop và đầu nối tránh hướng lên trời.

Với chậu đặt trong nhà, mình sẽ chạy thử hệ thống trong khay hứng vài ngày trước. Một dashboard đẹp không phát hiện được ống tuột nhanh bằng cái khay khô sau 20 lần tưới thử.

Đo ánh sáng sao cho có ích

BH1750 nên nằm gần độ cao của lá, nhìn được bầu trời hoặc nguồn sáng mà cây thực sự nhận. Nếu gắn cảm biến dưới mái che còn cây chìa ra ngoài nắng, số đo chỉ mô tả cái mái che. Ngược lại, để module trần ngoài mưa thì tuổi thọ sẽ rất ngắn; một mái trong suốt nhỏ, thoáng và không che góc nhìn là đủ cho prototype.

Cảm biến ánh sáng đặt trên ban công cùng điện thoại hiển thị biểu đồ đất, ánh sáng và lượng nước

Lux hữu ích nhất khi được xem theo xu hướng trong nhiều ngày, không phải để kết luận cây thiếu sáng từ một số đo tức thời.

Thay vì báo “lux thấp” sau một phút có mây, mình lưu mẫu theo chu kỳ và tính tổng ánh sáng tương đối trong ngày. Dashboard chỉ cần ba thứ:

  • Biểu đồ độ ẩm đất theo từng chậu và các mốc bơm đã chạy.
  • Đường lux theo thời gian để thấy chậu nào chỉ có nắng buổi sáng.
  • Mực nước, tổng thời gian bơm hôm nay và cảnh báo gần nhất.

Payload MQTT có thể giữ gọn:

{
  "soil": { "basil": 46, "mint": 58 },
  "light_lux": 12400,
  "tank_ok": true,
  "pump_ms_today": 8000,
  "state": "soak"
}

Nếu node mất mạng, phần đo và giới hạn an toàn vẫn phải chạy cục bộ. MQTT chỉ dùng để ghi lịch sử, hiển thị và yêu cầu thao tác; cloud không nên nằm trong đường dừng bơm.

Nhịp độ hợp lý

Đất thay đổi chậm, nên đọc mỗi 5–15 phút thường đã đủ. Ánh sáng có thể lấy mẫu mỗi phút nếu dùng nguồn cắm, rồi tổng hợp trước khi gửi. Bơm là ngoại lệ: trong lúc tưới, task an toàn phải theo dõi timeout liên tục và không bị chặn bởi kết nối Wi-Fi.

Với bản chạy pin mặt trời như Plantwatery, Deep Sleep mang lại sự khác biệt lớn. Nhưng ở prototype đầu, mình vẫn chọn adapter cách điện và chạy liên tục để log dễ hơn. Chỉ khi ngưỡng tưới, lưu lượng và vị trí cảm biến đã ổn, mình mới tối ưu pin hoặc làm PCB riêng.

Checklist trước khi để hệ thống tự chạy

  • Hiệu chuẩn từng đầu dò bằng đúng đất và chậu sẽ dùng.
  • Rút Wi-Fi, reset ESP32 và ngắt MQTT trong lúc test để chắc rằng bơm vẫn dừng.
  • Chạy bơm vào ca đong 10 lần để biết ml/giây thực tế.
  • Giả lập bình cạn và cảm biến đất bị rút dây.
  • Giữ đầu điện tử của cảm biến đất khô, có che mưa nhưng vẫn thoáng.
  • Quan sát ít nhất một tuần ở chế độ chỉ ghi dữ liệu trước khi bật auto.
  • Đặt giới hạn số lần tưới và tổng thời gian bơm mỗi ngày.

Mình xem bản đầu là thành công khi nó giúp trả lời “chậu nào khô nhanh và góc nào thiếu nắng”, ngay cả khi chưa tự tưới. Khi dữ liệu đã khớp với những gì mình quan sát bằng tay, bật bơm chỉ là bước tiếp theo. Làm theo thứ tự đó chậm hơn một buổi, nhưng ít có khả năng đổi một chậu cây hơi khô thành một ban công ngập nước.

Tài liệu tham khảo

Chia sẻ

LinkedInFacebookX

Tiếp tục khám phá

Đọc tiếp

Bài viết liên quan

Xem thêm trong Giải pháp IoT

Nastrotek sử dụng cookie để phân tích truy cập và cá nhân hóa quảng cáo, giúp hiểu cách website được sử dụng. Bạn có thể chấp nhận hoặc từ chối các cookie không thiết yếu.