Table of Contents
Toggle前言:為什麼要打造自動澆水系統?
你是否常常因為忙碌,而忘記幫植物澆水?
或是澆得太勤,反而讓根部泡爛?
自動澆水系統正是為了解決這些困擾而生。透過土壤濕度感測器搭配 ESP32,你可以打造一個「會自己判斷植物口渴」的智慧灌溉系統。
ESP32 具備 WiFi、藍牙、類比輸入、PWM 等功能,非常適合作為 IoT 澆水系統的核心。
本次教學所需材料清單
ESP32 開發板
支援 WiFi/藍牙,最適合作為智慧控制主板。
土壤濕度感測器 V2.0
本次使用新版 V2.0,更耐用、輸出更穩定。
5V 繼電器模組
用來控制水泵或電磁閥。
水泵 / 電磁閥(任一即可)
用來進行實際的澆水動作。
杜邦線、USB 傳輸線
用於接線與供電。
購買材料優良廠家推薦:
ESP32+土壤感測器+繼電器接線
ESP32+土壤感測器接線,請連結此篇教學:使用 ESP32 讀取土壤濕度:感測器 V2.0 詳細接線與程式教學
ESP32+繼電器接線,請連結此篇教學:【2025最新】從零開始學會繼電器插座安裝與接線教學
ESP32 自動澆水完整程式碼
#include
#include "Wire.h"
#include "U8g2lib.h" //OLED 螢幕解析度為128*64
const int Light = 36; //光敏電阻腳位36,變數為"Light"
const int LED = 2; //LED燈內建腳位2,變數為"LED"
const int pinDHT11 = 16; //DHT11溫度感測器腳位16,變數為"pinDHT11"
const int dry = 3000; //土壤濕度感測到乾燥值為3000
const int wet = 1165; //土壤濕度感測到濕度值為1165
const int relay = 5; //繼電器腳位5,變數為"relay"W
SimpleDHT11 dht11(pinDHT11);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
void setup() {
Serial.begin(115200);
pinMode(LED, OUTPUT); //設定LED作為輸出
pinMode(Light, INPUT); //Light作為輸入
pinMode(relay, OUTPUT); //relay作為輸出
u8g2.begin(); //初始化
u8g2.enableUTF8Print(); //啟用 UTF8字集
u8g2.setFont(u8g2_font_unifont_t_chinese1); //設定使用中文字形
u8g2.setDrawColor(1); //設定顏色,我們是單色只有1
u8g2.setFontPosTop(); //座標從上開始
u8g2.setFontDirection(0); //0不旋轉、1->90、2->180、3->270
pinMode(32, OUTPUT);
}
void loop() {
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT11 failed, err=");
Serial.print(SimpleDHTErrCode(err));
Serial.print(",");
Serial.println(SimpleDHTErrDuration(err));
delay(1000);
return;
}
int LightValue; //宣告整數變數"LightValue"
LightValue = analogRead(Light); //讀取Light的數值放在LightValue
Serial.println(LightValue); //LightValue顯示在序列視窗
if (LightValue < 600) { //如果LightValue值小於600時,LED就開啟,否則LED是關閉的
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
int sensorVal = analogRead(4); //土壤感測器腳位4,變數為sensorVal
int percentageHumididy = map(sensorVal, wet, dry, 100, 0); //將感測值比值成1~100%
if (sensorVal > 3000) { //如果土壤感測器值大於3000時,啟動繼電器,讓水泵澆水
digitalWrite(relay, HIGH);
delay(20000); //澆水20秒
} else { //否則繼電器是關閉的
digitalWrite(relay, LOW);
}
Serial.print(percentageHumididy);
Serial.println("%");
u8g2.clearBuffer(); //顯示前清除螢幕
u8g2.setCursor(0, 5); //移動游標
u8g2.print("溫濕度:");
u8g2.print((int)temperature + String("*C")); //寫入文字
u8g2.print(String("/"));
u8g2.print((int)humidity + String("%")); //寫入文字
u8g2.setCursor(0, 25); //移動游標
u8g2.print("土壤濕度:");
u8g2.print((int)percentageHumididy + String("%")); //寫入文字
u8g2.setCursor(0, 45); //移動游標
u8g2.print("亮度:"); //寫入文字
u8g2.print(LightValue); //寫入文字
u8g2.sendBuffer(); //送到螢幕顯示
delay(100); //每0.1秒感測一次
}
測試與除錯技巧
讀值不穩定?
土壤太乾會造成跳動,可加入平均值計算
繼電器跳動?
與 ESP32 共用電源會造成干擾,請使用獨立電源供水泵
水泵不啟動?
繼電器線路反接,電源不足,水泵壞掉
成品示範與運作流程
感測器讀值低 → 表示乾燥
ESP32 啟動繼電器
水泵開始送水
時間到後停止,避免過度澆水
整套系統既簡單又有效,非常適合新手入門 IoT 自動化。


結語
透過 ESP32 + 土壤濕度感測器 + 繼電器,你可以輕鬆打造一套智慧澆水系統。不論是陽台植物、香草盆栽或小型實驗田,都能讓你完全解放雙手,讓植物自己「開口要水」。
常見問題 (FAQs)
1. 感測器會不會容易壞?
電阻式感測器浸在土裡確實容易腐蝕,建議每 3–6 個月更換一次。
2. 門檻值應該設多少?
依土壤與植物需求不同,可從 1100~3000 之間測試。
3. ESP32 可以連 WiFi 看資料嗎?
可以!可擴充 MQTT、Blynk、Line Notify。
4. 繼電器一直跳動怎麼辦?
請使用「水泵獨立電源」,不與 ESP32 共用 5V。
5. 可以改成太陽能供電嗎?
可以,只需搭配 18650 + TP4056 + 太陽能板即可。
