เนื้อหาในบทความ
ภาพรวมโปรเจกต์
ในยุคที่เทคโนโลยี IoT ก้าวหน้าไปไกล การมีระบบตรวจสอบสิ่งแวดล้อมที่แม่นยำและเชื่อถือได้ เป็นสิ่งสำคัญทั้งสำหรับบ้าน สำนักงาน โรงงาน และฟาร์มปศุสัตว์ บทความนี้จะพาคุณไปสร้างระบบตรวจสอบสิ่งแวดล้อมแบบครบวงจรด้วย ESP32 ที่สามารถวัด:
- 🌡️ อุณหภูมิ (Temperature)
- 💧 ความชื้นสัมพัทธ์ (Humidity)
- 🔴 ความดันบรรยากาศ (Barometric Pressure)
- 🌫️ คุณภาพอากาศ - ฝุ่น PM2.5 (Air Quality)
- 💡 ความสว่าง (Light Intensity)
💡 ทำไมต้อง ESP32?
ESP32 มี WiFi และ Bluetooth ในตัว มี GPIO เพียงพอสำหรับเชื่อมต่อเซ็นเซอร์หลายตัว รองรับ Deep Sleep Mode สำหรับประหยัดพลังงาน และมี ADC ความละเอียดสูงสำหรับอ่านค่าแอนะล็อก
อุปกรณ์ที่ต้องใช้
Hardware Components
| อุปกรณ์ | รุ่น/ขนาด | ประมาณราคา |
|---|---|---|
| ESP32 Board | ESP32 DevKit / NodeMCU | ฿150-200 |
| DHT22 Sensor | Temperature & Humidity | ฿80-120 |
| BMP280 Sensor | Barometric Pressure | ฿60-90 |
| MQ135 Sensor | Air Quality (Gas) | ฿90-130 |
| Photoresistor | Light Intensity (LDR) | ฿5-10 |
| Resistors | 10kΩ (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 |
| DATA | GPIO 4 (พร้อมตัวต้านทาน 10kΩ ไป VCC) |
| GND (-) | GND |
🔴 BMP280 (Barometric Pressure)
| BMP280 Pin | ESP32 GPIO |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SCL (I2C Clock) | GPIO 22 |
| SDA (I2C Data) | GPIO 21 |
🌫️ MQ135 (Air Quality)
| MQ135 Pin | ESP32 GPIO |
|---|---|
| VCC | 5V (จาก VIN ของ ESP32) |
| GND | GND |
| 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
ขั้นตอนการเชื่อมต่อ
สมัครสมาชิก
ไปที่ cynoiot.com และสมัครใช้งานฟรี
สร้างอุปกรณ์ใหม่
ใน Dashboard ให้สร้าง Device ใหม่ และเลือกประเภทเป็น "Multi-Sensor Environment Monitor"
รับ Device ID และ API Key
คัดลอก Device ID และ API Key มาใส่ในโค้ดของคุณ
อัปโหลดโค้ด
อัปโหลดโค้ดไปยัง 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 หรือซื้อกล่องพร้อมใช้
📚 บทความที่เกี่ยวข้อง:
- ESP32 Deep Sleep Tutorial
- IoT Home Monitoring with Node-RED
- CynoIoT Platform เริ่มต้นใช้งาน