📑 เนื้อหาในบทความ
🎯 บทนำ
ในยุค IoT ที่เชื่อมต่อทุกอย่างเข้าด้วยกัน การมีระบบตรวจสอบสภาพแวดล้อมที่บ้านแบบ Real-time เป็นสิ่งสำคัญ บทความนี้จะพาคุณไปสร้างระบบตรวจสอบที่บ้านด้วย ESP32 เชื่อมต่อกับ Node-RED Dashboard เพื่อตรวจสอบ:
- 🌡️ อุณหภูมิ (Temperature)
- 💧 ความชื้น (Humidity)
- 🌫️ คุณภาพอากาศ (Air Quality)
- ☀️ ความเข้มแสง (Light Intensity)
Node-RED เป็นเครื่องมือที่ช่วยให้คุณสร้าง Dashboard สำหรับ IoT ได้อย่างง่ายดาย โดยไม่ต้องเขียนโค้ด HTML/CSS/JavaScript เยอะ เหมาะสำหรับทั้งมือใหม่และผู้เชี่ยวชาญ
📋 ข้อกำหนดเบื้องต้น
อุปกรณ์ที่ต้องใช้
| อุปกรณ์ | จำนวน | ราคาโดยประมาณ |
|---|---|---|
| ESP32 Development Board | 1 | ฿150-200 |
| DHT22 Sensor (อุณหภูมิ/ความชื้น) | 1 | ฿80-120 |
| MQ-135 Sensor (คุณภาพอากาศ) | 1 | ฿120-150 |
| Photoresistor (LDR) | 1 | ฿10-15 |
| Resistor 10kΩ | 2 | ฿5 |
| Breadboard และ Jumper Wires | 1 | ฿80-100 |
| รวมทั้งหมด | ~฿500-700 | |
ซอฟต์แวร์ที่ต้องใช้
- Arduino IDE - สำหรับอัปโหลดโค้ดไปยัง ESP32
- Node-RED - สำหรับสร้าง Dashboard (ติดตั้งบน Raspberry Pi หรือ PC)
- MQTT Broker - ใช้ Mosquitto หรือ built-in broker ของ Node-RED
- USB Cable - สำหรับเชื่อมต่อ ESP32 กับคอมพิวเตอร์
💡 เคล็ดลับ: หากคุณมี Raspberry Pi อยู่แล้ว แนะนำให้ติดตั้ง Node-RED บน Raspberry Pi เพื่อให้ระบบทำงานตลอด 24/7 โดยไม่ต้องเปิดคอมพิวเตอร์ไว้ตลอดเวลา
🔌 การเตรียมอุปกรณ์และต่อสาย
การเชื่อมต่อ DHT22 Sensor
DHT22 เป็นเซ็นเซอร์วัดอุณหภูมิและความชื้นที่แม่นยำและราคาย่อมเยา การเชื่อมต่อ:
| ขา DHT22 | เชื่อมต่อกับ |
|---|---|
| VCC | 3.3V ของ ESP32 |
| DATA | GPIO 4 ของ ESP32 |
| GND | GND ของ ESP32 |
⚠️ หมายเหตุ: ต้องต่อ Resistor 10kΩ ระหว่าง VCC และ DATA pin (Pull-up resistor) เพื่อให้ DHT22 ทำงานได้อย่างถูกต้อง
การเชื่อมต่อ MQ-135 Sensor
MQ-135 ใช้วัดคุณภาพอากาศ (CO2, Ammonia, และก๊าซอื่นๆ) การเชื่อมต่อ:
| ขา MQ-135 | เชื่อมต่อกับ |
|---|---|
| VCC | 5V ของ ESP32 |
| AO (Analog Out) | GPIO 34 ของ ESP32 |
| GND | GND ของ ESP32 |
🔥 ข้อควรระวัง: MQ-135 ต้องการ Pre-heating 24-48 ชั่วโมงก่อนใช้งานครั้งแรกเพื่อให้ค่าแม่นยำ และต้องใช้ 5V ไม่ใช่ 3.3V
การเชื่อมต่อ Photoresistor (LDR)
LDR ใช้วัดความเข้มแสง ต่อแบบ Voltage Divider Circuit:
| ขา | เชื่อมต่อกับ |
|---|---|
| ขาที่ 1 ของ LDR | 3.3V ของ ESP32 |
| ขาที่ 2 ของ LDR → Resistor 10kΩ → GND | จุดต่อระหว่าง LDR และ Resistor → GPIO 35 |
💻 โค้ด ESP32 สำหรับส่งข้อมูล MQTT
โค้ดนี้จะอ่านค่าจากเซ็นเซอร์ทั้ง 3 ตัว และส่งข้อมูลไปยัง MQTT Broker ที่ Node-RED จะรับข้อมูลและแสดงบน Dashboard:
/**
* ESP32 Multi-Sector IoT Monitoring with MQTT
* อ่านค่าจาก DHT22, MQ-135 และ LDR แล้วส่งไปยัง MQTT Broker
*
* สร้างเมื่อ: 3 เมษายน 2026
* สำหรับ: CynoIoT Platform + Node-RED Dashboard
*/
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// ===== WiFi Settings =====
const char* ssid = "YOUR_WIFI_SSID"; // ใส่ชื่อ WiFi ของคุณ
const char* password = "YOUR_WIFI_PASSWORD"; // ใส่รหัส WiFi ของคุณ
// ===== MQTT Settings =====
const char* mqtt_server = "192.168.1.100"; // IP Address ของ MQTT Broker (Node-RED)
const int mqtt_port = 1883; // MQTT Port (default: 1883)
// ===== Sensor Pins =====
#define DHTPIN 4 // GPIO 4 สำหรับ DHT22
#define DHTTYPE DHT22 // ประเภทเซ็นเซอร์
#define MQ135_PIN 34 // GPIO 34 สำหรับ MQ-135 (Analog)
#define LDR_PIN 35 // GPIO 35 สำหรับ LDR (Analog)
// ===== MQTT Topics =====
#define TEMP_TOPIC "sensors/temperature"
#define HUMIDITY_TOPIC "sensors/humidity"
#define AIR_TOPIC "sensors/air_quality"
#define LIGHT_TOPIC "sensors/light_intensity"
// ===== Objects =====
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
// ===== Variables =====
unsigned long lastMsg = 0;
const long interval = 5000; // ส่งข้อมูลทุก 5 วินาที
// ===== WiFi Connection Function =====
void setup_wifi() {
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());
}
// ===== MQTT Callback Function =====
void callback(char* topic, byte* message, unsigned int length) {
// ฟังก์ชันนี้ใช้รับข้อความจาก MQTT (ถ้าต้องการควบคุมจาก Dashboard)
Serial.print("📨 ได้รับข้อความจาก topic: ");
Serial.print(topic);
Serial.print(". ข้อความ: ");
String messageTemp;
for (int i = 0; i < length; i++) {
messageTemp += (char)message[i];
}
Serial.println(messageTemp);
}
// ===== Reconnect to MQTT =====
void reconnect() {
while (!client.connected()) {
Serial.print("🔄 พยายามเชื่อมต่อ MQTT...");
// พยายามเชื่อมต่อด้วย Client ID แบบสุ่ม
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("✅ เชื่อมต่อ MQTT สำเร็จ!");
} else {
Serial.print("❌ ล้มเหลว, rc=");
Serial.print(client.state());
Serial.println(" ลองใหม่ใน 5 วินาที");
delay(5000);
}
}
}
// ===== Read DHT22 Sensor =====
float readTemperature() {
float t = dht.readTemperature();
if (isnan(t)) {
Serial.println("⚠️ อ่านค่าอุณหภูมิจาก DHT22 ไม่สำเร็จ!");
return 0.0;
}
return t;
}
float readHumidity() {
float h = dht.readHumidity();
if (isnan(h)) {
Serial.println("⚠️ อ่านค่าความชื้นจาก DHT22 ไม่สำเร็จ!");
return 0.0;
}
return h;
}
// ===== Read MQ-135 Sensor =====
int readAirQuality() {
int airValue = analogRead(MQ135_PIN);
// แปลงค่าให้เป็น 0-100 (ค่ายิ่งน้อย อากาศยิ่งดี)
int airQuality = map(airValue, 0, 4095, 100, 0);
return airQuality;
}
// ===== Read LDR Sensor =====
int readLightIntensity() {
int ldrValue = analogRead(LDR_PIN);
// แปลงค่าให้เป็น 0-100%
int lightPercent = map(ldrValue, 0, 4095, 0, 100);
return lightPercent;
}
// ===== Setup Function =====
void setup() {
Serial.begin(115200);
// เริ่มต้นเซ็นเซอร์
dht.begin();
// ตั้งค่า MQTT
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
// เชื่อมต่อ WiFi
setup_wifi();
Serial.println("🚀 เริ่มต้นระบบตรวจสอบ IoT เรียบร้อย!");
}
// ===== Main Loop =====
void loop() {
// ตรวจสอบการเชื่อมต่อ MQTT
if (!client.connected()) {
reconnect();
}
client.loop();
// ส่งข้อมูลทุก 5 วินาที
unsigned long now = millis();
if (now - lastMsg > interval) {
lastMsg = now;
// อ่านค่าจากเซ็นเซอร์
float temperature = readTemperature();
float humidity = readHumidity();
int airQuality = readAirQuality();
int lightIntensity = readLightIntensity();
// แปลงค่าเป็น String
char tempStr[8];
char humStr[8];
char airStr[8];
char lightStr[8];
dtostrf(temperature, 1, 2, tempStr);
dtostrf(humidity, 1, 2, humStr);
itoa(airQuality, airStr, 10);
itoa(lightIntensity, lightStr, 10);
// ส่งข้อมูลไปยัง MQTT Topics
client.publish(TEMP_TOPIC, tempStr);
client.publish(HUMIDITY_TOPIC, humStr);
client.publish(AIR_TOPIC, airStr);
client.publish(LIGHT_TOPIC, lightStr);
// แสดงค่าบน Serial Monitor
Serial.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
Serial.print("🌡️ อุณหภูมิ: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("💧 ความชื้น: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("🌫️ คุณภาพอากาศ: ");
Serial.print(airQuality);
Serial.println(" (0-100)");
Serial.print("☀️ ความเข้มแสง: ");
Serial.print(lightIntensity);
Serial.println(" %");
Serial.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
}
}✅ ขั้นตอนการอัปโหลด:
- เปลี่ยน WiFi credentials (SSID และ Password)
- เปลี่ยน MQTT server IP เป็น IP ของเครื่องที่รัน Node-RED
- เชื่อมต่อ ESP32 เข้ากับคอมพิวเตอร์ด้วย USB
- เลือก Board: "ESP32 Dev Module"
- เลือก Correct Port
- กด Upload
- เปิด Serial Monitor (115200 baud) เพื่อดูผลลัพธ์
📦 จำเป็นต้องติดตั้ง Library:
- PubSubClient โดย Nick O'Leary (สำหรับ MQTT)
- DHT sensor library โดย Adafruit
ติดตั้งผ่าน Arduino IDE: Sketch → Include Library → Manage Libraries → ค้นหาและติดตั้ง
🎨 ติดตั้งและตั้งค่า Node-RED
วิธีการติดตั้ง Node-RED
Node-RED สามารถติดตั้งได้บนหลายแพลตฟอร์ม แต่แนะนำให้ติดตั้งบน Raspberry Pi หรือ Linux ดังนี้:
# สำหรับ Raspberry Pi / Linux
sudo apt-get update
sudo apt-get install nodered
sudo systemctl enable nodered.service
sudo systemctl start nodered.service หลังจากติดตั้งแล้ว ให้เปิดเบราว์เซอร์ไปที่:
http://localhost:1880 หรือ http://[IP-ADDRESS]:1880 ติดตั้ง Node-RED Dashboard
Node-RED Dashboard คือ Plugin ที่ช่วยให้เราสร้าง UI สำหรับแสดงข้อมูลได้ง่าย ติดตั้งดังนี้:
# ผ่าน Terminal บน Raspberry Pi / Linux
cd ~/.node-red
npm install node-red-dashboard หรือถ้าใช้ Node-RED บน Windows/Mac ให้เปิด Terminal แล้วรัน:
npm install -g node-red-dashboard ✅ หลังจากติดตั้งเสร็จ ให้ Restart Node-RED ด้วยคำสั่ง: node-red-stop แล้ว node-red-start
🎛️ สร้าง Dashboard Flow บน Node-RED
ตอนนี้เราจะสร้าง Flow บน Node-RED เพื่อรับข้อมูลจาก ESP32 และแสดงบน Dashboard ทำตามขั้นตอนดังนี้:
Step 1: สร้าง MQTT In Nodes
ลาก Node mqtt in มา 4 อัน แล้วตั้งค่าแต่ละอันดังนี้:
- Node 1: Topic =
sensors/temperature - Node 2: Topic =
sensors/humidity - Node 3: Topic =
sensors/air_quality - Node 4: Topic =
sensors/light_intensity
ในส่วนของ Server ให้คลิกที่ปุ่มพร้อมกา์ (✏️) แล้วตั้งค่า:
- Server:
localhostหรือ127.0.0.1(ถ้า MQTT อยู่บนเครื่องเดียวกัน) - Port:
1883
Step 2: สร้าง Gauge Nodes
ลาก Node gauge มา 4 อัน แล้วเชื่อมต่อกับ MQTT In nodes:
- Gauge 1: Label = "อุณหภูมิ (°C)", Range = 0-50, Unit = "°C"
- Gauge 2: Label = "ความชื้น (%)", Range = 0-100, Unit = "%"
- Gauge 3: Label = "คุณภาพอากาศ", Range = 0-100, Color = Green → Red
- Gauge 4: Label = "แสง (%)", Range = 0-100, Unit = "%"
Step 3: สร้าง Chart Nodes
เพื่อดูประวัติข้อมูลย้อนหลัง ให้ลาก Node chart มา 2 อัน:
- Chart 1: Label = "อุณหภูมิ & ความชื้น", X-axis = "เวลา"
- Chart 2: Label = "คุณภาพอากาศ & แสง", X-axis = "เวลา"
ใช้ Node join รวมข้อมูลก่อนส่งเข้า Chart หากต้องการแสดงหลายค่าใน Chart เดียว
Step 4: จัด Layout Dashboard
คลิกที่ Dashboard Layout มุมขวาบน แล้วจัดวาง Widgets ตามใจชอบ:
- สร้าง Tab ใหม่ชื่อ "หน้าแรก"
- สร้าง Group ชื่อ "ข้อมูล Real-time"
- ลาก Gauges ทั้ง 4 มาวางใน Group
- สร้าง Group ชื่อ "ประวัติข้อมูล"
- ลาก Charts มาวางใน Group
💡 เคล็ดลับ: คุณสามารถเข้าถึง Dashboard ได้ที่ http://localhost:1880/ui หรือ http://[IP-ADDRESS]:1880/ui
✅ การทดสอบระบบ
ตรวจสอบการเชื่อมต่อ
1. ตรวจสอบ Serial Monitor บน Arduino IDE:
- ตั้งค่า Baud rate = 115200
- ดูว่า ESP32 เชื่อมต่อ WiFi ได้หรือไม่
- ดูว่า MQTT connection สำเร็จหรือไม่
- ตรวจสอบค่าเซ็นเซอร์ที่แสดงบน Serial Monitor
2. ตรวจสอบ Node-RED:
- ดูที่ MQTT In nodes ว่ามีสถานะ "connected" หรือไม่ (มีวงกลมสีเขียว)
- คลิกที่ MQTT In node → ดูที่ Debug panel ด้านขวา ว่าได้รับข้อมูลหรือไม่
- เปิด Dashboard ที่
/uiแล้วดูว่า Gauges และ Charts อัปเดตค่าหรือไม่
ทดสอบเซ็นเซอร์
| เซ็นเซอร์ | วิธีทดสอบ | ผลลัพธ์ที่คาดหวัง |
|---|---|---|
| DHT22 | ระดมลมหายใจใส่เซ็นเซอร์ | อุณหภูมิและความชื้นเพิ่มขึ้น |
| MQ-135 | นำแหล่งก๊าซ (เช่น แอลกอฮอล์) ไปใกล้ๆ | ค่าคุณภาพอากาศลดลง |
| LDR | ส่องไฟฟ้าแฟลชไปที่เซ็นเซอร์ | ค่าความเข้มแสงเพิ่มขึ้น |
🔧 การแก้ปัญหาที่พบบ่อย
ปัญหา: ESP32 เชื่อมต่อ WiFi ไม่ได้
อาการ: Serial Monitor แสดง "....." ต่อเนื่อง
วิธีแก้:
- ตรวจสอบว่า SSID และ Password ถูกต้อง
- ตรวจสอบว่า Router เปิด 2.4GHz (ESP32 ไม่รองรับ 5GHz)
- ลองเปลี่ยน WiFi channel เป็น 1, 6 หรือ 11
- เช็คว่า ESP32 อยู่ในระยะสัญญาณที่ดี
ปัญหา: เชื่อมต่อ MQTT ไม่ได้
อาการ: Serial Monitor แสดง "ล้มเหลว, rc=-2"
วิธีแก้:
- ตรวจสอบว่า IP Address ของ MQTT server ถูกต้อง
- ตรวจสอบว่า Mosquitto MQTT Broker ทำงานอยู่:
sudo systemctl status mosquitto - ตรวจสอบ Firewall ว่าบล็อก port 1883 หรือไม่
- ลอง ping จาก ESP32 ไปยัง MQTT server
ปัญหา: DHT22 อ่านค่าไม่ได้
อาการ: Serial Monitor แสดง "NaN"
วิธีแก้:
- ตรวจสอบการเชื่อมต่อสาย (ต้องมี Pull-up resistor 10kΩ)
- ตรวจสอบว่าต่อขาถูกต้อง (VCC, DATA, GND)
- ลองเปลี่ยน DHT22 ตัวใหม่ (อาจเสีย)
- ตรวจสอบว่า Pin ที่เลือกเป็น Analog Input หรือ Digital I/O
ปัญหา: MQ-135 ค่าไม่เปลี่ยน
อาการ: ค่าคงที่หรือเปลี่ยนน้อยมาก
วิธีแก้:
- MQ-135 ต้อง Pre-heating 24-48 ชั่วโมงก่อนใช้งาน
- ตรวจสอบว่าต่อ 5V ไม่ใช่ 3.3V
- ตรวจสอบว่าขา AO ต่อกับ ADC pin ที่รองรับ (GPIO 34, 35, 36, 39)
🎉 สรุปและขั้นตอนถัดไป
ยินดีด้วย! คุณได้สร้างระบบตรวจสอบ IoT ที่บ้านเรียบร้อยแล้ว โดยใช้:
- ✅ ESP32 สำหรับอ่านค่าเซ็นเซอร์และส่งข้อมูลผ่าน MQTT
- ✅ DHT22 สำหรับวัดอุณหภูมิและความชื้น
- ✅ MQ-135 สำหรับวัดคุณภาพอากาศ
- ✅ LDR สำหรับวัดความเข้มแสง
- ✅ Node-RED Dashboard สำหรับแสดงผลแบบ Real-time
สิ่งที่ได้เรียนรู้
- การเชื่อมต่อเซ็นเซอร์หลายประเภทกับ ESP32
- การใช้ MQTT Protocol สำหรับส่งข้อมูล IoT
- การสร้าง Dashboard ด้วย Node-RED แบบง่ายๆ
- การจัดการข้อมูล Real-time และประวัติข้อมูล
แนวคิดการพัฒนาต่อ
- 🔔 เพิ่ม Notification ด้วย Telegram หรือ Line Notify เมื่อค่าเกิน threshold
- 📊 บันทึกข้อมูลลง Database (InfluxDB, MySQL) สำหรับวิเคราะห์ย้อนหลัง
- 🌐 เชื่อมต่อกับ CynoIoT Platform สำหรับระบบ Cloud Dashboard
- ⚡ เพิ่มระบบ Automation (เช่น เปิดไฟเมื่อมืด, เปิดพัดลมเมื่อร้อน)
- 🔋 ใช้แผงโซลาร์เซลล์ + Battery สำหรับระบบ Off-grid
🚀 โปรเจกต์นี้เป็นฐานที่มั่นคงสำหรับการพัฒนาระบบ IoT ของคุณ คุณสามารถเพิ่มเซ็นเซอร์อื่นๆ ได้ตามต้องการ เช่: PIR Motion Sensor, Soil Moisture Sensor, Ultrasonic Sensor และอื่นๆ
📚 บทความที่เกี่ยวข้อง
ESP32 MQTT: คู่มือสอนใช้งานครบถ้วน
เรียนรู้พื้นฐาน MQTT Protocol และการใช้งานกับ ESP32
Node-RED Dashboard 2 + Home Assistant
เชื่อมต่อ Node-RED กับ Home Assistant สำหรับ Smart Home
ESP32 Data Logger: บันทึกข้อมูลลง SD Card
สร้างระบบบันทึกข้อมูลย้อนหลังด้วย SD Card
DHT11/DHT22: วิธีใช้งานเซ็นเซอร์อุณหภูมิและความชื้น
เรียนรู้การใช้งาน DHT sensors แบบละเอียด