使用 ESP32 讀取土壤濕度:感測器 V2.0 詳細接線與程式教學

還記得你上次澆水是什麼時候嗎?對於常常忙到忘記照顧植物的朋友來說,一套「智慧植物照護系統」就是救星!本篇教學將一步步帶你用 ESP32 搭配土壤濕度感測器 V2.0、DHT11 與光敏電阻感測器,打造一套能監測植物環境的 DIY 專案。

你將學會:
1️⃣ 如何正確接線
2️⃣ 如何撰寫 Arduino 程式
3️⃣ 監測土壤濕度模組

所需材料清單

以下是本專案所需的主要元件:

元件功能說明
ESP32主控板,負責讀取資料與控制邏輯
土壤濕度感測器 V2.0偵測土壤乾濕程度
DHT11測量溫度與空氣濕度
光敏電阻感測器偵測環境光線強度
杜邦線 / 麵包板 / USB 傳輸線接線與供電使用

 

購買材料推薦廠家連結:

ESP32 的優勢與應用

ESP32 不只是「進階版 Arduino」,它擁有:

  • 雙核心處理器與更高的主頻

  • 內建 Wi-Fi / 藍牙

  • 更多 GPIO 腳位

  • 適合各種 IoT(物聯網)應用

因此,用它來打造植物照護系統,可以隨時透過手機或雲端查看植物狀況。

認識土壤濕度感測器 V2.0

感測原理

V2.0 版本採用 電容式測量原理,透過電場變化判斷土壤含水量。相比早期電阻式感測器,它:

  • 不易生鏽、壽命更長

  • 輸出更穩定,不易受鹽分干擾

模組腳位說明

腳位功能
VCC電源(3.3V–5V)
GND地線
AOUT模擬輸出(乾濕電壓值)

 

電容式土壤感測器

接線教學

ESP32 與土壤感測器 V2.0 接線

感測器腳位連接至 ESP32
VCC3.3V
GNDGND
AOUTGPIO 4(可讀取類比輸入)
土壤感測器接線_1

電容式土壤感測器V2.0偵測乾濕值

首先偵測電容式土壤感測器V2.0偵測到乾濕值,便於接下來顯示百分比,讓我們清楚了解土壤狀況。

從Serial Monitor顯示得知:

  • 乾的值=約2920
  • 濕的值=約1165

程式如下:

				
					

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(analogRead(4));
  delay(100);
}

				
			

將乾濕值用map函數換算成%,這map函數詳細說明,可以參考之前文章"【Arduino入門】Arduino可變電阻教學",這便可以輕鬆分辨乾濕度%,更新後程式如下:

				
					

const int dry = 2920;
const int wet = 1165;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
 int sensorVal = analogRead(4);
 int percentageHumididy = map(sensorVal, wet, dry, 100, 0);
 
 Serial.print(percentageHumididy);
 Serial.println("%");
 delay(100);
}

				
			

加入 DHT11 與光敏電阻感測器

請參考這篇文章"DIY 智慧溫室教學:用 ESP32 + 光敏電阻 + DHT11 監測光照與溫濕度",程式加入此篇的土壤感測器程式中,便可設計一組監測土壤濕度的模組。詳細接線程式如下:

土壤感測器接線圖
土壤感測器接線圖
				
					
#include <SimpleDHT.h>
#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

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作為輸入

  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);
  int percentageHumididy = map(sensorVal, wet, dry, 100, 0);  //將感測值比對成1~100%

  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秒感測一次
}
				
			

結果測試與輸出

進階應用:自動澆水系統雛形

當土壤濕度低於設定閾值(例如 30%),可觸發 繼電器控制水泵 進行自動澆水。
這樣一來,即使出門幾天,植物也能安心成長。

將準備一篇詳細說明,如何使用電磁開關啟動抽水馬達,並應用此篇教學,自動幫植物澆水。

結論

透過這個專案,我們學會了如何用 ESP32 整合多個感測器,打造一個能監測土壤濕度、溫濕度與光照的智慧植物系統。

這只是開始——接下來你可以加入 Wi-Fi 上傳、手機控制,甚至用語音助理來開關水泵。科技與自然的結合,就是這麼有趣又充滿創造力!

常見問答(FAQs)

Q1:土壤感測器 V2.0 與早期版本差在哪?
A1:V2.0 採用電容式原理,不會生鏽、壽命更長。

Q2:ESP32 可否同時讀取多個感測器?
A2:可以,ESP32 的 GPIO 足夠,並支援多任務處理。

Q3:感測值是否需校正?
A3:不同土壤特性不同,建議以實測為準再調整 map 範圍。

Q4:可否改用 ESP8266?
A4:可以,但腳位較少、需調整模擬輸入腳。

Q5:如何加上 Wi-Fi 上傳功能?
A5:可結合 Blynk、MQTT 或 ThingSpeak,即時傳送數據至雲端。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端