土壤濕度感測器應用:智慧農業的入門實例

土壤濕度感測器應用:智慧農業的入門實例

土壤濕度感測器能精準量測土壤含水量,協助農業專案提升灌溉效率與作物品質。本文介紹土壤濕度感測器的種類、應用場景與 Arduino 入門實驗,適合智慧農業研究、教育專題與自動灌溉系統設計。

什麼是土壤濕度感測器

常見兩種類型:

  • 電阻式:以電阻變化判斷乾濕,價格低、適合教學。
  • 電容式:受鹽分影響較小,訊號穩定,較適合長期監測。

應用場景

入門示警(本文示範)

根據乾濕程度點亮 LED 或鳴叫蜂鳴器,方便學生或研究人員快速觀察變化。

教學與專題

可搭配 Arduino/ESP32 完成量測、記錄、可視化與簡易自動化控制,適合科展或課程實作。

進階延伸(選配)

加入水流量感測器(如 YF-S201、G1/2、G3/4 等規格),在開啟閥門或手動澆水時,確認是否真的有水流通過,以避免「以為澆到水但其實沒流量」的情況。

所需材料清單

接線示意

  • 土壤濕度感測器訊號腳 → A0(類比輸入)
  • 繼電器或電晶體控制腳 → D7(數位輸出)
  • LED 示警(若不用繼電器):D6 → 電阻 → LED → GND
  • VCC 依模組規格接 3.3V 或 5V;GND 共地
  • (選配)水流量感測器訊號腳 → D2(數位輸入)

程式範例:可調整閾值+相容高/低電位觸發


// 土壤濕度入門示範(LED/蜂鳴器示警,無水泵)
// 可調整乾濕閾值,並相容「高/低電位觸發」的繼電器或電晶體模組
const int SOIL_PIN = A0;     // 土壤濕度讀取腳
const int ALERT_PIN = 7;     // 繼電器/電晶體或蜂鳴器控制腳
const int LED_PIN = 6;       // LED 示警(若不用可忽略)
const int DRY_THRESHOLD = 400;   // 低於此值視為偏乾,請依實測調整
// 若你的繼電器/電晶體是低電位觸發(常見),請設為 true
// 若為高電位觸發,請設為 false
const bool ACTIVE_LOW = true;
void setup() {
 pinMode(ALERT_PIN, OUTPUT);
 pinMode(LED_PIN, OUTPUT);
 digitalWrite(ALERT_PIN, ACTIVE_LOW ? HIGH : LOW); // 初始化為關閉
 digitalWrite(LED_PIN, LOW);
 Serial.begin(9600);
}
void setAlert(bool on) {
 // 將「是否啟動」轉為正確的電位輸出
 if (ACTIVE_LOW) {
   digitalWrite(ALERT_PIN, on ? LOW : HIGH);
 } else {
   digitalWrite(ALERT_PIN, on ? HIGH : LOW);
 }
 digitalWrite(LED_PIN, on ? HIGH : LOW);
}
void loop() {
 int soil = analogRead(SOIL_PIN);
 Serial.print("Soil raw: ");
 Serial.println(soil);
 bool isDry = (soil < DRY_THRESHOLD);
 setAlert(isDry);  // 偏乾則啟動蜂鳴器/繼電器與 LED
 delay(1000);
}

如何校正乾濕閾值

  • 先將探針完全置於乾燥土壤,記錄數值(約 600~900,依模組而異)。
  • 再將探針置於濕潤土壤,記錄數值(約 200~500)。
  • 以兩者中間或實際需求設定 DRY_THRESHOLD,例如 400。

加入水流量感測器(選配)

若要確認「澆水時是否真的有流量」,可讀取水流量感測器的脈波訊號做簡單判定。以下為概念化範例(不同型號腳位與係數略有差異)。


// 範例:偵測是否有水流(僅作為概念示意)
const int FLOW_PIN = 2;
volatile unsigned long pulseCount = 0;
unsigned long lastMillis = 0;
void IRAM_ATTR onFlowPulse() { // 某些板子不需 IRAM_ATTR,依平台調整
 pulseCount++;
}
void setupFlow() {
 pinMode(FLOW_PIN, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(FLOW_PIN), onFlowPulse, FALLING);
 lastMillis = millis();
}
void checkFlowOncePerSecond() {
 if (millis() - lastMillis >= 1000) {
   unsigned long pulses = pulseCount;
   pulseCount = 0;
   lastMillis = millis();
   // 只做有無流量判斷:有脈波即代表有水流
   bool hasFlow = (pulses > 0);
   Serial.print("Flow pulses/s: ");
   Serial.println(pulses);
   // 可依 hasFlow 做提示或記錄
 }
}

常見實作重點

  • 探針插拔次數不宜過多,易磨損或氧化;電容式較耐用。
  • 室外長期部署建議做防水與防腐蝕處理,並加遮雨結構。
  • 若要資料長期記錄,可加入 SD 卡、雲端或藍牙/Wi-Fi 上傳。

入門可先完成「土壤濕度偵測+LED/蜂鳴器提示」,熟悉後再加入水流量感測器、雲端上傳或低功耗無線傳輸。