สวัสดีครับนักศึกษาทุกคน ภาคเกษตรไทยกำลังก้าวสู่ Smart Farming และอุปกรณ์พื้นฐานที่สุดที่เกษตรกรต้องการคือ “ตัวช่วยรดน้ำ” ครับ
วันนี้เราจะมาทำระบบที่คอยตรวจจับว่า “ดินแห้งหรือยัง?” ถ้าแห้งแล้ว ให้สั่งเปิดปั๊มน้ำเอง และแจ้งเตือนเข้ามือถือเรา โดยใน Workshop นี้เราจะได้เรียนรู้เรื่องอุปกรณ์ใหม่ 2 ตัว คือ Soil Moisture Sensor (แบบ Capacitive) และ Relay Module ครับ
1. รู้จักอุปกรณ์: Soil Moisture Sensor (แบบไหนดี?)
เซนเซอร์วัดความชื้นดินในตลาดมี 2 แบบหลักๆ ต้องเลือกให้ถูกงานครับ:
- แบบความต้านทาน (Resistive): หน้าตาเป็น “ส้อมสีเงินๆ”
- ข้อดี: ราคาถูกมาก (20-30 บาท)
- ข้อเสีย: อย่าหาทำ! สำหรับโปรเจกต์ระยะยาว เพราะโดนน้ำกัดกร่อน (สนิมกิน) ภายใน 1-2 สัปดาห์ก็พังแล้วครับ
- แบบประจุ (Capacitive): หน้าตาเป็น “แท่งสีดำ” (แนะนำรุ่น v1.2 หรือ v2.0)
- ข้อดี: ทนทาน ไม่โดนกัดกร่อน แช่น้ำได้นานเป็นปี
- ข้อแนะนำ: ให้ใช้แบบนี้เสมอสำหรับงาน Smart Farm ครับ
2. รู้จักอุปกรณ์: Relay Module (สวิตช์ตัดต่อไฟ)
เนื่องจาก ESP32 จ่ายไฟได้แค่ 3.3V แต่ปั๊มน้ำใช้ไฟ 12V หรือ 220V เราจึงต้องใช้ Relay เป็นสะพานเชื่อมครับ
- ขาฝั่ง Input (ต่อเข้า ESP32): VCC, GND, IN
- ขาฝั่ง Output (ต่อเข้าปั๊ม):
- COM (Common): ขาไฟเข้า (สาย Line)
- NO (Normally Open): ปกติเปิด (ไฟไม่ไหล) -> ใช้ขานี้สำหรับปั๊มน้ำ (สั่งให้ทำงานถึงจะไหล)
- NC (Normally Closed): ปกติปิด (ไฟไหลตลอด)
3. การต่อวงจร (Wiring)
- Soil Moisture Sensor (Capacitive):
- VCC -> 3.3V
- GND -> GND
- AOUT (Analog Out) -> GPIO 34 (แนะนำขานี้เพราะเป็น Analog Input Only)
- Relay Module:
- VCC -> 5V (รีเลย์ส่วนใหญ่ชอบไฟ 5V) หรือ 3.3V (ถ้าเป็นรุ่นที่รองรับ)
- GND -> GND
- IN -> GPIO 23 (Digital Output)
[Image Suggestion: Diagram showing ESP32, Capacitive Soil Sensor on pin 34, and Relay Module on pin 23]
4. การหาค่า “แห้ง” และ “เปียก” (Calibration)
นี่คือขั้นตอนที่สำคัญที่สุด! ค่าที่อ่านได้จากเซนเซอร์ (0-4095) แต่ละตัวไม่เท่ากัน เราต้องหาค่าจริงก่อนเขียนโค้ดครับ
วิธีทำ:
- เขียนโค้ดสั้นๆ เพื่อ
analogRead(34)แล้วพ่นออกทาง Serial Monitor - อ่านค่าตอนแห้ง: ถือเซนเซอร์ไว้ในอากาศ (ยังไม่จุ่มน้ำ) -> จดค่าไว้ (เช่น ได้ค่าประมาณ 3000)
- อ่านค่าตอนเปียก: จุ่มเซนเซอร์ลงในแก้วน้ำ -> จดค่าไว้ (เช่น ได้ค่าประมาณ 1200)
สมมติว่า:
- แห้งสนิท (Air) = 3000
- เปียกชุ่ม (Water) = 1200 สังเกตว่า ยิ่งเปียก ค่าเน็ตยิ่งน้อย (Inverse)
5. เขียนโค้ด Smart Farm (Blynk)
ตั้งค่า Blynk Dashboard:
- V1 (Gauge): Soil Moisture (0-100%)
- V2 (Button): Manual Pump Switch (Switch Mode)
โค้ดโปรแกรม:
#define BLYNK_TEMPLATE_ID "TMPLxxxxxx" // **แก้ไข**
#define BLYNK_TEMPLATE_NAME "Smart Farm"
#define BLYNK_AUTH_TOKEN "YourToken" // **แก้ไข**
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char ssid[] = "YOUR_WIFI";
char pass[] = "YOUR_PASS";
const int sensorPin = 34; // ขาเซนเซอร์ความชื้น
const int relayPin = 23; // ขารีเลย์คุมปั๊ม
// ค่าที่ได้จากการ Calibrate (แต่ละคนจะไม่เท่ากัน ต้องแก้ตรงนี้!)
const int dryValue = 3000; // ค่าตอนแห้ง
const int wetValue = 1200; // ค่าตอนเปียก
BlynkTimer timer;
bool isManualMode = false; // ตัวแปรเช็คว่ากำลังเปิดปั๊มด้วยมือไหม
// รับคำสั่งปุ่มจากแอพ (V2)
BLYNK_WRITE(V2) {
int p = param.asInt();
if (p == 1) {
digitalWrite(relayPin, HIGH); // เปิดปั๊ม (Active High) *บางรุ่นเป็น Active Low ต้องแก้เป็น LOW
isManualMode = true; // เข้าโหมด Manual
Serial.println("Manual Pump: ON");
} else {
digitalWrite(relayPin, LOW); // ปิดปั๊ม
isManualMode = false; // กลับสู่โหมด Auto
Serial.println("Manual Pump: OFF");
}
}
void checkSoil() {
// ถ้าเปิดปั๊มด้วยมืออยู่ ไม่ต้องเช็ค Auto
if (isManualMode) return;
int rawValue = analogRead(sensorPin);
// แปลงค่า Analog เป็นเปอร์เซ็นต์ (0-100%)
// map(ค่าดิบ, ค่าแห้ง, ค่าเปียก, 0, 100)
int percent = map(rawValue, dryValue, wetValue, 0, 100);
// กันค่าเกินขอบเขต (Clamp)
if (percent > 100) percent = 100;
if (percent < 0) percent = 0;
// ส่งขึ้น Blynk
Blynk.virtualWrite(V1, percent);
Serial.print("Raw: "); Serial.print(rawValue);
Serial.print(" | Moisture: "); Serial.print(percent); Serial.println("%");
// --- Automation Logic ---
// ถ้าความชื้นต่ำกว่า 40% (ดินแห้ง) -> เปิดปั๊ม
if (percent < 40) {
digitalWrite(relayPin, HIGH);
Blynk.virtualWrite(V2, 1); // อัพเดทสถานะปุ่มในแอพให้ ON ตาม
Serial.println("Auto: Soil is Dry -> Pump ON");
}
// ถ้าความชื้นเกิน 80% (ดินชุ่มแล้ว) -> ปิดปั๊ม
else if (percent > 80) {
digitalWrite(relayPin, LOW);
Blynk.virtualWrite(V2, 0); // อัพเดทสถานะปุ่มในแอพให้ OFF ตาม
Serial.println("Auto: Soil is Wet -> Pump OFF");
}
}
void setup() {
Serial.begin(115200);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW); // ปิดปั๊มก่อนเริ่ม
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(10000L, checkSoil); // เช็คทุก 10 วินาที
}
void loop() {
Blynk.run();
timer.run();
}
6. ข้อควรระวัง (Active High vs Active Low)
Relay Module ในท้องตลาดมี 2 แบบ:
- Active High: สั่ง
HIGHแล้วทำงาน (ติด), สั่งLOWแล้วดับ - Active Low: สั่ง
LOWแล้วทำงาน (ติด), สั่งHIGHแล้วดับ (เจอบ่อยมาก!)
วิธีเช็ค: ลองสั่ง digitalWrite(relayPin, HIGH) ถ้าไฟสถานะที่รีเลย์ติด แสดงว่าเป็น Active High แต่ถ้าไฟดับ แสดงว่าเป็น Active Low (ต้องแก้โค้ดกลับกัน)
7. โจทย์ท้าทาย (Challenge)
- เซฟตี้ปั๊ม: ถ้าปั๊มทำงานต่อเนื่องเกิน 1 นาที แต่ความชื้นยังไม่ขึ้น (แสดงว่าน้ำหมดแท็งก์ หรือสายยางหลุด) ให้สั่งตัดปั๊มทันทีเพื่อป้องกันปั๊มไหม้ และแจ้งเตือนผ่าน Blynk
- ตั้งเวลารดน้ำ: เพิ่ม Time Input Widget ใน Blynk เพื่อตั้งเวลาให้รดน้ำเฉพาะช่วงเช้า (เช่น 08:00) ได้หรือไม่?
สรุปท้ายบท
การทำ Smart Farm ไม่ใช่เรื่องยากทางเทคนิค แต่เป็นเรื่องของ “การเลือกอุปกรณ์ให้ทนทาน” และ “การ Calibrate ค่า” ให้แม่นยำครับ ถ้านักศึกษาเข้าใจหลักการ Analog Sensor และ Relay นี้แล้ว สามารถเอาไปประยุกต์ใช้กับระบบพ่นหมอกโรงเห็ด หรือระบบเติมอากาศบ่อปลาได้สบายๆ ครับ
ภารกิจต่อไป: เราเดินทางมาถึงบทสุดท้ายแล้วครับ! ในบทความหน้า บทที่ 18 จะเป็น บทสรุปปิดคอร์ส เราจะมาทบทวนสิ่งที่เรียนไปทั้งหมด พร้อมแนวทางการต่อยอดทำ “Project จบระดับ ปวส.” ให้น่าสนใจและผ่านฉลุย รวมถึงอาชีพที่รองรับทักษะ IoT นี้ครับ
หมายเหตุสำหรับคุณครู:
- จุดที่ต้องเน้นย้ำนักศึกษาคือการ Calibrate (หาค่าแห้ง/เปียก) ครับ ถ้าใช้ค่าดิบตามโค้ดตัวอย่างเลยโดยไม่วัดของจริงก่อน ใช้งานไม่ได้แน่นอน 100% ครับ
- Relay Module เป็นอุปกรณ์ที่มีไฟ 220V เข้ามาเกี่ยวข้องในการใช้งานจริง ครูควรเน้นเรื่องความปลอดภัยทางไฟฟ้า (การขันสกรูให้แน่น, การไม่จับขณะจ่ายไฟ) เป็นพิเศษครับ
