ระบบรดน้ำต้นไม้เบื้องต้น (ESP32 + Soil Moisture Capacitive V2.0)

by devadiy99 in Circuits > Arduino

17 Views, 0 Favorites, 0 Comments

ระบบรดน้ำต้นไม้เบื้องต้น (ESP32 + Soil Moisture Capacitive V2.0)

esp32-auto-watering-soil-youtube.png

โปรเจกต์นี้ใช้ ESP32 อ่านค่าความชื้นดินจากเซนเซอร์ Soil Moisture Capacitive v2.0 แล้วตัดสินใจเปิด/ปิดปั๊มน้ำ 12V ผ่านรีเลย์ โดยตั้งค่าเกณฑ์ความชื้นแบบ ฮิสเทอรีซิส (2 ค่า TH_LOW / TH_HIGH) เพื่อลดอาการเปิด–ปิดถี่ ๆ เหมาะมากสำหรับมือใหม่ที่อยากเริ่มทำระบบรดน้ำอัตโนมัติแบบ Local ไม่ง้อคลาวด์


ภาพรวมการทำงาน: เซนเซอร์ → ESP32 แปลงเป็นเปอร์เซ็นต์ → เปรียบเทียบกับ TH_LOW/TH_HIGH → สั่งรีเลย์ควบคุมปั๊ม.


👉 อ่านบทความต้นฉบับแบบละเอียดได้ที่ Deva DIY – ระบบรดน้ำต้นไม้เบื้องต้น (ESP32 + Soil Capacitive v2.0)

Supplies

P1040077.JPG
P1040075.JPG
P1040078.JPG

ESP32 DevKit V1 (ESP-WROOM-32) – ใช้ได้ง่าย, ADC เยอะ, เหมาะกับ Arduino IDE

  1. ขาที่ใช้: ADC (เช่น GPIO34) สำหรับเซนเซอร์, GPIO26 คุมรีเลย์
  2. หมายเหตุ: ลอจิก 3.3V และห้ามเอา 5V จากบอร์ดไปเลี้ยงปั๊ม

Soil Moisture Sensor (Capacitive v2.0) – ทนสนิมกว่าแบบเข็ม, สัญญาณนิ่ง, ต่อกับ ADC ได้ตรง ๆ

Relay 1-Channel (3.3V/5V) – ควบคุมปั๊มน้ำ 12V (รู้สถานะ Active LOW/HIGH และตั้งค่าเริ่มต้นให้ปลอดภัย)

ปั๊มน้ำ 12V + อะแดปเตอร์ 12V – เลือกกระแสเผื่อสตาร์ต (เช่นปั๊ม 0.5A ใช้หม้อแปลง ≥ 1A)

สายไฟ/สายจัมเปอร์, บอร์ดลอง (Breadboard), หัวแร้ง/ตะกั่ว (ถ้าจำเป็น)


ถ้ายังไม่รู้จัก ESP32 อ่านเพิ่มเติมได้ที่ ESP32 คืออะไร? คู่มือเริ่มต้นสำหรับ Maker

เข้าใจหลักการ (How It Works)

  1. เซนเซอร์ให้แรงดันอนาล็อกตามความชื้น
  2. ESP32 อ่านค่า ADC → แปลงเป็น “เปอร์เซ็นต์ความชื้น” (หลังคาลิเบรต)
  3. ใช้ if … else if เปรียบเทียบ TH_LOW / TH_HIGH
  4. สั่งรีเลย์ ON/OFF → คุมปั๊ม 12V
  5. วนลูปอ่าน–ตัดสินใจ–สั่งงานซ้ำ ๆ

ทำไมต้อง “Capacitive v2.0”? เพราะ ทนกว่า, สัญญาณนิ่ง, และ ต่อกับ ESP32 ง่าย.

การต่อวงจร (Wiring)

  1. เซนเซอร์: VCC → 3V3, GND → GND, AOUT → GPIO34 (หรือ ADC ที่อ่านได้ เช่น 32/33/34/35/36/39)
  2. รีเลย์: IN → GPIO26, VCC/GND → 5V/GND (หรือ 3V3/GND ตามรุ่น), คอนแทค COM/NO ตัดต่อสาย +12V ไปเข้าปั๊ม
  3. หมายเหตุ: รวม GND ของ ESP32, เซนเซอร์, รีเลย์ เข้าด้วยกัน
  4. ความปลอดภัยฝั่ง 12V: เช็คขั้ว +/− ให้ถูกต้อง, ใช้สายใหญ่ขึ้นนิด (AWG20–18)
เคล็ดลับ: ตั้งค่าเริ่มต้นให้ “ปั๊มไม่ติดตอนบูต” ตาม Active LOW/HIGH ของรีเลย์ที่ใช้.


คาลิเบรตเซนเซอร์ & ตั้งเกณฑ์

  1. อ่านค่า raw ADC ตอน ดินแห้ง (กำหนดเป็น rawDry) และตอน ดินเปียก (rawWet)
  2. ใช้ฟังก์ชันช่วยแปลงค่าเป็นเปอร์เซ็นต์ เช่น map() + constrain()
// ====== ฟังก์ชันช่วยแปลงค่า ======
int moisturePercentFromRaw(int raw) {
int pct = map(raw, rawDry, rawWet, 0, 100);
return constrain(pct, 0, 100); // 0%=แห้งมาก, 100%=เปียกมาก (สลับทิศได้ตามคาลิเบรต)
}

(อ้างอิงแนวคิดจากบทความเดิม)

  1. ตั้ง TH_LOW (ต่ำกว่านี้ = เปิดปั๊ม), TH_HIGH (สูงกว่านี้ = ปิดปั๊ม), ช่วงระหว่างกลาง = คงสถานะเดิม เพื่อลดการกระพริบเปิด–ปิดถี่ ๆ.

รายละเอียดเพิ่มเติมเกี่ยวกับการอ่านค่าจากขา ADC ของ ESP32 ดูได้ที่ ESP32 Analog Read

โค้ดตัวอย่าง (Arduino IDE สำหรับ ESP32)

// === Auto Watering: ESP32 + Soil Capacitive v2.0 (Hysteresis) ===
// Pins (ปรับตามบอร์ดของคุณ)
const int PIN_SOIL_ADC = 34; // GPIO34 (ADC1) แนะนำ ADC1
const int PIN_RELAY = 26; // IN ของรีเลย์

// ค่าคาลิเบรตหน้างาน (อ่านจริงแล้วอัปเดต)
int rawDry = 3000; // ค่า ADC ตอนดินแห้ง
int rawWet = 1200; // ค่า ADC ตอนดินเปียก

// เกณฑ์ฮิสเทอรีซิส (%)
int TH_LOW = 35; // ต่ำกว่านี้ เปิดปั๊ม
int TH_HIGH = 55; // สูงกว่านี้ ปิดปั๊ม

// รีเลย์ Active LOW หรือ HIGH? (เปลี่ยนตามโมดูลของคุณ)
const bool RELAY_ACTIVE_LOW = true;

// สถานะปั๊มจำไว้ เพื่อลดการสลับถี่ ๆ
bool pumpOn = false;

int moisturePercentFromRaw(int raw) {
// แปลงค่า raw → 0..100% (กลับทิศได้ด้วยการสลับ rawDry/rawWet)
int pct = map(raw, rawDry, rawWet, 0, 100);
pct = constrain(pct, 0, 100);
return pct;
}

void applyRelay(bool on) {
pumpOn = on;
if (RELAY_ACTIVE_LOW) {
digitalWrite(PIN_RELAY, on ? LOW : HIGH);
} else {
digitalWrite(PIN_RELAY, on ? HIGH : LOW);
}
}

void setup() {
Serial.begin(115200);
pinMode(PIN_RELAY, OUTPUT);
// ตั้งให้ปลอดภัยตอนเปิดเครื่อง (ปั๊มไม่พุ่งทันที)
applyRelay(false);
}

void loop() {
int raw = analogRead(PIN_SOIL_ADC);
int pct = moisturePercentFromRaw(raw);

// ฮิสเทอรีซิส: ตัดสินใจเปิด/ปิด ตามสองเกณฑ์
if (pct <= TH_LOW) {
applyRelay(true); // ดินแห้งมาก → เปิด
} else if (pct >= TH_HIGH) {
applyRelay(false); // ดินชื้นพอ → ปิด
} // ช่วงกลาง คงสถานะเดิม (ไม่ทำอะไร)

// Debug
Serial.print("RAW="); Serial.print(raw);
Serial.print(" Soil%="); Serial.print(pct);
Serial.print(" Pump="); Serial.println(pumpOn ? "ON" : "OFF");

delay(1000); // หน่วงอ่านค่า 1 วิ (ลดการสวิง)
}

แกนคิดเหมือนในบทความ: ใช้ ADC1, คาลิเบรตเป็นเปอร์เซ็นต์, ตั้ง TH_LOW/TH_HIGH กันสั่น และคงสถานะเดิมในช่วงกลาง.

ทดสอบ & ปรับแต่ง

เริ่มจาก TH_LOW ~ 35% / TH_HIGH ~ 55% แล้วลองปรับตามชนิดดิน กระถาง พืช

ถ้า “ปั๊มสวิง” ให้เพิ่มช่องว่างระหว่าง TH_LOW กับ TH_HIGH (เช่น 30/60)

ตั้ง เวลาขั้นต่ำในการ ON/OFF (ถ้าต้องการ) เพื่อกันการเปิดปิดถี่ ๆ เพิ่มเติม.

ปัญหาที่พบบ่อย (Troubleshooting)

ค่า ADC เพี้ยน/กลับทิศ → ตรวจ rawDry/rawWet ให้ถูก, บางรุ่นยิ่งแห้งยิ่งแรงดันสูง/ต่ำต่างกัน ให้สลับพารามิเตอร์ใน map()

รีเลย์ทำงานกลับขั้ว → ตั้ง RELAY_ACTIVE_LOW ให้ตรงกับโมดูล

ปั๊มติดตอนบูต → เซ็ตสถานะเริ่มต้นใน setup() ให้ปิดไว้ก่อน และเช็ค Active LOW/HIGH ของรีเลย์

ไฟ 12V สะดุด → ใช้อะแดปเตอร์เผื่อกระแส ≥ กระแสปั๊มและรวม GND ระบบให้เรียบร้อย.

ต่อไปทำอะไรได้บ้าง (Next Steps)

  1. ทำ UI หน้าเว็บ/มือถือสั่งงานแบบ Local (เช่น ESPAsyncWebServer หรือแอป PoPo Wi-Fi Local)
  2. แยกโซนรดน้ำหลายกระถาง เพิ่มรีเลย์หลายช่อง
  3. บันทึกข้อมูลความชื้น/เวลารดน้ำ เพื่อปรับสูตรให้เหมาะกับพืช


เครดิตอ้างอิงต้นทาง

บทความนี้เผยแพร่โดยทีม Deva DIY
แหล่งเรียนรู้ ESP32 + Smart Farm ภาษาไทย
ดูรายละเอียดเพิ่มเติมที่ https://devadiy.com