สร้างระบบตรวจสอบสิ่งแวดล้อมด้วย ESP32 และเซ็นเซอร์หลายตัว: คู่มือฉบับสมบูรณ์ 2026

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

📅 4 เมษายน 2026⏱️ 15 นาที🎯 ระดับเริ่มต้น - ปานกลาง

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

ในยุคที่เทคโนโลยี IoT ก้าวหน้าไปไกล การมีระบบตรวจสอบสิ่งแวดล้อมที่แม่นยำและเชื่อถือได้ เป็นสิ่งสำคัญทั้งสำหรับบ้าน สำนักงาน โรงงาน และฟาร์มปศุสัตว์ บทความนี้จะพาคุณไปสร้างระบบตรวจสอบสิ่งแวดล้อมแบบครบวงจรด้วย ESP32 ที่สามารถวัด:

  • 🌡️ อุณหภูมิ (Temperature)
  • 💧 ความชื้นสัมพัทธ์ (Humidity)
  • 🔴 ความดันบรรยากาศ (Barometric Pressure)
  • 🌫️ คุณภาพอากาศ - ฝุ่น PM2.5 (Air Quality)
  • 💡 ความสว่าง (Light Intensity)

💡 ทำไมต้อง ESP32?
ESP32 มี WiFi และ Bluetooth ในตัว มี GPIO เพียงพอสำหรับเชื่อมต่อเซ็นเซอร์หลายตัว รองรับ Deep Sleep Mode สำหรับประหยัดพลังงาน และมี ADC ความละเอียดสูงสำหรับอ่านค่าแอนะล็อก

อุปกรณ์ที่ต้องใช้

Hardware Components

อุปกรณ์ รุ่น/ขนาด ประมาณราคา
ESP32 BoardESP32 DevKit / NodeMCU฿150-200
DHT22 SensorTemperature & Humidity฿80-120
BMP280 SensorBarometric Pressure฿60-90
MQ135 SensorAir Quality (Gas)฿90-130
PhotoresistorLight Intensity (LDR)฿5-10
Resistors10kΩ (x3), 4.7kΩ (x1)฿10-15
Breadboard & Jumper Wires-฿50-80

Software & Tools

  • Arduino IDE หรือ PlatformIO (VSCode)
  • Library: Adafruit BMP280, DHT sensor library
  • CynoIoT Account (ฟรี) - สมัครที่นี่
  • USB Cable สำหรับอัปโหลดโปรแกรม

การต่อสายไฟ

⚠️ คำเตือนความปลอดภัย:
ก่อนเริ่มต่อสาย ให้แน่ใจว่า ESP32 ไม่ได้เชื่อมต่อกับแหล่งจ่ายไฟ เซ็นเซอร์บางตัวใช้แรงดัน 5V แต่ ESP32 ใช้ 3.3V เท่านั้น

ขาต่อสายของแต่ละเซ็นเซอร์

🌡️ DHT22 (Temperature & Humidity)

DHT22 Pin ESP32 GPIO
VCC (+)3.3V
DATAGPIO 4 (พร้อมตัวต้านทาน 10kΩ ไป VCC)
GND (-)GND

🔴 BMP280 (Barometric Pressure)

BMP280 Pin ESP32 GPIO
VCC3.3V
GNDGND
SCL (I2C Clock)GPIO 22
SDA (I2C Data)GPIO 21

🌫️ MQ135 (Air Quality)

MQ135 Pin ESP32 GPIO
VCC5V (จาก VIN ของ ESP32)
GNDGND
AO (Analog Out)GPIO 34 (ADC1_CH6)

💡 Photoresistor / LDR (Light Intensity)

Component ESP32 GPIO
LDR (ขา 1)3.3V
LDR (ขา 2) ต่อร่วมกับตัวต้านทาน 10kΩGPIO 35 (ADC1_CH7) และ GND

* ใช้ Voltage Divider: LDR ต่ออนุกรมกับตัวต้านทาน 10kΩ

การเขียนโปรแกรม

ก่อนเริ่มเขียนโค้ด ให้ติดตั้ง Library ที่จำเป็นใน Arduino IDE:

Library ที่ต้องติดตั้ง:

  • "DHT sensor library" by Adafruit
  • "Adafruit BMP280 Library"
  • "Adafruit Unified Sensor"

โค้ดหลัก - ESP32 Multi-Sensor Monitor

#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>
#include <Adafruit_BMP280.h>
#include <Wire.h>

// ================================
// ตั้งค่า WiFi
// ================================
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";

// ================================
// ตั้งค่า CynoIoT Platform
// ================================
const char* cynoiot_server = "api.cynoiot.com";
const String device_id = "YOUR_DEVICE_ID";
const String api_key = "YOUR_API_KEY";

// ================================
// ตั้งค่าเซ็นเซอร์
// ================================
// DHT22 - อุณหภูมิและความชื้น
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// BMP280 - ความดันบรรยากาศ
Adafruit_BMP280 bmp;

// MQ135 - คุณภาพอากาศ
#define MQ135_PIN 34

// Photoresistor - ความสว่าง
#define LDR_PIN 35

// ================================
// ตั้งค่าการทำงาน
// ================================
unsigned long lastSendTime = 0;
const long sendInterval = 10000;  // ส่งข้อมูลทุก 10 วินาที

void setup() {
  Serial.begin(115200);
  delay(1000);

  // เริ่มต้นเซ็นเซอร์
  Serial.println("กำลังเริ่มต้นเซ็นเซอร์...");

  dht.begin();

  if (!bmp.begin(0x76)) {  // I2C address สำหรับ BMP280
    Serial.println("ไม่พบ BMP280! ตรวจสอบการต่อสาย");
    while (1);
  }

  // ตั้งค่าขา ADC
  pinMode(MQ135_PIN, INPUT);
  pinMode(LDR_PIN, INPUT);

  // เชื่อมต่อ WiFi
  WiFi.begin(ssid, password);
  Serial.print("กำลังเชื่อมต่อ WiFi");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.println("✅ เชื่อมต่อ WiFi สำเร็จ!");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  unsigned long currentTime = millis();

  // ส่งข้อมูลทุก 10 วินาที
  if (currentTime - lastSendTime >= sendInterval) {
    lastSendTime = currentTime;

    // อ่านค่าจากเซ็นเซอร์ทั้งหมด
    SensorData data = readAllSensors();

    // แสดงผลใน Serial Monitor
    displaySensorData(data);

    // ส่งข้อมูลไปยัง CynoIoT Platform
    sendToCynoIoT(data);
  }

  delay(100);
}

// ================================
// ฟังก์ชันอ่านค่าเซ็นเซอร์
// ================================
struct SensorData {
  float temperature;
  float humidity;
  float pressure;
  int airQuality;
  int lightLevel;
  unsigned long timestamp;
};

SensorData readAllSensors() {
  SensorData data;

  // อ่าน DHT22
  data.temperature = dht.readTemperature();
  data.humidity = dht.readHumidity();

  // ตรวจสอบว่าอ่านค่าสำเร็จหรือไม่
  if (isnan(data.temperature) || isnan(data.humidity)) {
    Serial.println("❌ อ่าน DHT22 ไม่สำเร็จ!");
    data.temperature = 0;
    data.humidity = 0;
  }

  // อ่าน BMP280
  data.pressure = bmp.readPressure() / 100.0F;  // แปลงเป็น hPa

  // อ่าน MQ135 (ค่า 0-4095 ยิ่งมากยิ่งมีก๊าซมาก)
  data.airQuality = analogRead(MQ135_PIN);

  // อ่าน Photoresistor (ค่า 0-4095 ยิ่งมากยิ่งสว่าง)
  data.lightLevel = analogRead(LDR_PIN);

  data.timestamp = millis();

  return data;
}

// ================================
// ฟังก์ชันแสดงผลข้อมูล
// ================================
void displaySensorData(SensorData data) {
  Serial.println("═════════════════════════════════");
  Serial.println("📊 ข้อมูลสิ่งแวดล้อม");
  Serial.println("═════════════════════════════════");
  Serial.print("🌡️ อุณหภูมิ: ");
  Serial.print(data.temperature);
  Serial.println(" °C");

  Serial.print("💧 ความชื้น: ");
  Serial.print(data.humidity);
  Serial.println(" %");

  Serial.print("🔴 ความดัน: ");
  Serial.print(data.pressure);
  Serial.println(" hPa");

  Serial.print("🌫️ คุณภาพอากาศ: ");
  Serial.println(data.airQuality);

  Serial.print("💡 ความสว่าง: ");
  Serial.println(data.lightLevel);
  Serial.println("═════════════════════════════════");
}

// ================================
// ฟังก์ชันส่งข้อมูลไป CynoIoT
// ================================
void sendToCynoIoT(SensorData data) {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("❌ WiFi ไม่ได้เชื่อมต่อ!");
    return;
  }

  HTTPClient http;
  String url = "https://" + String(cynoiot_server) + "/api/v1/sensor-data";

  http.begin(url);
  http.addHeader("Content-Type", "application/json");
  http.addHeader("X-API-Key", api_key);

  // สร้าง JSON payload
  String payload = "{";
  payload += "\"device_id\":\"" + device_id + "\",";
  payload += "\"temperature\":" + String(data.temperature) + ",";
  payload += "\"humidity\":" + String(data.humidity) + ",";
  payload += "\"pressure\":" + String(data.pressure) + ",";
  payload += "\"air_quality\":" + String(data.airQuality) + ",";
  payload += "\"light_level\":" + String(data.lightLevel) + ",";
  payload += "\"timestamp\":" + String(data.timestamp);
  payload += "}";

  Serial.println("กำลังส่งข้อมูลไป CynoIoT...");

  int httpResponseCode = http.POST(payload);

  if (httpResponseCode > 0) {
    String response = http.getString();
    Serial.println("✅ ส่งข้อมูลสำเร็จ!");
    Serial.println("Response: " + response);
  } else {
    Serial.print("❌ ส่งข้อมูลไม่สำเร็จ! Error code: ");
    Serial.println(httpResponseCode);
  }

  http.end();
}

💡 Tips:
- อย่าลืมแก้ไข WiFi SSID/Password
- สมัคร CynoIoT Account และรับ Device ID และ API Key
- ปรับค่า sendInterval ตามความต้องการ (หน่วยเป็น ms)
- ใช้ Deep Sleep Mode หากต้องการประหยัดพลังงาน

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

CynoIoT Platform เป็นแพลตฟอร์ม IoT ที่พัฒนาโดยทีมงานคนไทย รองรับการเชื่อมต่ออุปกรณ์ IoT หลากหลายชนิด พร้อม Dashboard สำหรับตรวจสอบข้อมูลแบบ Real-time

ขั้นตอนการเชื่อมต่อ

1

สมัครสมาชิก

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

2

สร้างอุปกรณ์ใหม่

ใน Dashboard ให้สร้าง Device ใหม่ และเลือกประเภทเป็น "Multi-Sensor Environment Monitor"

3

รับ Device ID และ API Key

คัดลอก Device ID และ API Key มาใส่ในโค้ดของคุณ

4

อัปโหลดโค้ด

อัปโหลดโค้ดไปยัง ESP32 และดูข้อมูลใน Dashboard

🎁 ฟีเจอร์พิเศษบน CynoIoT:
- 📊 Dashboard แบบ Real-time
- 🔔 แจ้งเตือนเมื่อค่าเกินกำหนด (Alert)
- 📈 กราฟย้อนหลัง 30 วัน
- 📱 แอปมือถือสำหรับ Android และ iOS
- 🌐 Export ข้อมูลเป็น CSV

การทดสอบ

หลังจากอัปโหลดโค้ดแล้ว ให้เปิด Serial Monitor (Baud rate 115200) เพื่อดูผลการทำงาน:

กำลังเริ่มต้นเซ็นเซอร์...
กำลังเชื่อมต่อ WiFi...
✅ เชื่อมต่อ WiFi สำเร็จ!
IP Address: 192.168.1.100

═════════════════════════════════
📊 ข้อมูลสิ่งแวดล้อม
═════════════════════════════════
🌡️ อุณหภูมิ: 28.50 °C
💧 ความชื้น: 65.20 %
🔴 ความดัน: 1013.25 hPa
🌫️ คุณภาพอากาศ: 850
💡 ความสว่าง: 2048
═════════════════════════════════
กำลังส่งข้อมูลไป CynoIoT...
✅ ส่งข้อมูลสำเร็จ!

การทดสอบแต่ละเซ็นเซอร์

  • อุณหภูมิ: ลมหายใจตรงเซ็นเซอร์ DHT22 ค่าควรเพิ่มขึ้น
  • ความชื้น: ใช้ผ้าชุบน้ำปิดเซ็นเซอร์ DHT22 ค่าควรเพิ่มขึ้น
  • ความดัน: อัปเซ็นเซอร์ BMP280 ไปที่สูงขึ้น ค่าควรลดลง
  • คุณภาพอากาศ: ใช้ไฟจรดังไหล้ หรือแอลกอฮอล์ ค่าควรเพิ่มขึ้น
  • ความสว่าง: ใช้ไฟฉายส่อง หรือปิดด้วยมือ ค่าควรเปลี่ยนไปตามแสง

การแก้ปัญหา

ปัญหาที่พบบ่อย

❌ อ่าน DHT22 ไม่ได้

สาเหตุ: ต่อสายผิด, ตัวต้านทาน pull-up ไม่เพียงพอ, หรือเซ็นเซอร์เสีย
วิธีแก้: ตรวจสอบการต่อสาย VCC/GND/DATA, เพิ่มตัวต้านทาน 10kΩ ระหว่าง DATA กับ VCC, ลองใช้เซ็นเซอร์ตัวใหม่

❌ ไม่พบ BMP280

สาเหตุ: ต่อสาย I2C ผิด, Address ไม่ถูกต้อง, หรือเซ็นเซอร์เสีย
วิธีแก้: ตรวจ SCL (GPIO 22), SDA (GPIO 21), ลองเปลี่ยน address เป็น 0x77 หรือใช้ I2C Scanner

❌ ค่า MQ135 อ่านไม่ได้

สาเหตุ: เซ็นเซอร์ต้องการเวลา Warm-up, ต่อขาผิด
วิธีแก้: รอ 24-48 ชั่วโมงหลังจากเปิดใช้ครั้งแรก (Burn-in), ตรวจสอบขา AO ต่อกับ ADC pin

❌ WiFi เชื่อมต่อไม่ได้

สาเหตุ: รหัสผ่านผิด, ระยะห่างไกลเกินไป, หรือ router ไม่รองรับ 2.4GHz
วิธีแก้: ตรวจ SSID/Password, ย้าย ESP32 ไปใกล้ router, ตรวจสอบว่า router รองรับ 2.4GHz (ไม่ใช่ 5GHz เท่านั้น)

❌ ส่งข้อมูลไป CynoIoT ไม่ได้

สาเหตุ: API Key ผิด, ไม่มีอินเทอร์เน็ต, หรือ Server ล่ม
วิธีแก้: ตรวจ Device ID และ API Key, ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต, ลองใช้ Postman ทดสอบ API

ขั้นตอนถัดไป

ยินดีด้วย! คุณได้สร้างระบบตรวจสอบสิ่งแวดล้อมสำเร็จแล้ว ต่อไปนี้คือขั้นตอนที่คุณสามารถพัฒนาต่อได้:

🔋 Deep Sleep Mode

ปรับโค้ดให้ ESP32 เข้า Deep Sleep Mode เพื่อประหยัดพลังงาน ใช้แบตเตอรี่ได้นานหลายเดือน

📱 Mobile App

ดาวน์โหลด CynoIoT App เพื่อตรวจสอบข้อมูลจากมือถือ รับแจ้งเตือนทันทีเมื่อค่าผิดปกติ

📊 Data Analysis

ใช้ข้อมูลที่เก็บไว้วิเคราะห์และสร้างกราฟ เพื่อติดตามการเปลี่ยนแปลงของสิ่งแวดล้อม

🔔 Alert System

ตั้งค่าการแจ้งเตือนเมื่ออุณหภูมิสูง/ต่ำเกินไป หรือคุณภาพอากาศแย่ลง

🌐 หลายจุดตรวจสอบ

สร้างระบบหลายจุด เพื่อตรวจสอบในที่ต่างๆ เชื่อมต่อทั้งหมดเข้ากับ CynoIoT Dashboard

🎨 Custom Enclosure

ออกแบบกล่องใส่เซ็นเซอร์ด้วย 3D Printing หรือซื้อกล่องพร้อมใช้

© 2026 CynoIoT Platform. สงวนลิขสิทธิ์.

สร้างด้วย ❤️ สำหรับชุมชน IoT ไทย