เนื้อหาในบทความ
🌱 ภาพรวมโปรเจกต์
ระบบรดน้ำพืชอัจฉริยะ (Smart Plant Watering System) เป็นโปรเจกต์ IoT ที่ช่วยให้คุณดูแลพืชได้อัตโนมัติ โดยใช้เซ็นเซอร์ตรวจจับความชื้นในดิน เมื่อดินแห้งระบบจะสั่งให้ปั๊มน้ำทำงานรดน้ำให้พืชโดยอัตโนมัติ
✨ คุณสมบัติหลัก
- ✅ ตรวจจับความชื้นในดินแบบ Real-time
- ✅ รดน้ำอัตโนมัติเมื่อดินแห้ง
- ✅ ประหยัดน้ำด้วยการรดน้ำเฉพาะเมื่อจำเป็น
- ✅ ติดตามสถานะผ่าน CynoIoT Platform
- ✅ รองรับ Manual Watering ผ่าน Mobile App
🔧 อุปกรณ์ที่ต้องใช้
Hardware Components
ESP32 Development Board
บอร์ดไมโครคอนโทรลเลอร์ WiFi พร้อม Bluetooth
Soil Moisture Sensor (Capacitive)
เซ็นเซอร์วัดความชื้นในดิน แนะนำให้ใช้แบบ Capacitive เพื่อความทนทาน
Relay Module (5V)
รีเลย์สำหรับควบคุมปั๊มน้ำ
Water Pump (5V-12V)
ปั๊มน้ำขนาดเล็ก แนะนำให้ใช้ Peristaltic Pump หรือ Mini Water Pump
Jumper Wires & Breadboard
สายไฟและบอร์ดทดลองสำหรับต่อวงจร
💡 งบประมาณโดยประมาณ: ฿350-฿500 ขึ้นอยู่กับคุณภาพของอุปกรณ์
⚡ การต่อสายวงจร
// Soil Moisture Sensor Wiring
VCC → 3.3V (หรือ 5V แล้วแต่รุ่นเซ็นเซอร์)
GND → GND
AOUT → GPIO 34 (ADC1_CH6)
// Relay Module Wiring
VCC → 5V
GND → GND
IN → GPIO 26
// Water Pump (through Relay)
Pump+ → COM (Common)
Pump- → NC (Normally Closed)
Power Supply → NO (Normally Open)
⚠️ คำเตือน: อย่าเสียบปั๊มน้ำโดยตรงกับ ESP32 เพราะใช้กระแสไฟมากเกินไป ต้องใช้รีเลย์เป็นตัวกั้นกระแสเสมอ
💻 การติดตั้งซอฟต์แวร์
1. ติดตั้ง Arduino IDE
ดาวน์โหลดและติดตั้ง Arduino IDE จาก arduino.cc
2. ติดตั้ง ESP32 Board Package
เปิด Arduino IDE และไปที่ File → Preferences → Additional Boards Manager URLs
เพิ่ม URL: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
จากนั้นไปที่ Tools → Board → Boards Manager → ค้นหา "ESP32" → ติดตั้ง
3. ติดตั้ง Library ที่จำเป็น
ไปที่ Sketch → Include Library → Manage Libraries และติดตั้ง:
- WiFi (ติดตั้งมากับ ESP32 Board)
- HTTPClient (ติดตั้งมากับ ESP32 Board)
- ArduinoJson สำหรับจัดการข้อมูล JSON
📝 โค้ดตัวอย่าง
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// ================================
// ตั้งค่า WiFi
// ================================
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// ================================
// ตั้งค่า CynoIoT
// ================================
const char* cynoiot_server = "api.cynoiot.com";
const String device_token = "YOUR_DEVICE_TOKEN"; // รับจาก CynoIoT Dashboard
// ================================
// Pin Configuration
// ================================
const int SOIL_MOISTURE_PIN = 34; // GPIO 34 สำหรับ Soil Moisture Sensor
const int RELAY_PIN = 26; // GPIO 26 สำหรับ Relay
// ================================
// ตั้งค่า Threshold
// ================================
const int DRY_SOIL_THRESHOLD = 2500; // ค่าที่ถือว่าดินแห้ง (ปรับได้)
const int WET_SOIL_THRESHOLD = 1500; // ค่าที่ถือว่าดินชุ่ม (ปรับได้)
// ตัวแปรสำหรับเก็บค่าเซ็นเซอร์
int soilMoistureValue = 0;
String soilStatus = "";
bool pumpActive = false;
// Timer สำหรับส่งข้อมูลทุก 5 นาที
unsigned long lastSendTime = 0;
const long sendInterval = 300000; // 5 นาที
void setup() {
Serial.begin(115200);
delay(1000);
// ตั้งค่า Pin Mode
pinMode(SOIL_MOISTURE_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
// ปิดปั๊มน้ำเริ่มต้น
digitalWrite(RELAY_PIN, LOW);
// เชื่อมต่อ WiFi
connectToWiFi();
}
void loop() {
// อ่านค่าความชื้นในดิน
soilMoistureValue = analogRead(SOIL_MOISTURE_PIN);
// แปลงค่าเป็นเปอร์เซ็นต์ (0-100%)
int moisturePercent = map(soilMoistureValue, 0, 4095, 100, 0);
// ตรวจสอบสถานะดิน
if (soilMoistureValue > DRY_SOIL_THRESHOLD) {
soilStatus = "dry";
// เปิดปั๊มน้ำ
if (!pumpActive) {
digitalWrite(RELAY_PIN, HIGH);
pumpActive = true;
Serial.println("💧 เปิดปั๊มน้ำ - ดินแห้ง");
// รดน้ำ 5 วินาที
delay(5000);
digitalWrite(RELAY_PIN, LOW);
pumpActive = false;
Serial.println("✅ ปิดปั๊มน้ำ");
}
} else if (soilMoistureValue < WET_SOIL_THRESHOLD) {
soilStatus = "wet";
} else {
soilStatus = "moderate";
}
// แสดงค่าบน Serial Monitor
Serial.print("ความชื้นในดิน: ");
Serial.print(moisturePercent);
Serial.print("% | ค่าดิบ: ");
Serial.print(soilMoistureValue);
Serial.print(" | สถานะ: ");
Serial.println(soilStatus);
// ส่งข้อมูลไป CynoIoT ทุก 5 นาที
if (millis() - lastSendTime >= sendInterval) {
sendToCynoIoT(moisturePercent, soilStatus);
lastSendTime = millis();
}
// รอ 1 วินาทีก่อนวนลูปใหม่
delay(1000);
}
// ================================
// เชื่อมต่อ WiFi
// ================================
void connectToWiFi() {
Serial.print("กำลังเชื่อมต่อ WiFi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✅ เชื่อมต่อ WiFi สำเร็จ!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
// ================================
// ส่งข้อมูลไป CynoIoT
// ================================
void sendToCynoIoT(int moisture, String status) {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("❌ WiFi ไม่ได้เชื่อมต่อ - ข้ามการส่งข้อมูล");
return;
}
HTTPClient http;
String url = "https://" + String(cynoiot_server) + "/api/v1/sensor/data";
// สร้าง JSON payload
DynamicJsonDocument doc(256);
doc["token"] = device_token;
doc["moisture"] = moisture;
doc["status"] = status;
doc["pump_active"] = pumpActive;
doc["timestamp"] = millis();
String payload;
serializeJson(doc, payload);
// ส่ง HTTP POST
http.begin(url);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.print("✅ ส่งข้อมูลไป CynoIoT สำเร็จ - HTTP Code: ");
Serial.println(httpResponseCode);
} else {
Serial.print("❌ ส่งข้อมูลไม่สำเร็จ - HTTP Code: ");
Serial.println(httpResponseCode);
}
http.end();
}
💡 เคล็ดลับ: ค่า Analog Read ของ ESP32 อยู่ระหว่าง 0-4095 (12-bit) ค่าที่สูงกว่าหมายถึงดินแห้ง ค่าที่ต่ำกว่าหมายถึงดินชุ่ม
🌐 การเชื่อมต่อกับ CynoIoT Platform
1. สร้าง Device บน CynoIoT
- ล็อกอินเข้าสู่ CynoIoT Dashboard
- ไปที่ Devices → Add New Device
- เลือก Device Type: "Sensor"
- ตั้งชื่อ Device: "Smart Plant Watering"
- กด Save และคัดลอก Device Token
2. ตั้งค่า Dashboard
คุณสามารถสร้าง Dashboard สำหรับติดตามความชื้นในดินแบบ Real-time:
- Gauge Chart แสดงเปอร์เซ็นต์ความชื้น
- Line Graph แสดงประวัติความชื้นย้อนหลัง
- Status Indicator แสดงสถานะปั๊มน้ำ
- Alert Notifications เมื่อดินแห้งเกินไป
3. ตั้งค่า Notifications
รับการแจ้งเตือนผ่าน Line, Telegram หรือ Email เมื่อ:
- ความชื้นต่ำกว่า 30%
- ปั๊มน้ำทำงานเกิน 10 นาที
- ไม่ได้รับข้อมูลเกิน 1 ชั่วโมง
🚀 ฟีเจอร์ขั้นสูง
⏰ Scheduler
ตั้งเวลารดน้ำตามกำหนด เช่น รดน้ำเช้าเวลา 7:00 และเย็นเวลา 18:00
🌦️ Weather Integration
เชื่อมต่อกับ Weather API เพื่อข้ามการรดน้ำหากฝนตกหรือคาดว่าฝนจะตก
🔋 Battery Optimization
ใช้ Deep Sleep Mode เพื่อประหยัดแบตเตอรี่ ตื่นขึ้นเพื่อวัดค่าทุก 15-30 นาที
📱 Manual Control
สร้าง Web Interface หรือ Mobile App สำหรับเปิด/ปิดปั๊มน้ำแบบ Manual ผ่าน WiFi
🔧 การแก้ปัญหาที่พบบ่อย
❌ เซ็นเซอร์อ่านค่าไม่ถูกต้อง
ตรวจสอบการต่อสาย และลองปรับค่า Threshold ให้เหมาะกับชนิดของดิน
❌ ปั๊มน้ำไม่ทำงาน
ตรวจสอบว่ารีเลย์ได้รับไฟเพียงพอ (5V) และปั๊มน้ำได้รับไฟที่ต้องการ (5-12V)
❌ ส่งข้อมูลไป CynoIoT ไม่ได้
ตรวจสอบการเชื่อมต่อ WiFi และตรวจสอบ Device Token ว่าถูกต้องหรือไม่
❌ ESP32 Restart บ่อย
อาจเกิดจากการไหลของกระแสไฟไม่เพียงพอ ใช้ไฟเลี้ยงภายนอกที่เสถียรกว่า
🎉 สรุป
ในบทความนี้คุณได้เรียนรู้วิธีสร้างระบบรดน้ำพืชอัจฉริยะด้วย ESP32 และ CynoIoT ตั้งแต่การเลือกฮาร์ดแวร์ การต่อวงจร การเขียนโค้ด ไปจนถึงการเชื่อมต่อ Cloud Platform
สิ่งที่คุณสามารถทำต่อได้:
- ✅ เพิ่มเซ็นเซอร์วัดอุณหภูมิและความชื้นอากาศ
- ✅ สร้างระบบรดน้ำหลายจุดด้วย ESP32 หลายตัว
- ✅ เพิ่ม LCD Screen แสดงผลความชื้นแบบ Real-time
- ✅ ปรับปรุงด้วย Solar Panel สำหรับใช้งาน outdoor