สร้างระบบตรวจสอบอุปกรณ์ IoT ที่บ้านด้วย ESP32 และ Node-RED Dashboard

เรียนรู้วิธีสร้างระบบตรวจสอบอุปกรณ์ IoT ที่บ้านด้วย ESP32 เชื่อมต่อกับ Node-RED Dashboard สำหรับตรวจสอบอุณหภูมิ ความชื้น และคุณภาพอากาศแบบ Real-time พร้อมโค้ดตัวอย่างและคำอธิบายภาษาไทย

📅 3 เมษายน 2026⏱️ 15 นาที🎯 ระดับกลาง Node-RED IoT Dashboard

🎯 บทนำ

ในยุค IoT ที่เชื่อมต่อทุกอย่างเข้าด้วยกัน การมีระบบตรวจสอบสภาพแวดล้อมที่บ้านแบบ Real-time เป็นสิ่งสำคัญ บทความนี้จะพาคุณไปสร้างระบบตรวจสอบที่บ้านด้วย ESP32 เชื่อมต่อกับ Node-RED Dashboard เพื่อตรวจสอบ:

  • 🌡️ อุณหภูมิ (Temperature)
  • 💧 ความชื้น (Humidity)
  • 🌫️ คุณภาพอากาศ (Air Quality)
  • ☀️ ความเข้มแสง (Light Intensity)

Node-RED เป็นเครื่องมือที่ช่วยให้คุณสร้าง Dashboard สำหรับ IoT ได้อย่างง่ายดาย โดยไม่ต้องเขียนโค้ด HTML/CSS/JavaScript เยอะ เหมาะสำหรับทั้งมือใหม่และผู้เชี่ยวชาญ

📋 ข้อกำหนดเบื้องต้น

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

อุปกรณ์จำนวนราคาโดยประมาณ
ESP32 Development Board1฿150-200
DHT22 Sensor (อุณหภูมิ/ความชื้น)1฿80-120
MQ-135 Sensor (คุณภาพอากาศ)1฿120-150
Photoresistor (LDR)1฿10-15
Resistor 10kΩ2฿5
Breadboard และ Jumper Wires1฿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เชื่อมต่อกับ
VCC3.3V ของ ESP32
DATAGPIO 4 ของ ESP32
GNDGND ของ ESP32

⚠️ หมายเหตุ: ต้องต่อ Resistor 10kΩ ระหว่าง VCC และ DATA pin (Pull-up resistor) เพื่อให้ DHT22 ทำงานได้อย่างถูกต้อง

การเชื่อมต่อ MQ-135 Sensor

MQ-135 ใช้วัดคุณภาพอากาศ (CO2, Ammonia, และก๊าซอื่นๆ) การเชื่อมต่อ:

ขา MQ-135เชื่อมต่อกับ
VCC5V ของ ESP32
AO (Analog Out)GPIO 34 ของ ESP32
GNDGND ของ ESP32

🔥 ข้อควรระวัง: MQ-135 ต้องการ Pre-heating 24-48 ชั่วโมงก่อนใช้งานครั้งแรกเพื่อให้ค่าแม่นยำ และต้องใช้ 5V ไม่ใช่ 3.3V

การเชื่อมต่อ Photoresistor (LDR)

LDR ใช้วัดความเข้มแสง ต่อแบบ Voltage Divider Circuit:

ขาเชื่อมต่อกับ
ขาที่ 1 ของ LDR3.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("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
  }
}

ขั้นตอนการอัปโหลด:

  1. เปลี่ยน WiFi credentials (SSID และ Password)
  2. เปลี่ยน MQTT server IP เป็น IP ของเครื่องที่รัน Node-RED
  3. เชื่อมต่อ ESP32 เข้ากับคอมพิวเตอร์ด้วย USB
  4. เลือก Board: "ESP32 Dev Module"
  5. เลือก Correct Port
  6. กด Upload
  7. เปิด 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 และอื่นๆ

📚 บทความที่เกี่ยวข้อง