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

ระบบรดน้ำต้นไม้อัตโนมัติ ESP32

ระบบรดน้ำต้นไม้อัตโนมัติที่ให้ ESP32 อ่านค่าความชื้นดินจาก Soil Moisture Capacitive v2.0 แล้วตัดสินใจ เปิด/ปิดปั๊มน้ำ 12VDC ผ่าน รีเลย์ 1 ช่อง โดยอาศัยเงื่อนไข if … else if ตามค่าเกณฑ์ (threshold) ที่เราตั้งไว้

พูดง่าย ๆ:
ดินแห้งมาก → เปิดน้ำ
ดินชื้นพอ → ปิดน้ำ
ถ้าค่าอยู่กึ่งกลางก็ “คงสถานะเดิม” เพื่อลดการกระพริบเปิด–ปิดถี่ ๆ

ระบบรดน้ำต้นไม้ทำงานยังไง

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

ทำไมเลือก “Capacitive v2.0” ?

  • ทนกว่าแบบ Resistive (หัววัดไม่เป็นสนิมง่าย)
  • สัญญาณนิ่งกว่า เหมาะกับงานที่ต้องเปิด–ปิดปั๊มบ่อย ๆ
  • ต่อกับ ESP32 ง่าย: VCC, GND, AOUT → ขา ADC
esp32-auto-watering-soil-capacitive-v2
Sensor Soil Moisture Capacitive V2.0

คำศัพท์ที่ควรรู้ 

  • ADC (Analog-to-Digital Converter): ตัวแปลงแรงดันอนาล็อกจากเซนเซอร์ให้ ESP32 อ่านเป็นตัวเลขได้
  • Threshold (TH): ค่าเกณฑ์ตัดสินใจ เช่น TH_LOW (แห้งมาก) และ TH_HIGH (ชื้นพอ)
  • Hysteresis: การทำ “สองเกณฑ์” เพื่อลดอาการเปิด–ปิดถี่ ๆ (≤TH_LOW เปิด, ≥TH_HIGH ปิด)
  • Active LOW/High: โมดูลรีเลย์บางตัว “สั่งงานด้วยสัญญาณ LOW” ต้องตั้งค่าให้ถูก

วิดีโอ

อุปกรณ์ที่ใช้

1) ESP32 DevKit (แนะนำรุ่น DevKit V1 – ESP-WROOM-32)

  • ทำไมเลือกตัวนี้: มี Wi-Fi+BT ในตัว, ขา ADC เยอะ, ใช้กับ Arduino IDE ได้ง่าย
  • สเปคขั้นต่ำที่ควรมี: ชิป ESP-WROOM-32, พอร์ต USB-to-Serial (CP2102/CH340), จ่ายไฟผ่าน USB 5V
  • ขาที่ใช้ในบทนี้: (เรียนรู้การใช้งานขา esp32 pinout ได้ที่นี้)
    • GPIO34 (หรือ 32/33/35/36/39) สำหรับอ่านค่าอนาล็อกจาก Soil Sensor
    • GPIO26 (หรือขาอื่น) ควบคุมรีเลย์
  • การต่อไฟ: เสียบ USB จากคอม/อะแดปเตอร์ 5V → ห้าม นำ 5V จากบอร์ดไปเลี้ยงปั๊ม
  • ข้อควรระวัง: ESP32 ใช้ลอจิก 3.3V, ระวังอย่าให้สัญญาณ > 3.3V เข้าที่ขา

รู้จัก ESP32 คืออะไร? จุดเด่น ฟีเจอร์ และการใช้งานเบื้องต้น

2) Soil Moisture Sensor (Capacitive v2.0)

  • ทำไมเลือกตัวนี้: แบบ Capacitive ทนกว่า แบบเข็ม (ไม่ผุ/ไม่โดนไฟฟ้ากัดกร่อนง่าย)
  • สเปคที่ควรเช็ค: รองรับไฟเลี้ยง 3.3–5V, มีขา AOUT (การใช้งาน ขา Analog โดยละเอียด  esp32 Analog Read
  • วิธีต่อ:
    • VCC → 3V3 (จาก ESP32)
    • GND → GND (ร่วมกับ ESP32)
    • AOUT → GPIO34 (ขา ADC-only)
  • การคาลิเบรตเบื้องต้น: จุ่มดินแห้ง/ชื้น วัดค่า RAW เพื่อกำหนด rawDry/rawWet ก่อนคำนวณ %
  • ข้อควรระวัง: เดินสายให้ไกลจากปั๊ม/รีเลย์เพื่อลดสัญญาณรบกวน, อย่าจุ่มบอร์ดทั้งแผ่นลงน้ำ (จุ่มเฉพาะส่วนหัววัด)

3) Relay 1 ช่อง (5V/3.3V logic, ใช้กับปั๊ม 12VDC)

  • หน้าที่: ทำตัวเป็นสวิตช์ตัด-ต่อไฟ 12V ให้ปั๊ม (โหลด DC)
  • แบบที่แนะนำ: รีเลย์โมดูลที่ สั่งด้วยลอจิก 3.3V ได้ หรือมี ทรานซิสเตอร์ไดรฟ์ ในบอร์ด
    (ถ้าเป็นบอร์ดแบบ “Active LOW” ให้ปรับโค้ดให้ตรง)
  • วิธีต่อสัญญาณ:
    • IN → GPIO26 จาก ESP32
    • VCC/GND ของโมดูลรีเลย์ → 5V/GND (หรือ 3.3V/GND ตามรุ่นที่รองรับ)
  • วิธีตัด-ต่อไฟปั๊ม: ใช้คอนแทค COM กับ NO ตัด-ต่อ สายบวก +12V ไปเข้าปั๊ม
  • ข้อควรระวัง:
    • ห้าม ต่อโหลด AC ถ้าไม่ชำนาญ (ในบทเรียนนี้ใช้ 12VDC เท่านั้น ปลอดภัยกว่า)
    • รีเลย์บางรุ่นต้อง 5V ที่ขดลวด แต่สามารถสั่งงานด้วย 3.3V ได้ 
    • รู้ค่า Active LOW/HIGH ของโมดูล เพื่อตั้งสถานะเริ่มต้นให้ปลอดภัย (ปั๊มไม่พุ่งทันทีตอนบูต)

 

4) ปั๊มน้ำ 12VDC + อะแดปเตอร์ 12V

  • เลือกปั๊มแบบไหน: ปั๊มจุ่ม/ปั๊มไมโคร 12V ขนาด 3–10W ก็พอสำหรับกระถาง/รางเล็ก ๆ
  • เลือกอะแดปเตอร์: 12V กระแสพอหรือมากกว่า ปั๊ม (เช่น ปั๊ม 0.5A เลือกอะแดปเตอร์ ≥ 1A เพื่อเผื่อสตาร์ต)
  • การต่อ:
    • ขั้ว +12V ผ่านรีเลย์ไปเข้าปั๊ม, ขั้ว GND 12V กลับสู่อะแดปเตอร์
    • อย่าลืม รวม GND ของระบบถ้าคุณใช้รีเลย์แบบไม่แยกกราวด์ (ESP32 GND ↔ รีเลย์ GND)
  • ข้อควรระวัง:
    • เช็คขั้ว +/− ให้ถูกต้อง, สายฝั่งแรงดัน 12V ใช้สายใหญ่หน่อย (AWG20–18)
ปั้มน้ำ 12 vdcที่ใช้ในโครงงานระบบรดน้ำต้นไม้อัตโนมัติ ด้วย ESP32
ปั้มน้ำ 12 Vdc

การต่อวงจรเบื้องต้น (Wiring)

เซนเซอร์: VCC → 3V3, GND → GND, AOUT → GPIO34 (แนะนำขา ADC ที่อ่านอย่างเดียว เช่น 32/33/34/35/36/39)

 

รีเลย์: IN → GPIO26 , VCC/GND → 5V/GND หรือ 3V3/GND ตามบอร์ดรีเลย์, คอนแทครีเลย์ COM/NO → ปั๊ม 12V (ต่อขั้ว +)

 

หมายเหตุ: รวม GND ของ ESP32, เซนเซอร์, รีเลย์ เข้าด้วยกัน

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

// ====== ตั้งค่า Pin ======
const int PIN_SOIL = 34; // ADC-only pin แนะนำ 32/33/34/35/36/39
const int PIN_RELAY = 26; // ขารีเลย์

// ====== ค่าคาลิเบรต (วัดจากชุดจริงของคุณ) ======
int rawDry = 3300; // ตัวอย่าง: ดินแห้ง
int rawWet = 1500; // ตัวอย่าง: ดินเปียก

// ====== เกณฑ์ตัดสินใจ (ตาม % ความชื้น) ======
int TH_LOW = 35; // ≤35% เปิดน้ำ
int TH_HIGH = 60; // ≥60% ปิดน้ำ

// รีเลย์ Active LOW?
bool relayActiveLow = true; // ถ้าโมดูลคุณสั่งงานด้วย LOW ให้ true

// เก็บสถานะปั๊ม
bool pumpOn = false;

// ====== ฟังก์ชันช่วยแปลงค่า ======
int moisturePercentFromRaw(int raw) {

int pct = map(raw, rawDry, rawWet, 0, 100);
return constrain(pct, 0, 100); // 100%=เปียกมาก, 0%=แห้งมาก 
}

void setPump(bool on) {
pumpOn = on;
int level = on ? (relayActiveLow ? LOW : HIGH)
: (relayActiveLow ? HIGH : LOW);
digitalWrite(PIN_RELAY, level);
}

void setup() {
Serial.begin(115200);
pinMode(PIN_RELAY, OUTPUT);
setPump(false);
}

void loop() {

// อ่านค่าแบบเฉลี่ยง่าย ๆ กันสั่น
const int N = 10;
long sum = 0;
for (int i = 0; i < N; i++) {
sum += analogRead(PIN_SOIL);
delay(5);
}
int raw = sum / N;

// แปลงเป็น % ความชื้น (อิงคาลิเบรต)
int moisturePct = moisturePercentFromRaw(raw);

// หมายเหตุ: ถ้าค่า % ที่ออกมา "ยิ่งเปียกยิ่งมาก" (เช่น 80% = เปียก)
// และ "ยิ่งแห้งยิ่งน้อย" (เช่น 20% = แห้ง) ให้เลือก Threshold ให้สอดคล้อง
// ตัวอย่างนี้: <= TH_LOW ถือว่าแห้งมากพอจะ "เปิด" ก็กลับทิศทางได้ตามคาลิเบรตคุณ
// จัดให้แบบเข้าใจง่าย: ถ้าคุณตีความว่า "เปอร์เซ็นต์ความชื้นจริง"
// ให้สลับ rawDry/rawWet หรือสลับเงื่อนไขตามที่วัดได้

// ====== ตัดสินใจด้วย if / else if ======
if (moisturePct <= TH_LOW) {
// แห้ง → เปิดน้ำ
setPump(true);
} else if (moisturePct >= TH_HIGH) {
// ชื้นพอ → ปิดน้ำ
setPump(false);
} else {
// โซนกลาง → คงสถานะเดิม
}

Serial.printf("RAW=%d Moisture(%%)=%d Pump=%s\n", raw, moisturePct, pumpOn ? "ON":"OFF");
delay(500);
}

ดาว์นโหลดโค้ด

กรุณา เข้าสู่ระบบ เพื่อดาวน์โหลด

หลักการทำงานของเซนเซอร์ + การแปลงค่า (Soil Moisture Capacitive v2.0)

ทำงานยังไง?

  • ตัว v2.0 เป็น capacitive sensor: ไม่มีขาโลหะจุ่มไฟฟ้าเหมือนรุ่นแบบตัวนำไฟฟ้า จึง ทนต่อการกัดกร่อน กว่า
  • เวลาดินชื้นขึ้น ค่าความจุไฟฟ้าเพิ่ม → วงจรภายในแปลงเป็น แรงดันอนาล็อก (AOUT) ออกมาให้ ESP32 อ่าน

ต้องรู้ก่อนอ่านค่า

  • ESP32 อ่านอนาล็อกแบบ 12-bit → ช่วงดิบ 0–4095
  • ส่วนมากเซนเซอร์รุ่นนี้ให้ผลแบบ “ดินแห้ง = ค่าดิบสูง / ดินเปียก = ค่าดิบต่ำ” (แต่ชุดแต่ละคนอาจต่างกันเล็กน้อย จึงต้องคาลิเบรตเอง)

คาลิเบรตหาค่า rawDry และ rawWet (สำคัญมาก)

  1. ต่อเซนเซอร์ให้เรียบร้อย (AOUT → ขา ADC เช่น GPIO34, VCC → 3V3, GND → GND)
  2. เปิด Serial Monitor อ่านค่าเมื่อ ดิน/อากาศแห้ง → จดเป็น rawDry (~3000–3600)
  3. จุ่มลง ดินเปียก/น้ำ (อย่าท่วมบอร์ด) รอค่านิ่ง → จดเป็น rawWet (~1200–1800)
  4. ยืนยัน “ทิศทาง” ว่าแห้งสูง-เปียกต่ำจริงไหม ถ้าได้ ทิศทางกลับกัน ก็ สลับตัวแปร ตอนคำนวณ

แปลงเป็น % ความชื้น (0–100)
แนวคิดคือทำ สเกลเชิงเส้น ระหว่าง rawWet ↔ rawDry ให้กลายเป็นเปอร์เซ็นต์ที่อ่านง่าย ให้ 0% = ดินแห้งสุด, 100% = ดินเปียกสุด

// ====== ฟังก์ชันช่วยแปลงค่า ======
int moisturePercentFromRaw(int raw) {

int pct = map(raw, rawDry, rawWet, 0, 100);
return constrain(pct, 0, 100); // 0%=แห้งมาก, 100%=เปียกมาก (หรือกลับทิศตามการคาลิเบรต)
}

ถ้าคุณยังไม่รู้ว่า ESP32 ADC คืออะไร หรือยังงงว่าค่าที่อ่านมาหมายถึงอะไร
แนะนำให้เริ่มจากบทความนี้ก่อน: ESP32 ADC คืออะไร — พื้นฐานที่ต้องรู้ก่อนใช้งาน Analog

ภาพอุปกรณ์และการต่อวงจรไฟฟ้าโครงงานระบบรดน้ำต้นไม้อัตโนมัติด้วย ESP32
ภาพโครงงาน ระบบรดน้ำต้นไม้อัตโนมัติ

การกำหนด Threshold ด้วย if / else if

เราใช้ “เกณฑ์ 2 ค่า” (เรียกว่าฮิสเทอรีซิส—Hysteresis) เพื่อกันปั๊ม “กระตุก เปิด–ปิดถี่ ๆ”

  • TH_LOW: ต่ำกว่านี้ = ดินแห้ง → เปิดปั๊ม
  • TH_HIGH: สูงกว่านี้ = ดินชื้นพอ → ปิดปั๊ม
  • ค่าระหว่างกลาง: ให้ “คงสถานะเดิม”

กำหนดตัวแปร

กำหนดให้ moisturePct = เปอร์เซ็นต์ความชื้นดิน ที่เรา “แปลงมาจากค่า ADC แล้ว”
แนะนำให้ตีความแบบนี้เพื่อไม่สับสน:

0% = แห้งมาก

100% = เปียกมาก

เลือกค่าเริ่มต้นที่ปลอดภัย (ปรับทีหลังได้):

int TH_LOW = 35; // ≤35% ถือว่าแห้ง → เปิดปั๊ม
int TH_HIGH = 60; // ≥60% ถือว่าชื้นพอ → ปิดปั๊ม

เว้น “ช่วงกว้าง” ระหว่าง LOW ↔ HIGH สัก 15–25% จะช่วยกันเด้งได้ดี

การตัดสินใจ (if / else if)

bool pumpOn = false;      // เก็บสถานะปั๊มไว้เสมอ

void loop() {

// ====== ตัดสินใจด้วย if / else if ======
  if (moisturePct <= TH_LOW) {
    // แห้ง → เปิดน้ำ
    setPump(true);
  } else if (moisturePct >= TH_HIGH) {
    // ชื้นพอ → ปิดน้ำ
    setPump(false);
  } else {
    // คงสถานะเดิม
  }
}

คอร์ส ESP32 Beginner Guide

โครงงานรดน้ำอัตโนมัติ ตั้งค่าระบบผ่านมือถือ

“อยากเริ่มต้น  ESP32 แต่ไม่รู้จะเริ่มตรงไหน? คลิกดูรายละเอียดคอร์สเลย!”

สรุป

ระบบรดน้ำอัตโนมัติพื้นฐานนี้ใช้ ESP32 + Soil Moisture Capacitive v2.0 + รีเลย์ + ปั๊มน้ำ 12V อ่านค่า ADC แล้ว “คาลิเบรต” ให้เป็นเปอร์เซ็นต์ความชื้น จากนั้นใช้เงื่อนไข if … else if แบบมี ฮิสเทอรีซิส (TH_LOW / TH_HIGH) เพื่อลดการเปิด–ปิดถี่ ๆ:

  • ≤ TH_LOW ⇒ เปิดปั๊ม
  • ≥ TH_HIGH ⇒ ปิดปั๊ม
  • ค่าตรงกลาง ⇒ คงสถานะเดิม

จุดสำคัญคือ คาลิเบรต (ค่าดินแห้ง/ดินเปียก), ใช้ ADC1 ของ ESP32, และตั้ง เวลาขั้นต่ำ ON/OFF เพิ่มความเสถียร เมื่อตั้งต้นนิ่งแล้ว ค่อยต่อยอดไปสั่งงานผ่านมือถือ/แอป PoPo (Wi-Fi Local) หรือขยายเป็นหลายโซนได้ไม่ยาก

เนื้อหาเกี่ยวข้อง: Wi-Fi & ESP WebServer

🔌 Wi-Fi (เชื่อมต่อ & จัดการ)

🌐 ESP WebServer (ESPAsyncWebServer)

(แนะนำให้อ่านคู่กับ Wi-Fi Manager ด้านบน เพื่อทำหน้า config/สั่งปั๊มผ่านเบราว์เซอร์)

FAQ คำถามที่พบบ่อย

1) ต้องคาลิเบรตยังไงให้ได้ % ความชื้นที่เชื่อถือได้?
วัดค่า RAW แห้ง (rawDry) และ RAW เปียก (rawWet) จากชุดของคุณเอง แล้วแปลงเชิงเส้นเป็น 0–100% จากนั้น constrain() ไม่ให้เกินช่วง และทดสอบซ้ำจนคงที่

2) ตั้ง TH_LOW / TH_HIGH เท่าไรดีสำหรับดินปลูกทั่วไป?
เริ่มที่ TH_LOW ≈ 35% และ TH_HIGH ≈ 60% แล้วจูนตามพืช/วัสดุปลูก (พืชชอบชื้น: เพิ่ม TH_HIGH, ลด TH_LOW / พืชชอบแห้ง: ทำกลับกัน)

3) ทำไมค่าที่อ่านเหมือน “กลับทิศ” (ยิ่งเปียกยิ่งเลขน้อย)?
เป็นปกติของหลายชุด Capacitive: RAW เปียกมัก ต่ำ กว่า RAW แห้ง แก้โดยสลับ rawDry/rawWet ในสมการ หรือกลับทิศเปอร์เซ็นต์ให้ตรงกับความหมายที่ต้องการ

4) ค่า ADC แกว่ง/มีสัญญาณรบกวน แก้ยังไง?
ทำ ค่าเฉลี่ยหลายครั้ง, เว้นระยะ delay(3–10 ms) ระหว่างอ่าน, แยกสายสัญญาณเซนเซอร์ห่างสายมอเตอร์/ปั๊ม, ใช้สายชิลด์/บิดเกลียว, เพิ่ม RC filter อ่อน ๆ ได้ถ้าจำเป็น

5) ใช้ขาไหนของ ESP32 อ่านค่าเซนเซอร์ดีสุด? (ADC1 vs ADC2)
แนะนำ ADC1 (GPIO32–39) เพื่อเลี่ยงชนกับ Wi-Fi (ADC2 จะมีปัญหาเมื่อเปิด Wi-Fi) ขาที่อ่านอย่างเดียวอย่าง GPIO34/35/36/39 เหมาะมาก (เรียนรู้ การใช้งานขา ESP32)

6) รู้ได้ไงว่ารีเลย์เป็น Active LOW หรือ Active HIGH?
ลอง digitalWrite(HIGH)/LOW กับบอร์ดเปล่า ๆ แล้วสังเกตรีเลย์/LED บนโมดูล ถ้า LOW แล้วติด/ทำงาน = Active LOW บันทึกค่าไว้ใช้ในโค้ด relayActiveLow

7) ปั๊มน้ำ 12V ใช้รีเลย์หรือ MOSFET ดีกว่า? ต้องใส่ไดโอดไหม?

  • รีเลย์: ตรงไปตรงมา รองรับกระแสสูง แต่มีเสียงคลิก
  • MOSFET: เงียบ ประสิทธิภาพดี เหมาะ DC load
    ไม่ว่าแบบไหน วงจรที่ใช้ทรานซิสเตอร์ต้องมี ไดโอดกันกระแทก (flyback) คร่อมปั๊มเสมอ; รีเลย์โมดูลส่วนใหญ่มีไดโอดฝั่งคอยล์แล้ว

8) เซนเซอร์ Capacitive v2.0 จ่ายไฟ 3.3V หรือ 5V ดี?
ส่วนมากรองรับ 3.3–5V แต่ต่อกับ ESP32 แนะนำ 3.3V เพื่อลดความเสี่ยงแรงดันขาออกเกิน ADC (ถ้าใช้ 5V ต้องมั่นใจว่าเอาต์พุตไม่เกิน 3.3V)

9) ปั๊มเปิด–ปิดถี่เกิน/เด้งไปมา แก้ยังไง?
ใช้ ฮิสเทอรีซิส (TH_LOW/TH_HIGH), บังคับ ขั้นต่ำเวลา ON/OFF (เช่น ON อย่างน้อย 10–30 วินาที และ OFF อย่างน้อย 1–3 นาที), และอ่านค่าแบบเฉลี่ย

10) อยากสั่งงานจากมือถือ/ทำหลายโซนทำยังไง?
ต่อยอดด้วย แอป PoPo (Wi-Fi Local) ให้ปรับค่า TH_LOW/TH_HIGH และสั่ง Manual/Timer/Auto ได้ทันที ส่วนหลายโซนใช้ หลายช่อง ADC + หลายรีเลย์/โซลินอยด์วาล์ว โค้ดจัดเป็น array ของเซนเซอร์/อุปกรณ์แล้ววนลูปควบคุมทีละโซนได้เลย

Shopping Cart
Scroll to Top