สร้างระบบดูแลพืชอัจฉริยะด้วย ESP32 และ CynoIoT 🌱

เรียนรู้วิธีสร้างระบบดูแลพืชอัจฉริยะที่ตรวจวัดความชื้นในดิน อุณหภูมิ และความชื้นอากาศ พร้อมระบบรดน้ำอัตโนมัติ ส่งข้อมูลเข้า CynoIoT Platform เพื่อติดตามได้ตลอด 24 ชั่วโมง

22 มีนาคม 2026 15 นาที ระดับเริ่มต้น

Smart Plant Monitoring System

📋 ภาพรวมโปรเจกต์

ในช่วงฤดูร้อนที่อากาศร้อนจัด การดูแลพืชให้ได้รับน้ำและความชื้นที่เพียงพอเป็นเรื่องที่ท้าทาย โปรเจกต์นี้จะพาคุณสร้าง ระบบดูแลพืชอัจฉริยะ (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 ก่อนอัปโหลด

plant_monitoring.ino
/**
 * 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 - รหัส WiFi
  • YOUR_DEVICE_TOKEN - Token จาก CynoIoT (จะสอนวิธีหาในหัวข้อถัดไป)
  • SOIL_MOISTURE_THRESHOLD - ระดับความชื้นขั้นต่ำที่จะรดน้ำ (default: 30%)

🌐 การเชื่อมต่อ CynoIoT Platform

CynoIoT เป็นแพลตฟอร์ม IoT ที่ช่วยให้คุณตรวจสอบข้อมูลจากเซ็นเซอร์ได้ตลอด 24 ชั่วโมง พร้อมระบบแจ้งเตือนและกราฟที่สวยงาม

1

สมัครสมาชิก CynoIoT

ไปที่ app.cynoiot.com และสมัครใช้งานฟรี

2

สร้าง Device ใหม่

ไปที่ Dashboard → Devices → Create New Device เลือกชนิดเป็น "Custom Device" และตั้งชื่อเช่น "Plant Monitor"

3

กำหนด Sensor Fields

เพิ่ม sensor fields ต่อไปนี้ใน device:

  • soil_moisture (Number)
  • temperature (Number)
  • humidity (Number)
  • pump_status (Boolean)
4

คัดลอก Device Token

ไปที่ Device Settings → API Token คัดลอก token มาใส่ในโค้ด Arduino ที่ตัวแปร cynoiot_token

5

ตั้งค่าการแจ้งเตือน

ไปที่ 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 หรือแสดงความคิดเห็นด้านล่างนี้!