📋 เนื้อหาในบทความ
🎯 ภาพรวมโปรเจกต์
ในยุค Smart Home ที่กำลังเติบโต การมีระบบเซ็นเซอร์ที่เชื่อถือได้และตอบโจทย์หลากหลายความต้องการเป็นสิ่งสำคัญ บทความนี้จะพาคุณสร้าง Multi-Sensor Node ที่สามารถเก็บข้อมูล อุณหภูมิ ความชื้น และการเคลื่อนไหว พร้อมส่งข้อมูลผ่าน MQTT ไปยัง Home Assistant อย่างมืออาชีพ
✨ จุดเด่นของโปรเจกต์นี้:
- ✓ เก็บข้อมูลได้ 3 ประเภท: อุณหภูมิ, ความชื้น, การเคลื่อนไหว
- ✓ ส่งข้อมูลผ่าน MQTT ที่เชื่อถือได้และรวดเร็ว
- ✓ เชื่อมต่อกับ Home Assistant ได้ทันที
- ✓ รองรับ Deep Sleep Mode สำหรับประหยัดแบตเตอรี่
- ✓ งบประมาณต่ำ ประกอบง่าย
🛠️ อุปกรณ์ที่ต้องใช้
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 | กราวด์ |
- 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 - สำหรับ MQTTDHTby Adafruit - สำหรับเซ็นเซอร์ DHT22WiFi- 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.เชื่อมต่อ ESP32 เข้ากับคอมพิวเตอร์ด้วยสาย USB
- 2.เปิด Arduino IDE และเลือก Board: ESP32 Dev Module
- 3.เลือก Port: USB Serial ของ ESP32
- 4.แก้ไข WiFi และ MQTT settings ในโค้ด
- 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
- → ปรับปรุงประสิทธิภาพพลังงาน
หากคุณมีคำถามหรือต้องการคำแนะนำเพิ่มเติม อย่าลังเลที่จะติดต่อเรา หรือดูบทความอื่นๆ ใน หน้าบทความ