ระบบรดน้ำต้นไม้อัตโนมัติ ESP32
ระบบรดน้ำต้นไม้อัตโนมัติที่ให้ ESP32 อ่านค่าความชื้นดินจาก Soil Moisture Capacitive v2.0 แล้วตัดสินใจ เปิด/ปิดปั๊มน้ำ 12VDC ผ่าน รีเลย์ 1 ช่อง โดยอาศัยเงื่อนไข if … else if ตามค่าเกณฑ์ (threshold) ที่เราตั้งไว้
พูดง่าย ๆ:
ดินแห้งมาก → เปิดน้ำ
ดินชื้นพอ → ปิดน้ำ
ถ้าค่าอยู่กึ่งกลางก็ “คงสถานะเดิม” เพื่อลดการกระพริบเปิด–ปิดถี่ ๆ
ระบบรดน้ำต้นไม้ทำงานยังไง
- เซนเซอร์วัดความชื้นดิน → ส่งค่า แรงดันอนาล็อก ออกมา
- ESP32 อ่านค่าด้วย ADC แล้วคำนวณเป็น “เปอร์เซ็นต์ความชื้น” (หลังคาลิเบรต)
- ใช้ if … else if เปรียบเทียบกับ ค่า TH_LOW / TH_HIGH
- สั่งรีเลย์ ON/OFF → ควบคุมปั๊มน้ำ 12VDC
- วนลูปอ่าน–ตัดสินใจ–สั่งงานซ้ำ ๆ ตลอดเวลา
ทำไมเลือก “Capacitive v2.0” ?
- ทนกว่าแบบ Resistive (หัววัดไม่เป็นสนิมง่าย)
- สัญญาณนิ่งกว่า เหมาะกับงานที่ต้องเปิด–ปิดปั๊มบ่อย ๆ
- ต่อกับ ESP32 ง่าย: VCC, GND, AOUT → ขา ADC

คำศัพท์ที่ควรรู้
- 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 เข้าที่ขา
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)

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

การกำหนด 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 (เชื่อมต่อ & จัดการ)
- ESP32 Wi-Fi Library Functions – รวมฟังก์ชันเชื่อมต่อ/สแกน/จัดการ Wi-Fi
- สร้าง Wi-Fi Manager ด้วย ESPAsyncWebServer – เปลี่ยน 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 ของเซนเซอร์/อุปกรณ์แล้ววนลูปควบคุมทีละโซนได้เลย




