Bài 52 · Sinh học · Công nghệ · Vật lí · Toán
Tưới cây theo độ ẩm đất
bài học đầu tiên về vòng điều khiển kín
Đây là dự án mà học sinh nào cũng muốn làm, và cũng là dự án dễ làm ẩu nhất. Cắm cảm biến, bật bơm khi đất khô — nghe đơn giản. Nhưng bản làm ẩu sẽ bật tắt bơm mười lần một phút và làm ngập chậu cây. Bài này nói về chỗ khác biệt ấy.
01 Mục tiêu và yêu cầu cần đạt
Dự án này là bước chuyển quan trọng: từ chỗ chỉ đo sang chỗ đo rồi tác động lại. Đó là toàn bộ ý tưởng của tự động hóa, và học sinh gặp nó lần đầu ở đây.
Sau dự án này học sinh làm được
- Hiệu chuẩn một cảm biến tương tự bằng hai điểm khô và ướt.
- Giải thích được vòng điều khiển kín: đo → so ngưỡng → tác động → đo lại.
- Nêu được vì sao cần hai ngưỡng chứ không phải một, và tính được khoảng trễ hợp lí.
- Điều khiển tải công suất qua relay với nguồn tách riêng và GND chung.
- Đọc đồ thị răng cưa và giải thích từng đoạn.
- Nhận ra ba chỗ hệ thống có thể gây hại nếu hỏng, và thiết kế chốt an toàn cho từng chỗ.
- Công nghệ 10 — Công nghệ trồng trọt: ứng dụng công nghệ cao trong trồng trọt; thực hiện việc trồng cây theo phương pháp có kiểm soát.
- Công nghệ 12 — Vi điều khiển: mạch điện điều khiển dùng vi điều khiển.
- Sinh học 11 — Trao đổi nước ở thực vật; nhu cầu nước của cây.
- Toán — quy đổi thang đo tuyến tính; đọc đồ thị tuần hoàn.
Trích nguyên văn yêu cầu cần đạt từ chương trình môn học trước khi đưa vào kế hoạch bài dạy.
02 Lí thuyết
Cảm biến đo điện dung, không đo nước
Hai bản dẫn trong lớp nhựa tạo thành một tụ điện, đất là chất điện môi giữa hai bản. Hằng số điện môi: nước ≈ 80, đất khô ≈ 4, không khí = 1. Đất càng ẩm thì điện dung càng lớn, mạch trên cảm biến đổi điện dung đó thành điện áp cho ESP32 đọc.
Ngược trực giác, nên phải quy đổi:
phần trăm = (KHÔ − đọc được) / (KHÔ − ƯỚT) × 100
Chính là phương trình đường thẳng qua hai điểm — để học sinh tự dựng, đừng chép.
Nó chỉ là vị trí tương đối giữa hai mốc ta tự đặt: khô trong không khí và ngập trong nước. Đủ để điều khiển tưới, nhưng đừng cho học sinh viết vào báo cáo rằng đất chứa 42% nước. Đây là dịp phân biệt đo tương đối với đo tuyệt đối.
Vòng điều khiển kín
- Đo đại lượng quan tâm.
- So với ngưỡng mong muốn.
- Tác động nếu lệch.
- Quay lại bước 1 — kết quả của tác động lại được đo tiếp.
Khác mọi bài trước: từ đây hệ thống làm thay đổi chính cái nó đang đo.
Một ngưỡng thì hỏng
Viết "dưới 40% thì bật bơm, ngược lại tắt" sẽ ra thế này: 39,8% → bơm bật → nước chạm cảm biến → 40,2% → bơm tắt → nước thấm đi → 39,9% → bơm bật. Mười lần một phút. Relay chết sớm, bơm hỏng, cây vẫn úng.
- Bật bơm khi tụt dưới 35%.
- Chỉ tắt khi vượt trên 55%.
Khoảng 20% ở giữa gọi là độ trễ (hysteresis) — trong đó hệ giữ nguyên trạng thái. Điều hòa đặt 26 °C cũng chạy tới 25 rồi nghỉ, chờ lên 27 mới chạy lại.
Nước còn cần thời gian thấm
Có độ trễ vẫn chưa đủ: nước cần vài phút mới thấm đều, trong lúc đó cảm biến ở một góc chậu vẫn báo khô. Cần thêm hai chốt:
- Giới hạn một lần tưới — 8 giây rồi dừng, dù còn báo khô.
- Bắt buộc nghỉ sau tưới — 5 phút không đo, chờ thấm đều.
Hai chốt này phân biệt dự án làm cho vui với thiết bị dùng được thật.
03 Linh kiện
| Linh kiện | Mô tả, lưu ý khi mua | Số lượng · giá |
|---|---|---|
| ESP32 DevKit V1 | Bo 30 chân | 1 · 90–150k |
| Cảm biến độ ẩm đất điện dung v1.2 | PHẢI là loại điện dung, không mua loại hai que kim loại. Xem hộp cạm bẫy | 1 · 20–40k |
| Bơm chìm mini 5 V | Loại bơm bể cá, lưu lượng 80–120 L/h | 1 · 30–50k |
| Module relay 5 V có cách li quang | Hoặc module MOSFET nếu bơm dưới 2 A | 1 · 20–35k |
| Nguồn 5 V 2 A riêng cho bơm | Không lấy điện bơm từ cổng USB của ESP32 | 1 · 60k |
| Ống nhựa mềm và bình chứa nước | Ống đường kính 6 mm, chai nhựa 1,5 L là đủ | 1 bộ · 20k |
| Chậu cây có đất | Cây thật, không dùng đất khô để thử | 1 |
04 Lắp mạch và sơ đồ nối dây
| Khối | Nối dây | Nguồn |
|---|---|---|
| Cảm biến độ ẩm đất | AOUT → GPIO34 · VCC → 3V3 · GND → GND | 3,3 V |
| Module relay / MOSFET | IN → GPIO26 · VCC → 5 V · GND → GND chung | Điều khiển từ ESP32 |
| Bơm 5 V | Nối qua tiếp điểm relay tới nguồn 5 V riêng | Nguồn riêng 5 V 2 A |
Toàn cảnh hệ thống: chậu cây có cảm biến cắm trong đất, bình nước, bơm chìm, ống dẫn vòng lên chậu, hộp mạch bên cạnh. Chụp chếch 45°, thấy được đường đi của nước.
Khung giữ chỗ — thay bằng ảnh chụp thật khi cóCận cảnh cảm biến độ ẩm đất cắm trong chậu — cắm nghiêng khoảng 30°, ngập tới vạch giới hạn in trên thân, phần mạch điện phía trên hoàn toàn khô ráo.
Khung giữ chỗ — thay bằng ảnh chụp thật khi cóHai loại cảm biến độ ẩm đất đặt cạnh nhau: loại hai que kim loại đã bị ăn mòn xanh sau vài tuần, và loại điện dung phủ nhựa còn nguyên. Ảnh chống mua nhầm.
Khung giữ chỗ — thay bằng ảnh chụp thật khi cóPhần điện: module relay, nguồn 5 V riêng cho bơm, có nhãn dán ghi rõ đâu là đường điều khiển và đâu là đường công suất.
Khung giữ chỗ — thay bằng ảnh chụp thật khi cóĐồ thị độ ẩm đất trong 24 giờ: đường răng cưa với các đợt tưới, thấy rõ độ ẩm tụt dần rồi vọt lên sau mỗi lần bơm. Có kẻ hai đường ngang đánh dấu ngưỡng bật và ngưỡng tắt.
Khung giữ chỗ — thay bằng ảnh chụp thật khi cóSo sánh hai bản chương trình trong 30 phút: bản không có độ trễ (bơm bật tắt liên tục hàng chục lần) và bản có độ trễ (bơm bật đúng hai lần).
Khung giữ chỗ — thay bằng ảnh chụp thật khi cóBa khối tách bạch
Hệ thống chia làm ba phần, và điều quan trọng nhất là đường điện của bơm không đi qua bo ESP32:
- Khối cảm biến — cảm biến độ ẩm, ăn 3,3 V từ ESP32.
- Khối điều khiển — ESP32 và module relay, dòng rất nhỏ.
- Khối công suất — bơm và nguồn 5 V riêng, đi qua tiếp điểm relay.
Đây là dự án đầu tiên trong sách có nước gần mạch điện. Bốn quy tắc bắt buộc:
- Toàn bộ hệ chạy 5 V. Không dùng bơm 220 V cho bài học sinh, không có ngoại lệ.
- Hộp mạch đặt cao hơn bình nước và cách xa chậu cây. Nếu ống bị tuột thì nước không chảy vào mạch.
- Nguồn bơm tách riêng, nhưng GND nối chung với ESP32. Thiếu GND chung thì relay đóng ngắt lung tung.
- Bơm chìm phải luôn ngập nước. Chạy khô vài chục giây là cháy. Xem hộp kinh nghiệm.
Loại rẻ nhất trên thị trường là hai que kim loại song song, đo điện trở của đất. Nó rẻ hơn mười nghìn và hỏng sau hai tuần.
Lí do: dòng điện một chiều chạy qua đất ẩm gây điện phân. Que kim loại bị ăn mòn, phủ một lớp oxit xanh, và số đọc trôi dần cho tới lúc vô nghĩa. Đây thực ra lại là một thí nghiệm Hóa học hay — nhưng không phải thứ ta muốn trong hệ tưới cây.
Phải mua loại điện dung, thường ghi capacitive soil moisture sensor v1.2. Nó phủ nhựa hoàn toàn, không có kim loại tiếp xúc với đất, và sống được nhiều năm.
Cắm cảm biến cho đúng
- Cắm nghiêng khoảng 30°, không cắm thẳng đứng — cắm thẳng thì nước tưới chảy dọc theo thân cảm biến và làm số nhảy vọt giả.
- Ngập tới vạch giới hạn in trên thân. Ngập quá vạch thì nước vào phần mạch điện và cảm biến chết.
- Đặt cách gốc cây khoảng 5 cm, và cách xa chỗ ống nước nhỏ xuống.
- Đánh dấu vị trí bằng một que tăm — để những lần sau cắm lại đúng chỗ cũ, nếu không thì số liệu giữa các buổi không so được với nhau.
05 Mã nguồn
Mã đầy đủ tại kho GitHub, thư mục cap-5/bai-64-tuoi-cay/. Có kèm bản gửi dữ liệu lên web và bản chạy bằng ESPHome cho ai không muốn lập trình.
Bước 1 — Chương trình hiệu chuẩn (chạy trước, một lần)# ------------------------------------------------------------
# Bai 52 - Buoc 1: hieu chuan cam bien do am dat
# Cam bien dien dung -> GPIO34 (nhom ADC1, khong xung khac Wi-Fi)
# ------------------------------------------------------------
from machine import Pin, ADC
import time
adc = ADC(Pin(34))
adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_12BIT)
def doc_tho(n=64):
tong = 0
for _ in range(n):
tong += adc.read()
time.sleep_us(200)
return tong / n
input("Lau kho cam bien, de trong khong khi, roi Enter...")
KHO = doc_tho()
print("Gia tri khi KHO :", round(KHO))
input("Nhung cam bien vao coc nuoc (den vach gioi han), roi Enter...")
UOT = doc_tho()
print("Gia tri khi UOT :", round(UOT))
print()
print("Chep hai so nay vao chuong trinh chinh:")
print("KHO =", round(KHO))
print("UOT =", round(UOT))
print()
print("Kiem tra: gia tri KHO phai LON HON gia tri UOT.")
print("Neu nguoc lai thi cam bien cua ban thuoc loai dao chieu.") Bước 2 — Chương trình chính có độ trễ và chốt an toàn # ------------------------------------------------------------
# Bai 52 - Chuong trinh chinh: tuoi cay theo do am dat
# Co tre (hysteresis) va gioi han thoi gian tuoi.
# ------------------------------------------------------------
from machine import Pin, ADC
import time
# ===== CAU HINH - sua o day =====
CHAN_DO_AM = 34
CHAN_BOM = 26 # noi toi chan IN cua module relay hoac MOSFET
KHO = 3180 # lay tu chuong trinh hieu chuan
UOT = 1420
NGUONG_BAT = 35 # duoi 35% thi bat bom
NGUONG_TAT = 55 # tren 55% thi tat bom -> khoang tre 20%
TUOI_TOI_DA_S = 8 # mot lan tuoi khong qua 8 giay
NGHI_SAU_TUOI_S = 300 # cho 5 phut cho nuoc tham deu roi moi do lai
CHU_KY_S = 10
# ===== het phan cau hinh =====
adc = ADC(Pin(CHAN_DO_AM))
adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_12BIT)
bom = Pin(CHAN_BOM, Pin.OUT)
bom.value(0) # LUON tat bom khi khoi dong
def doc_do_am():
tong = 0
for _ in range(64):
tong += adc.read()
time.sleep_us(200)
tho = tong / 64
phan_tram = (KHO - tho) / (KHO - UOT) * 100
return max(0.0, min(100.0, phan_tram)), tho
print("t_phut,do_am_pc,gia_tri_tho,bom")
bat_dau = time.ticks_ms()
dang_tuoi = False
try:
while True:
do_am, tho = doc_do_am()
phut = time.ticks_diff(time.ticks_ms(), bat_dau) / 60000
if not dang_tuoi and do_am < NGUONG_BAT:
dang_tuoi = True
bom.value(1)
print("{:.2f},{:.1f},{:.0f},BAT".format(phut, do_am, tho))
# tuoi toi da TUOI_TOI_DA_S giay, vua tuoi vua theo doi
het = time.ticks_add(time.ticks_ms(), TUOI_TOI_DA_S * 1000)
while time.ticks_diff(het, time.ticks_ms()) > 0:
d, _ = doc_do_am()
if d > NGUONG_TAT:
break
time.sleep_ms(200)
bom.value(0)
dang_tuoi = False
print("{:.2f},-,-,TAT (cho tham)".format(
time.ticks_diff(time.ticks_ms(), bat_dau) / 60000))
time.sleep(NGHI_SAU_TUOI_S)
else:
print("{:.2f},{:.1f},{:.0f},tat".format(phut, do_am, tho))
time.sleep(CHU_KY_S)
except KeyboardInterrupt:
pass
finally:
bom.value(0) # BAT BUOC: tat bom du chuong trinh dung the nao
print("Da tat bom an toan.") Kết quả một chu kì tưới:
t_phut,do_am_pc,gia_tri_tho,bom 0.00,42.3,2436,tat 0.17,41.8,2447,tat 0.33,38.1,2528,tat 0.50,34.6,2603,BAT 0.63,-,-,TAT (cho tham) 5.63,57.2,2093,tat 5.80,56.9,2099,tat
bom.value(0)ngay sau khi khai báo chân — nếu bo mạch khởi động lại giữa chừng, bơm không được phép tự bật.- Khối
finallyở cuối — dù chương trình dừng vì lỗi hay vì bấm Stop, bơm vẫn được tắt. - Vòng
whilebên trong lúc tưới vẫn đọc cảm biến liên tục và thoát sớm nếu đã đủ ẩm, thay vì cứ bơm cho hết 8 giây.
Ba dòng này không làm hệ chạy tốt hơn. Chúng làm hệ hỏng an toàn — và đó là điều đáng dạy hơn.
06 Hiệu chuẩn và kiểm thử
Hai điểm khô và ướt
Chạy chương trình hiệu chuẩn và ghi lại hai con số. Vài lưu ý:
- Điểm KHÔ: lau thật khô cảm biến, để lơ lửng trong không khí. Đừng cắm vào đất khô — đất khô vẫn ẩm hơn không khí.
- Điểm ƯỚT: nhúng vào cốc nước, ngập đúng tới vạch giới hạn, không hơn.
- Mỗi điểm chờ khoảng 30 giây cho số ổn định rồi mới ghi.
Giá trị điển hình: KHÔ khoảng 3100–3300, ƯỚT khoảng 1300–1600. Nếu hai số quá gần nhau (chênh dưới 800) thì cảm biến kém nhạy hoặc đã hỏng.
Kiểm thử vòng điều khiển — làm trên bàn trước khi đưa ra chậu
- Chạy chương trình với cảm biến để trong không khí. Độ ẩm phải gần 0% và bơm phải bật.
- Ngắt ống ra khỏi chậu, để đầu ống vào một cái ca. Xác nhận bơm chạy đúng 8 giây rồi dừng.
- Nhúng cảm biến vào nước. Độ ẩm phải lên gần 100% và bơm phải tắt.
- Rút cảm biến ra, chờ. Bơm chỉ được bật lại khi độ ẩm tụt dưới 35%, chứ không phải ngay khi tụt dưới 55%.
Bước 4 là bước kiểm tra độ trễ có hoạt động không. Nhiều nhóm bỏ qua bước này và chỉ phát hiện vấn đề khi chậu cây đã ngập.
Danh sách kiểm
- Đã hiệu chuẩn và chép hai số KHÔ, ƯỚT vào chương trình.
- Bơm ở trạng thái TẮT ngay khi vừa cấp điện cho ESP32.
- Một lần tưới không quá 8 giây, kiểm bằng đồng hồ.
- Sau khi tưới, hệ nghỉ đủ thời gian chờ thấm rồi mới đo lại.
- Rút cáp USB giữa lúc bơm đang chạy — bơm phải dừng, không được chạy tiếp.
- Toàn bộ phần mạch nằm cao hơn bình nước.
07 Kinh nghiệm và cạm bẫy
Bản đầu tiên của tôi chỉ có một ngưỡng và không có giới hạn thời gian tưới. Tôi cắm điện rồi về nhà.
Sáng hôm sau: chậu cây ngập nước, tràn cả ra bàn, và bình nước 1,5 lít cạn sạch. Nhật ký cho thấy bơm đã bật tắt hơn bốn trăm lần trong một đêm.
Nguyên nhân đúng như phần lí thuyết: cảm biến nằm ở góc chậu, nước bơm vào phía đối diện chưa kịp thấm tới, nên nó cứ báo khô và bơm cứ chạy.
Ba thứ tôi thêm vào sau đêm đó — độ trễ hai ngưỡng, giới hạn 8 giây một lần, và bắt buộc nghỉ 5 phút — chính là ba thứ làm nên bài học này. Nếu không có đêm ấy thì bài này chỉ còn hai mươi dòng code và chẳng dạy được gì.
Bơm chìm mini dùng chính nước để làm mát. Chạy khô khoảng ba mươi giây là cuộn dây nóng lên và hỏng. Tôi đã đốt hai con.
Hai cách phòng, nên làm cả hai:
- Cắt vát đầu ống hút và đặt bơm nằm ngang dưới đáy bình, để nó vẫn hút được khi nước còn ít.
- Thêm cảm biến mực nước — đơn giản nhất là một cảm biến độ ẩm thứ hai treo ở mức nước tối thiểu. Hết nước thì chương trình từ chối bơm và báo lên màn hình.
Chi tiết thứ hai là một nhiệm vụ mở rộng rất hay cho học sinh khá: hãy để các em tự phát hiện ra vấn đề rồi tự đề xuất giải pháp.
Khi cho học sinh xem đồ thị 24 giờ, các em hay hỏi "sao nó lên xuống lởm chởm thế thầy, có bị sai không?".
Không sai. Đường răng cưa ấy chính là chân dung của vòng điều khiển: đoạn dốc xuống là cây hút nước và nước bay hơi; đoạn vọt lên là một lần tưới; biên độ của răng cưa chính là khoảng trễ ta đặt ra.
Từ đó có một câu hỏi rất hay: muốn đường bằng phẳng hơn thì thu hẹp khoảng trễ. Nhưng thu hẹp quá thì sao? Học sinh sẽ tự đi tới sự đánh đổi giữa độ ổn định và tuổi thọ thiết bị — bài học trung tâm của tự động hóa.
- Độ ẩm nhảy loạn giữa 20% và 80%. Cảm biến cắm gần chỗ nước nhỏ xuống, hoặc cắm thẳng đứng nên nước chảy dọc thân.
- Bơm không chạy dù relay kêu tách. Quên nối GND chung, hoặc nguồn bơm chưa cắm.
- Bơm chạy ngay khi cắm điện, trước cả khi chương trình chạy. Module relay của bạn tích cực mức thấp — đảo lại logic, hoặc dùng chân NC thay vì NO.
- Số đọc trôi dần sau vài ngày. Nếu là loại điện dung thì kiểm chỗ tiếp xúc và mức nước ngập; nếu là loại hai que thì đó là ăn mòn, phải thay loại khác.
- Đọc ADC không ổn định khi bật Wi-Fi. Bạn đang dùng chân thuộc nhóm ADC2. Chuyển sang GPIO32–GPIO39.
08 Ứng dụng trong dạy học
Công nghệ — trồng trọt công nghệ cao, làm thật chứ không xem tranh
Mạch nội dung "ứng dụng công nghệ cao trong trồng trọt" của Công nghệ 10 thường được dạy bằng hình ảnh nhà kính Israel. Dự án này biến nó thành thứ học sinh cầm được: một chậu cây tự tưới, chạy thật, hỏng thật, sửa thật.
Với Công nghệ 12, đây là ví dụ đầy đủ của mạch "mạch điện điều khiển dùng vi điều khiển": có đầu vào tương tự, có xử lí, có đầu ra công suất, có cách li giữa mạch điều khiển và mạch động lực.
Sinh học — cây cần bao nhiêu nước
Câu hỏi tưởng dễ mà không dễ: đặt ngưỡng bao nhiêu là hợp lí? 35% hay 50%?
Trả lời được câu này cần kiến thức Sinh học: cây khác nhau chịu hạn khác nhau, đất khác nhau giữ nước khác nhau, và tưới quá nhiều thì rễ thiếu oxy mà chết — úng cũng chết như hạn.
Đây là chỗ dự án thoát khỏi ranh giới môn Công nghệ. Con số ngưỡng phải do hiểu biết Sinh học quyết định, không phải do lập trình.
Toán — thang đo và đồ thị
Công thức quy đổi hai điểm là bài đường thẳng qua hai điểm. Đồ thị răng cưa là bài đọc hàm số tuần hoàn không đều: chu kì, biên độ, và xu hướng nền.
Bài tập hay: từ đồ thị 24 giờ, ước lượng cây hút bao nhiêu nước mỗi ngày. Rồi kiểm tra bằng cách cân bình nước trước và sau.
Hoạt động 1 — Xác định vấn đề. Vườn rau của lớp chết gần hết sau kỳ nghỉ Tết vì không ai tưới. Cần một hệ thống chăm cây thay người trong hai tuần.
Tiêu chí sản phẩm: giữ được độ ẩm đất trong khoảng 35–55% liên tục 7 ngày; bình nước 5 lít đủ dùng cho cả tuần; hệ tự dừng và báo khi hết nước; không lần tưới nào vượt 10 giây; và nhật ký ghi lại toàn bộ các lần tưới để kiểm chứng.
Hoạt động 2 — Kiến thức nền. Nhu cầu nước của cây và tác hại của úng; cảm biến điện dung; vòng điều khiển kín và độ trễ; điều khiển tải qua relay.
Hoạt động 3 — Đề xuất và chọn phương án. Mỗi nhóm phải trả lời ba câu trước khi lập trình: đặt ngưỡng bao nhiêu và vì sao; một lần tưới bao nhiêu giây và vì sao; nếu cảm biến hỏng giữa kỳ nghỉ thì chuyện gì xảy ra và làm sao để nó hỏng một cách an toàn.
Hoạt động 4 — Chế tạo và thử nghiệm tăng tốc. Không đợi được bảy ngày, nên thử tăng tốc: dùng quạt sấy nhẹ để đất khô nhanh, quan sát hệ phản ứng trong 30 phút, rồi mới cho chạy thật.
Hoạt động 5 — Báo cáo và điều chỉnh. Sau một tuần chạy thật, mỗi nhóm trình bày đồ thị, số lần tưới, lượng nước dùng, và những sự cố đã xảy ra. Nhóm nào gặp sự cố và xử lý được thì điểm cao hơn nhóm chạy trơn tru nhờ may mắn.
- Thêm cảm biến ánh sáng và nhiệt độ để tưới thông minh hơn: không tưới lúc nắng gắt giữa trưa vì nước bốc hơi hết.
- Gửi dữ liệu lên web (Bài 44) để theo dõi từ nhà trong kỳ nghỉ.
- Ghép với Bài 101 thành nhà kính mini có cả quạt và đèn.
- Chuyển sang ESPHome nếu muốn hệ chạy dài hạn và cập nhật từ xa.
- Hướng thi Khoa học kĩ thuật: so sánh hiệu quả tiết kiệm nước giữa tưới theo lịch và tưới theo cảm biến, đo trên cùng một loại cây trong tám tuần.