เนื้อหาในบทความ
📋 ภาพรวมโปรเจกต์
ในช่วงฤดูร้อนที่อากาศร้อนจัด การดูแลพืชให้ได้รับน้ำและความชื้นที่เพียงพอเป็นเรื่องที่ท้าทาย โปรเจกต์นี้จะพาคุณสร้าง ระบบดูแลพืชอัจฉริยะ (Smart Plant Care System) ที่สามารถตรวจวัดความชื้นในดิน อุณหภูมิ และความชื้นอากาศ พร้อมระบบรดน้ำอัตโนมัติเมื่อดินแห้งเกินไป
🌱 คุณสมบัติเด่นของระบบ
- ✓ ตรวจวัดความชื้นในดินแบบ Real-time
- ✓ ติดตามอุณหภูมิและความชื้นอากาศ
- ✓ ระบบรดน้ำอัตโนมัติเมื่อดินแห้ง
- ✓ ส่งข้อมูลเข้า CynoIoT Platform
- ✓ แจ้งเตือนผ่าน Mobile App
2-3 ชั่วโมง
เวลาที่ใช้ทำ
~฿800
งบประมาณ
เริ่มต้น
ระดับความยาก
🔧 อุปกรณ์ที่ต้องใช้
Hardware Components
ESP32 Board
ไมโครคอนโทรลเลอร์หลัก
~฿150-200
Soil Moisture Sensor
ตัววัดความชื้นดิน
~฿40-60
DHT22 Sensor
วัดอุณหภูมิและความชื้นอากาศ
~฿60-80
Relay Module 5V
ควบคุมปั๊มน้ำ
~฿30-50
Water Pump
ปั๊มน้ำ 5-12V
~฿80-150
Jumper Wires & Breadboard
สายเชื่อมต่อและบอร์ดทดลอง
~฿50-80
Software Tools
- Arduino IDE (เวอร์ชันล่าสุด)
- USB Driver สำหรับ ESP32 (CP2102/CH340)
- CynoIoT Account (สมัครฟรี)
- DHT22 Library สำหรับ Arduino
⚡ การต่อวงจร Hardware
ก่อนเริ่มต่อวงจร ให้ตรวจสอบว่าไฟเลี้ยง ESP32 ถูกตัดออกก่อน เพื่อป้องกันความเสียหายจากการต่อวงจรผิดพลาด
| อุปกรณ์ | ขาจากอุปกรณ์ | ขา ESP32 |
|---|---|---|
| Soil Moisture Sensor | VCC | 3.3V |
| GND | GND | |
| Signal | GPIO 34 (ADC1_CH6) | |
| DHT22 Sensor | VCC | 3.3V |
| GND | GND | |
| Data | GPIO 4 | |
| Relay Module | VCC | 5V (VIN) |
| GND | GND | |
| IN | GPIO 26 |
⚠️ ข้อควรระวัง
- • Soil Moisture Sensor ควรใช้กับ 3.3V เพื่อป้องกันการกัดกร่อน
- • DHT22 ต้องต่อตัวต้านทาน 10kΩ ระหว่าง VCC และ Data (Pull-up resistor)
- • Relay ใช้ไฟ 5V ให้ต่อจากขา VIN ของ ESP32
- • Water Pump ควรมีแหล่งจ่ายไฟแยก เพื่อป้องกันเสียงรบกวน
💻 การเขียนโปรแกรม
Step 1: ติดตั้ง Library ที่จำเป็น
เปิด Arduino IDE และไปที่ Sketch → Include Library → Manage Libraries จากนั้นค้นหาและติดตั้ง library ต่อไปนี้:
- DHT sensor library โดย Adafruit
- Adafruit Unified Sensor
Step 2: อัปโหลดโค้ด
คัดลอกโค้ดด้านล่างไปยัง Arduino IDE และอัปโหลดไปยัง ESP32 อย่าลืมแก้ไข WiFi credentials และ CynoIoT credentials ก่อนอัปโหลด
/**
* Smart Plant Monitoring System with ESP32 & CynoIoT
* ระบบดูแลพืชอัจฉริยะ: วัดความชื้นดิน, อุณหภูมิ, ความชื้นอากาศ และรดน้ำอัตโนมัติ
*/
#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"
// ================= WiFi Settings =================
const char* ssid = "YOUR_WIFI_SSID"; // แก้ไข: ชื่อ WiFi
const char* password = "YOUR_WIFI_PASSWORD"; // แก้ไข: รหัส WiFi
// ================= CynoIoT Settings =================
const char* cynoiot_server = "api.cynoiot.com";
const String cynoiot_token = "YOUR_DEVICE_TOKEN"; // แก้ไข: Device Token จาก CynoIoT
// ================= Pin Definitions =================
#define SOIL_MOISTURE_PIN 34 // GPIO34 สำหรับ Soil Moisture Sensor
#define DHT_PIN 4 // GPIO4 สำหรับ DHT22
#define RELAY_PIN 26 // GPIO26 สำหรับ Relay
// ================= Sensor Settings =================
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
#define SOIL_MOISTURE_THRESHOLD 30 // ระดับความชื้นขั้นต่ำที่จะรดน้ำ (%)
DHT dht(DHT_PIN, DHTTYPE);
// ================= Variables =================
unsigned long lastSensorRead = 0;
unsigned long lastCynoIoTUpdate = 0;
const long sensorReadInterval = 2000; // อ่านค่าทุก 2 วินาที
const long cynoiotUpdateInterval = 10000; // ส่งข้อมูลทุก 10 วินาที
float soilMoisture = 0;
float temperature = 0;
float humidity = 0;
bool pumpActive = false;
void setup() {
Serial.begin(115200);
// ตั้งค่า Pin modes
pinMode(SOIL_MOISTURE_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // Relay ปกติปิด (HIGH = OFF)
// เริ่มต้น DHT sensor
dht.begin();
// เชื่อมต่อ WiFi
connectWiFi();
Serial.println("Smart Plant Monitoring System Started!");
Serial.println("=====================================");
}
void loop() {
unsigned long currentMillis = millis();
// อ่านค่าเซ็นเซอร์ทุก 2 วินาที
if (currentMillis - lastSensorRead >= sensorReadInterval) {
lastSensorRead = currentMillis;
readSensors();
checkAndWaterPlant();
}
// ส่งข้อมูลไป CynoIoT ทุก 10 วินาที
if (currentMillis - lastCynoIoTUpdate >= cynoiotUpdateInterval) {
lastCynoIoTUpdate = currentMillis;
sendToCynoIoT();
}
}
// ================= ฟังก์ชันเชื่อมต่อ WiFi =================
void connectWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✓ WiFi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
// ================= ฟังก์ชันอ่านค่าเซ็นเซอร์ =================
void readSensors() {
// อ่านค่า Soil Moisture (ค่าดิบ 0-4095)
int soilRaw = analogRead(SOIL_MOISTURE_PIN);
// แปลงค่าเป็นเปอร์เซ็นต์ (ยิ่งน้ำมากค่ายิ่งต่ำ ให้กลับค่า)
// ดินแห้ง = ~3000-3500, ดินเปียก = ~1000-1500
soilMoisture = map(soilRaw, 1500, 3500, 100, 0);
soilMoisture = constrain(soilMoisture, 0, 100);
// อ่านค่า DHT22
temperature = dht.readTemperature();
humidity = dht.readHumidity();
// ตรวจสอบค่าที่อ่านได้
if (isnan(temperature) || isnan(humidity)) {
Serial.println("⚠️ Failed to read from DHT sensor!");
return;
}
// แสดงค่าที่อ่านได้
Serial.println("\n=== Sensor Readings ===");
Serial.print("🌱 Soil Moisture: ");
Serial.print(soilMoisture);
Serial.println("%");
Serial.print("🌡️ Temperature: ");
Serial.print(temperature);
Serial.println("°C");
Serial.print("💧 Humidity: ");
Serial.print(humidity);
Serial.println("%");
Serial.print("💧 Pump Status: ");
Serial.println(pumpActive ? "ON (รดน้ำอยู่)" : "OFF");
}
// ================= ฟังก์ชันตรวจสอบและรดน้ำ =================
void checkAndWaterPlant() {
// ถ้าความชื้นในดินต่ำกว่าค่าที่ตั้งไว้ ให้เปิดปั๊ม
if (soilMoisture < SOIL_MOISTURE_THRESHOLD) {
if (!pumpActive) {
Serial.println("🚰 Soil is dry! Starting watering system...");
digitalWrite(RELAY_PIN, LOW); // Relay ON
pumpActive = true;
}
} else {
// ถ้าความชื้นเพียงพอแล้ว ให้ปิดปั๊ม
if (pumpActive) {
Serial.println("✓ Soil is moist enough! Stopping watering...");
digitalWrite(RELAY_PIN, HIGH); // Relay OFF
pumpActive = false;
}
}
}
// ================= ฟังก์ชันส่งข้อมูลไป CynoIoT =================
void sendToCynoIoT() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("⚠️ WiFi disconnected! Reconnecting...");
connectWiFi();
return;
}
// สร้าง JSON payload
String payload = "{";
payload += "\"soil_moisture\":" + String(soilMoisture) + ",";
payload += "\"temperature\":" + String(temperature) + ",";
payload += "\"humidity\":" + String(humidity) + ",";
payload += "\"pump_status\":" + String(pumpActive ? "true" : "false");
payload += "}";
// ส่ง HTTP POST request
HTTPClient http;
String url = "https://" + String(cynoiot_server) + "/api/v1/devices/data";
http.begin(url);
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", "Bearer " + cynoiot_token);
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.print("\n📡 Data sent to CynoIoT. Response code: ");
Serial.println(httpResponseCode);
} else {
Serial.print("⚠️ Error sending data: ");
Serial.println(http.errorToString(httpResponseCode).c_str());
}
http.end();
}Step 3: เขียนแก้ไขค่า Config
แก้ไขค่า config ต่อไปนี้ในโค้ด:
YOUR_WIFI_SSID- ชื่อ WiFi ของคุณYOUR_WIFI_PASSWORD- รหัส WiFiYOUR_DEVICE_TOKEN- Token จาก CynoIoT (จะสอนวิธีหาในหัวข้อถัดไป)SOIL_MOISTURE_THRESHOLD- ระดับความชื้นขั้นต่ำที่จะรดน้ำ (default: 30%)
🌐 การเชื่อมต่อ CynoIoT Platform
CynoIoT เป็นแพลตฟอร์ม IoT ที่ช่วยให้คุณตรวจสอบข้อมูลจากเซ็นเซอร์ได้ตลอด 24 ชั่วโมง พร้อมระบบแจ้งเตือนและกราฟที่สวยงาม
สมัครสมาชิก CynoIoT
ไปที่ app.cynoiot.com และสมัครใช้งานฟรี
สร้าง Device ใหม่
ไปที่ Dashboard → Devices → Create New Device เลือกชนิดเป็น "Custom Device" และตั้งชื่อเช่น "Plant Monitor"
กำหนด Sensor Fields
เพิ่ม sensor fields ต่อไปนี้ใน device:
- •
soil_moisture(Number) - •
temperature(Number) - •
humidity(Number) - •
pump_status(Boolean)
คัดลอก Device Token
ไปที่ Device Settings → API Token คัดลอก token มาใส่ในโค้ด Arduino ที่ตัวแปร cynoiot_token
ตั้งค่าการแจ้งเตือน
ไปที่ Notifications → Create Alert ตั้งเงื่อนไขเช่น: "ถ้า soil_moisture < 20% ให้แจ้งเตือน"
✅ การทดสอบระบบ
✓ ทดสอบ Soil Moisture Sensor
แช่เซ็นเซอร์ลงน้ำ ค่าควรขึ้นถึง 80-100%
✓ ทดสอบ DHT22
เป่าลมเซ็นเซอร์ ค่าความชื้นควรขึ้น
✓ ทดสอบ Relay & Pump
ถ้าดินแห้ง (< 30%) ปั๊มควรทำงาน
✓ ทดสอบ CynoIoT Connection
เปิด Dashboard ดูว่าข้อมูลมาไหม
🔧 การแก้ปัญหาที่พบบ่อย
ปัญหา: Soil Moisture Sensor แสดงค่าผิดปกติ
อาการ: ค่ากระโดดหรือแสดงค่าเท่ากันตลอด
วิธีแก้: ตรวจสอบการต่อสาย ลองอ่านค่าดิบจาก analogRead() โดยตรง Soil sensor แต่ละตัวมีค่าที่ต่างกัน อาจต้องปรับค่าในฟังก์ชัน map()
ปัญหา: DHT22 อ่านค่าไม่ได้
อาการ: แสดง "Failed to read from DHT sensor!" หรือค่า NaN
วิธีแก้: ตรวจสอบว่าต่อตัวต้านทาน 10kΩ ระหว่าง VCC และ Data หรือยัง ลองเปลี่ยนขา GPIO หรือเปลี่ยน DHT22 ตัวใหม่
ปัญหา: ปั๊มน้ำไม่ทำงาน
อาการ: Relay ติดแต่ปั๊มไม่หมุน
วิธีแก้: ตรวจสอบแหล่งจ่ายไฟของปั๊ม (ควรใช้ไฟแยก) ทดสอบปั๊มโดยต่อตรงกับแบตเตอรี่ ตรวจสอบความต่อเนื่องของสายไฟ
ปัญหา: ข้อมูลไม่ถูกส่งไป CynoIoT
อาการ: Serial Monitor แสดง "Error sending data"
วิธีแก้: ตรวจสอบ Device Token ว่าถูกต้องหรือยัง ตรวจสอบว่า ESP32 เชื่อมต่อ WiFi อยู่ ลองส่ง HTTP request ด้วย Postman เพื่อทดสอบ API
🎯 สรุปและขั้นตอนถัดไป
ยินดีด้วย! คุณได้สร้างระบบดูแลพืชอัจฉริยะเสร็จเรียบร้อยแล้ว 🎉 ระบบนี้จะช่วยดูแลพืชของคุณแม้คุณจะไม่อยู่บ้าน โดยตรวจวัดความชื้นในดินและรดน้ำอัตโนมัติเมื่อจำเป็น
💡 แนวคิดการพัฒนาต่อยอด
- ✨ เพิ่ม Light Sensor เพื่อติดตามแสงแดด
- ✨ ติดตั้งจอ LCD เพื่อแสดงค่าที่ตัวเครื่อง
- ✨ เพิ่ม pH Sensor เพื่อวัดความเป็นกรด-ด่างของดิน
- ✨ ใช้ Solar Panel + Battery เพื่อให้ระบบทำงานแบบ Off-grid
- ✨ เพิ่ม Camera Module เพื่อถ่ายรูปพืชเป็นระยะ
🌱 บทความที่เกี่ยวข้อง
หากคุณมีคำถามหรือต้องการคำแนะนำเพิ่มเติม สามารถติดต่อเราได้ที่ CynoIoT Community หรือแสดงความคิดเห็นด้านล่างนี้!