สร้าง Multi-Sensor Node ด้วย ESP32 สำหรับ Smart Home Automation

เรียนรู้วิธีสร้างโหนดเซ็นเซอร์แบบครบวงจรที่เก็บข้อมูลอุณหภูมิ ความชื้น และการเคลื่อนไหว พร้อมส่งข้อมูลผ่าน MQTT ไปยัง Home Assistant สำหรับระบบบ้านอัจฉริยะของคุณ

6 มีนาคม 2026 15 นาที ระดับกลาง

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

ในยุค Smart Home ที่กำลังเติบโต การมีระบบเซ็นเซอร์ที่เชื่อถือได้และตอบโจทย์หลากหลายความต้องการเป็นสิ่งสำคัญ บทความนี้จะพาคุณสร้าง Multi-Sensor Node ที่สามารถเก็บข้อมูล อุณหภูมิ ความชื้น และการเคลื่อนไหว พร้อมส่งข้อมูลผ่าน MQTT ไปยัง Home Assistant อย่างมืออาชีพ

✨ จุดเด่นของโปรเจกต์นี้:

  • เก็บข้อมูลได้ 3 ประเภท: อุณหภูมิ, ความชื้น, การเคลื่อนไหว
  • ส่งข้อมูลผ่าน MQTT ที่เชื่อถือได้และรวดเร็ว
  • เชื่อมต่อกับ Home Assistant ได้ทันที
  • รองรับ Deep Sleep Mode สำหรับประหยัดแบตเตอรี่
  • งบประมาณต่ำ ประกอบง่าย
~3 ชั่วโมง
ระยะเวลาประกอบ
~฿600
งบประมาณ
กลาง
ระดับความยาก

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

1 Hardware Components

อุปกรณ์ รุ่นที่แนะนำ ราคาโดยประมาณ
ESP32 Board ESP32 DevKit V1 / NodeMCU-32S ~฿150
Temperature & Humidity Sensor DHT22 / AM2302 ~฿80
Motion Sensor (PIR) HC-SR501 ~฿35
USB Cable & Power Supply Micro USB + 5V Adapter ~฿50
Jumper Wires Male-to-Female ~฿40
Breadboard (optional) 400 points ~฿30

2 Software & Tools

  • Arduino IDE - สำหรับอัปโหลดโค้ด
  • MQTT Broker - Mosquitto / EMQX / Home Assistant MQTT
  • Home Assistant - สำหรับระบบบ้านอัจฉริยะ (optional)
  • MQTT Explorer - สำหรับ debug ข้อความ MQTT

💡 เคล็ดลับ

หากต้องการใช้แบตเตอรี่ แนะนำให้ใช้ ESP32 ที่รองรับ Deep Sleep และเพิ่ม ระบบประหยัดพลังงาน เพื่อยืดอายุการใช้งานแบตเตอรี่

การต่อวงจร

การต่อวงจรทำได้ง่าย เพราะทุกเซ็นเซอร์ใช้สัญญาณดิจิตอลและใช้แรงดัน 3.3V หรือ 5V ต่อไปนี้คือขั้นตอนการต่อวงจรโดยละเอียด:

1 ต่อ DHT22 (Temperature & Humidity Sensor)

DHT22 Pin ESP32 Pin หมายเหตุ
VCC (Pin 1) 3.3V ใช้ 3.3V เพื่อความปลอดภัย
DATA (Pin 2) GPIO 4 ต่อตัวต้านทาน 10kΩ ไปที่ VCC
NC (Pin 3) - ไม่ต่อใช้งาน
GND (Pin 4) GND กราวด์

2 ต่อ HC-SR501 (Motion Sensor)

HC-SR501 Pin ESP32 Pin หมายเหตุ
VCC 5V / VIN เซ็นเซอร์ต้องการ 5V
OUT GPIO 27 สัญญาณดิจิตอล (HIGH = motion)
GND GND กราวด์
⚙️ การตั้งค่า HC-SR501: ปรับจั้มเพื่อความไวและเวลาหน่วง:
  • Sensitivity (ปรับความไว): ปรับได้ตามต้องการ
  • Time Delay (เวลาหน่วง): แนะนำ 1-5 นาที
  • Trigger Mode: เลือกโหมด H (Repeat Trigger)

✅ ตรวจสอบการต่อวงจร

ก่อนเปิดไฟให้แน่ใจว่าต่อกราวด์ถูกต้อง และตรวจสอบขั้ว VCC และ GND หากต่อผิดอาจทำให้เซ็นเซอร์เสียหายได้

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

เราจะใช้ Arduino IDE ในการเขียนโปรแกรม ESP32 พร้อม Library ที่จำเป็นต่อการทำงาน

1. ติดตั้ง Library ที่จำเป็น

เปิด Arduino IDE → Sketch → Include Library → Manage Libraries

  • PubSubClientby Nick O'Leary - สำหรับ MQTT
  • DHTby Adafruit - สำหรับเซ็นเซอร์ DHT22
  • WiFi- built-in library สำหรับ ESP32

2. โค้ดหลัก (Main Code)

นี่คือโค้ดที่สมบูรณ์สำหรับ Multi-Sensor Node ที่เชื่อมต่อ MQTT:

/*
 * ESP32 Multi-Sensor Node สำหรับ Smart Home
 * เก็บข้อมูล: อุณหภูมิ ความชื้น การเคลื่อนไหว
 * ส่งข้อมูลผ่าน MQTT ไปยัง Home Assistant
 *
 * สร้างโดย: CynoIoT
 * วันที่: มีนาคม 2026
 */

#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>

// ===== การตั้งค่า WiFi =====
const char* ssid = "YOUR_WIFI_SSID";        // แก้เป็น WiFi ของคุณ
const char* password = "YOUR_WIFI_PASSWORD"; // แก้เป็นรหัสผ่าน WiFi

// ===== การตั้งค่า MQTT =====
const char* mqtt_server = "192.168.1.100";  // IP ของ MQTT Broker
const int mqtt_port = 1883;                 // Port มาตรฐาน MQTT
const char* mqtt_user = "homeassistant";    // Username (ถ้ามี)
const char* mqtt_pass = "your_mqtt_pass";   // Password (ถ้ามี)

// ===== การตั้งค่าขา GPIO =====
#define DHTPIN 4     // DHT22 DATA pin
#define DHTTYPE DHT22   // รุ่นเซ็นเซอร์
#define PIRPIN 27    // HC-SR501 Output pin

// ===== การตั้งค่าอื่นๆ =====
#define SENSOR_DELAY 5000  // อ่านเซ็นเซอร์ทุก 5 วินาที
#define MQTT_RECONNECT_DELAY 5000  // เชื่อมต่อ MQTT ใหม่ทุก 5 วินาที

// สร้าง object
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient mqttClient(espClient);

// ตัวแปรเก็บค่าเซ็นเซอร์
float temperature = 0;
float humidity = 0;
bool motionDetected = false;
bool lastMotionState = false;

// ตัวแปรสำหรับ timing
unsigned long lastSensorRead = 0;
unsigned long lastMQTTConnect = 0;

// ===== ฟังก์ชันเชื่อมต่อ WiFi =====
void setupWiFi() {
  Serial.print("🔌 กำลังเชื่อมต่อ WiFi: ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  int attempts = 0;
  while (WiFi.status() != WL_CONNECTED && attempts < 20) {
    delay(500);
    Serial.print(".");
    attempts++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\n✅ เชื่อมต่อ WiFi สำเร็จ!");
    Serial.print("📡 IP Address: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("\n❌ ไม่สามารถเชื่อมต่อ WiFi ได้");
  }
}

// ===== ฟังก์ชัน callback รับข้อความ MQTT =====
void mqttCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("📨 ได้รับข้อความ [");
  Serial.print(topic);
  Serial.print("]: ");

  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

// ===== ฟังก์ชันเชื่อมต่อ MQTT =====
void reconnectMQTT() {
  if (mqttClient.connected()) {
    return;
  }

  Serial.print("🔄 กำลังเชื่อมต่อ MQTT Broker...");

  // สร้าง Client ID แบบสุ่ม
  String clientId = "ESP32-MultiSensor-";
  clientId += String(random(0xffff), HEX);

  // พยายามเชื่อมต่อ
  if (mqttClient.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {
    Serial.println("✅ เชื่อมต่อสำเร็จ!");

    // Subscribe topics ถ้าต้องการรับคำสั่งจาก Home Assistant
    mqttClient.subscribe("home/sensors/command");
  } else {
    Serial.print("❌ ล้มเหลว (rc=");
    Serial.print(mqttClient.state());
    Serial.println(")");
  }
}

// ===== ฟังก์ชันอ่านเซ็นเซอร์ DHT22 =====
void readDHTSensor() {
  // อ่านอุณหภูมิ
  float newTemp = dht.readTemperature();

  // อ่านความชื้น
  float newHumidity = dht.readHumidity();

  // ตรวจสอบว่าอ่านค่าได้ถูกต้องหรือไม่
  if (isnan(newTemp) || isnan(newHumidity)) {
    Serial.println("⚠️  ไม่สามารถอ่านค่าจาก DHT22 ได้!");
    return;
  }

  // อัปเดตค่าใหม่
  temperature = newTemp;
  humidity = newHumidity;

  // แสดงค่าใน Serial Monitor
  Serial.println("🌡️  ข้อมูลเซ็นเซอร์:");
  Serial.print("  อุณหภูมิ: ");
  Serial.print(temperature, 1);
  Serial.println("°C");
  Serial.print("  ความชื้น: ");
  Serial.print(humidity, 1);
  Serial.println("%");
}

// ===== ฟังก์ชันอ่านเซ็นเซอร์ PIR =====
void readPIRSensor() {
  motionDetected = digitalRead(PIRPIN) == HIGH;

  // ตรวจจับการเปลี่ยนแปลงสถานะ
  if (motionDetected != lastMotionState) {
    if (motionDetected) {
      Serial.println("🚶 ตรวจพบการเคลื่อนไหว!");
    } else {
      Serial.println("✋ ไม่มีการเคลื่อนไหว");
    }
    lastMotionState = motionDetected;
  }
}

// ===== ฟังก์ชันส่งข้อมูลไป MQTT =====
void sendSensorData() {
  if (!mqttClient.connected()) {
    return;
  }

  // สร้าง JSON payload
  char payload[256];
  snprintf(payload, sizeof(payload),
    "{\"temperature\":%.1f,\"humidity\":%.1f,\"motion\":%s}",
    temperature, humidity, motionDetected ? "true" : "false"
  );

  // ส่งไปยัง MQTT topic
  const char* topic = "home/sensors/multisensor";
  if (mqttClient.publish(topic, payload)) {
    Serial.println("📤 ส่งข้อมูล MQTT สำเร็จ!");
  } else {
    Serial.println("❌ ส่งข้อมูล MQTT ล้มเหลว!");
  }
}

// ===== ฟังก์ชัน setup (ทำงานครั้งเดียว) =====
void setup() {
  // เริ่ม Serial Monitor
  Serial.begin(115200);
  Serial.println("\n🚀 เริ่มต้น ESP32 Multi-Sensor Node");

  // ตั้งค่าขา GPIO
  pinMode(PIRPIN, INPUT);
  pinMode(DHTPIN, INPUT);

  // เริ่มเซ็นเซอร์ DHT
  dht.begin();

  // เชื่อมต่อ WiFi
  setupWiFi();

  // ตั้งค่า MQTT
  mqttClient.setServer(mqtt_server, mqtt_port);
  mqttClient.setCallback(mqttCallback);

  // เชื่อมต่อ MQTT
  reconnectMQTT();

  Serial.println("✅ เริ่มต้นระบบเสร็จสิ้น!");
  Serial.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
}

// ===== ฟังก์ชัน loop (ทำงานวนซ้ำ) =====
void loop() {
  unsigned long currentMillis = millis();

  // ตรวจสอบการเชื่อมต่อ MQTT
  if (!mqttClient.connected() && currentMillis - lastMQTTConnect >= MQTT_RECONNECT_DELAY) {
    reconnectMQTT();
    lastMQTTConnect = currentMillis;
  }

  // รักษาการเชื่อมต่อ MQTT
  mqttClient.loop();

  // อ่านเซ็นเซอร์ทุกๆ 5 วินาที
  if (currentMillis - lastSensorRead >= SENSOR_DELAY) {
    readDHTSensor();
    readPIRSensor();
    sendSensorData();
    lastSensorRead = currentMillis;
  }
}
📝 คำอธิบายโค้ด
  • setupWiFi() - เชื่อมต่อ ESP32 เข้ากับเครือข่าย WiFi
  • reconnectMQTT() - เชื่อมต่อกับ MQTT Broker อัตโนมัติ
  • readDHTSensor() - อ่านค่าอุณหภูมิและความชื้นจาก DHT22
  • readPIRSensor() - ตรวจจับการเคลื่อนไหวจาก HC-SR501
  • sendSensorData() - ส่งข้อมูลทั้งหมดไปยัง MQTT Broker

3. อัปโหลดโค้ดไปยัง ESP32

  1. 1.เชื่อมต่อ ESP32 เข้ากับคอมพิวเตอร์ด้วยสาย USB
  2. 2.เปิด Arduino IDE และเลือก Board: ESP32 Dev Module
  3. 3.เลือก Port: USB Serial ของ ESP32
  4. 4.แก้ไข WiFi และ MQTT settings ในโค้ด
  5. 5.กด Upload (→) เพื่ออัปโหลดโค้ด

🏠 ต่อเชื่อมกับ Home Assistant

หลังจากที่ ESP32 เริ่มส่งข้อมูล MQTT แล้ว เราต้องตั้งค่า Home Assistant เพื่อรับและแสดงข้อมูลเหล่านั้น

1. ตั้งค่า MQTT Sensor ใน configuration.yaml

เพิ่มข้อมูลต่อไปนี้ในไฟล์ configuration.yaml:

# configuration.yaml

# MQTT Sensor สำหรับอุณหภูมิ
mqtt:
  sensor:
    - name: "Multi-Sensor Temperature"
      state_topic: "home/sensors/multisensor"
      value_template: "{{ value_json.temperature }}"
      unit_of_measurement: "°C"
      device_class: temperature
      unique_id: "multisensor_temp"

    - name: "Multi-Sensor Humidity"
      state_topic: "home/sensors/multisensor"
      value_template: "{{ value_json.humidity }}"
      unit_of_measurement: "%"
      device_class: humidity
      unique_id: "multisensor_humidity"

    - name: "Multi-Sensor Motion"
      state_topic: "home/sensors/multisensor"
      value_template: "{{ value_json.motion }}"
      payload_on: "true"
      payload_off: "false"
      device_class: motion
      unique_id: "multisensor_motion"

2. สร้าง Dashboard Card

สร้างไฟล์ lovelace/multisensor.yaml:

# lovelace/multisensor.yaml

type: vertical-stack
cards:
  # การ์ดหัวข้อ
  - type: custom:mushroom-title-card
    title: Multi-Sensor Node
    subtitle: ข้อมูลเซ็นเซอร์แบบเรียลไทม์

  # การ์ดอุณหภูมิและความชื้น
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-entity-card
        entity: sensor.multisensor_temperature
        name: อุณหภูมิ
        icon: mdi:thermometer
        fill_container: true

      - type: custom:mushroom-entity-card
        entity: sensor.multisensor_humidity
        name: ความชื้น
        icon: mdi:water-percent
        fill_container: true

  # การ์ดตรวจจับการเคลื่อนไหว
  - type: custom:mushroom-entity-card
    entity: binary_sensor.multisensor_motion
    name: ตรวจจับการเคลื่อนไหว
    icon: mdi:motion-sensor
    layout: vertical

  # กราฟประวัติอุณหภูมิ
  - type: history-graph
    title: ประวัติอุณหภูมิและความชื้น
    hours_to_show: 24
    entities:
      - entity: sensor.multisensor_temperature
      - entity: sensor.multisensor_humidity

💡 เคล็ดลับ

หากต้องการปรับแต่ง UI ให้สวยงามขึ้น แนะนำให้ใช้ Mushroom Cards ซึ่งเป็น theme ที่ได้รับความนิยมสูงในชุมชน Home Assistant

🔋 การประหยัดพลังงาน

หากต้องการใช้งานด้วยแบตเตอรี่ คุณสามารถใช้ Deep Sleep Mode เพื่อลดการใช้พลังงานลงอย่างมาก

🔋 Deep Sleep vs Normal Mode

โหมดการทำงาน กระแสไฟ (mA) อายุแบตเตอรี่*
Normal Mode (WiFi เปิดตลอด) ~80-120mA ~24 ชม. (ด้วย 2000mAh)
Deep Sleep Mode ~0.1-10mA ~3-6 เดือน (ด้วย 2000mAh)

*ขึ้นอยู่กับความถี่ในการส่งข้อมูลและสภาพแวดล้อม

ตัวอย่างโค้ด Deep Sleep

เพิ่มโค้ดนี้ในฟังก์ชัน loop():

// ในฟังก์ชัน loop()
void loop() {
  // ... โค้ดอื่นๆ ...

  // ส่งข้อมูลเสร็จแล้ว เข้าสู่ Deep Sleep
  Serial.println("💤 เข้าสู่ Deep Sleep Mode แล้ว...");

  // ตื่นขึ้นมาทำงานอีกครั้งใน 60 วินาที
  ESP.deepSleep(60e6);  // 60 วินาที (60 × 1,000,000 ไมโครวินาที)
}

⚠️ ข้อจำกัดของ Deep Sleep

เมื่อ ESP32 ตื่นจาก Deep Sleep โค้ดจะเริ่มต้นใหม่ที่ฟังก์ชัน setup() ดังนั้นต้องตั้งค่าทุกอย่างใหม่ทุกครั้ง

🔧 การแก้ปัญหา

นี่คือปัญหาที่พบบ่อยและวิธีแก้ไข:

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

สาเหตุ: รหัสผ่านผิด, อยู่ไกลเกินไปจาก Router

วิธีแก้: ตรวจสอบ SSID และ Password, ย้าย ESP32 ให้ใกล้ Router

❌ อ่านค่า DHT22 แล้วเป็น "NaN"

สาเหตุ: ต่อสายผิดขา, เซ็นเซอร์เสีย, รอน้อยเกินไป

วิธีแก้: ตรวจสอบการต่อสาย, เพิ่ม delay 2-3 วินาทีหลังเริ่มเซ็นเซอร์

❌ ไม่พบการเคลื่อนไหวจาก PIR

สาเหตุ: เซ็นเซอร์ไม่ได้รับพลังงาน, ปรับ sensitivity ต่ำเกินไป

วิธีแก้: ตรวจสอบ VCC 5V, ปรับจั้ม sensitivity ให้เหมาะสม

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

สาเหตุ: IP ผิด, Port ผิด, ไม่ได้เปิด MQTT Broker

วิธีแก้: ตรวจสอบ IP และ Port, ping จาก ESP32 ได้หรือไม่

⚠️ แบตเตอรี่หมดเร็วเกินไป

สาเหตุ: ไม่ได้ใช้ Deep Sleep, ส่งข้อมูลถี่เกินไป

วิธีแก้: เปิด Deep Sleep, ลดความถี่การส่งข้อมูล

🔍 Debug ด้วย Serial Monitor

ใช้ Serial Monitor (Arduino IDE: Tools → Serial Monitor) เพื่อดูข้อความ debug ตั้ง baud rate เป็น 115200 และดูว่าโค้ดทำงานที่ขั้นตอนไหน

🎉 สรุป

ยินดีด้วย! คุณได้สร้าง Multi-Sensor Node ที่สมบูรณ์แบบสำหรับ Smart Home ของคุณเอง โปรเจกต์นี้สามารถนำไปประยุกต์ใช้กับ Home Automation, Security System, หรือ Environmental Monitoring ได้

📚 ที่คุณได้เรียนรู้:

  • ✓ การเชื่อมต่อเซ็นเซอร์หลายประเภท
  • ✓ การใช้งาน MQTT Protocol
  • ✓ การต่อเชื่อม Home Assistant
  • ✓ การประหยัดพลังงานด้วย Deep Sleep

🚀 ถัดไป:

  • → เพิ่มเซ็นเซอร์วัดคุณภาพอากาศ (CO2, TVOC)
  • → สร้างแอปมือถือสำหรับควบคุม
  • → เชื่อมต่อกับ CynoIoT Platform
  • → ปรับปรุงประสิทธิภาพพลังงาน

หากคุณมีคำถามหรือต้องการคำแนะนำเพิ่มเติม อย่าลังเลที่จะติดต่อเรา หรือดูบทความอื่นๆ ใน หน้าบทความ

© 2026 CynoIoT. สร้างสรรค์ด้วย ❤️ สำหรับชุมชน IoT ไทย