วิธีต่อ ESP32 กับ DHT11 อ่านค่าอุณหภูมิและความชื้นแบบละเอียด (เข้าใจง่ายใน 5 นาที!)
เหมาะสำหรับนักเรียน นักศึกษา และผู้เริ่มต้นศึกษา IoT (Internet of Things)
สวัสดีครับนักเรียน นักศึกษา ทุกคน! วันนี้เราจะมาเรียนรู้วิธีการเขียนโปรแกรมอ่านค่าอุณหภูมิและความชื้นจากเซนเซอร์ยอดฮิตอย่าง DHT11 โดยใช้บอร์ดไมโครคอนโทรลเลอร์ ESP32 กันครับ
บทความนี้จะพาทำแบบ Step-by-Step พร้อมอธิบายโค้ดทุกบรรทัดอย่างละเอียด เพื่อให้เข้าใจหลักการและสามารถนำไปประยุกต์ใช้กับโปรเจกต์ของตัวเองได้จริงครับ เช่น ระบบรดน้ำต้นไม้อัตโนมัติ หรือระบบเปิด-ปิดพัดลมตามอุณหภูมิ
1. อุปกรณ์ที่ต้องใช้
- บอร์ด ESP32 (รุ่นใดก็ได้ เช่น ESP32 NodeMCU)
- เซนเซอร์ DHT11 (แนะนำแบบที่เป็น Module 3 ขา เพราะมีตัวต้านทาน Pull-up ในตัว)
- สายไฟจัมเปอร์ (Jumper Wires) แบบ Female-to-Female
- สาย USB สำหรับต่อ ESP32 เข้ากับคอมพิวเตอร์
2. การต่อวงจร (Wiring Diagram)

การต่อสายระหว่าง ESP32 กับ DHT11 (แบบ Module 3 ขา) ทำได้ง่าย ๆ ตามตารางนี้เลยครับ:
| ขาของ DHT11 | ต่อเข้ากับ | ขาของ ESP32 | อธิบายเพิ่มเติม |
|---|---|---|---|
| VCC (+) | → | 3V3 หรือ VIN | ขาจ่ายไฟเลี้ยง (รองรับ 3.3V - 5V) |
| GND (-) | → | GND | ขากราวด์ร่วม |
| DATA (OUT) | → | GPIO 5 | ขาส่งสัญญาณข้อมูล (เปลี่ยนเป็นขาอื่นได้) |
3. การเตรียมโปรแกรม Arduino IDE
- เปิดโปรแกรม Arduino IDE
- ไปที่เมนู Sketch → Include Library → Manage Libraries...
- ในช่องค้นหา ให้พิมพ์ว่า
DHT sensor libraryของ Adafruit แล้วกด Install - ระบบอาจจะมีหน้าต่างเตือนให้ติดตั้ง Library เสริมชื่อ
Adafruit Unified Sensorให้กด Install All
4. โค้ดโปรแกรม (Source Code)
คัดลอกโค้ดด้านล่างนี้ไปวางในโปรแกรม Arduino IDE
#include "DHT.h"
#define DHTPIN 5
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
Serial.println(F("DHT11 test!"));
dht.begin();
}
void loop() {
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.println(F("°C"));
}5. อธิบายโค้ดแบบเจาะลึกทุกบรรทัด
ส่วนที่ 1: การเรียกใช้งาน Library และกำหนดค่าเริ่มต้น
#include "DHT.h"
• เป็นการดึงคำสั่งสำเร็จรูปจาก Library เข้ามา ทำให้เราไม่ต้องเขียนโค้ดซับซ้อนเพื่อแกะสัญญาณดิจิทัลจากเซนเซอร์เอง
#define DHTPIN 5 และ #define DHTTYPE DHT11
• DHTPIN 5: บอกบอร์ด ESP32 ว่าเราต่อขาสัญญาณ (DATA) ไว้ที่ช่อง GPIO 5
• DHTTYPE DHT11: ระบุรุ่นเซนเซอร์ให้ถูกต้อง (เนื่องจาก Library นี้รองรับทั้ง DHT11, DHT22 และ AM2302)
DHT dht(DHTPIN, DHTTYPE);
• สร้างวัตถุ (Object) ชื่อว่า dht ขึ้นมา โดยส่งค่าขาและรุ่นของเซนเซอร์ที่เราตั้งไว้เข้าไป เพื่อเอาไว้ใช้เรียกคำสั่งอ่านค่าในฟังก์ชันถัดไป
ส่วนที่ 2: ฟังก์ชัน setup() (ทำงานครั้งเดียวตอนเปิดเครื่อง)
Serial.begin(115200);
• เปิดช่องทางการสื่อสารแบบ Serial เพื่อส่งข้อมูลไปแสดงผลบนหน้าจอคอมพิวเตอร์ ด้วยความเร็ว (Baud rate) 115200
dht.begin();
• สั่งให้เซนเซอร์เตรียมพร้อมเริ่มต้นทำงาน
ส่วนที่ 3: ฟังก์ชัน loop() (ทำงานวนซ้ำไปเรื่อย ๆ)
delay(2000);
• หน่วงเวลา 2 วินาทีก่อนอ่านค่าใหม่ เนื่องจาก DHT11 ต้องการเวลาในการแปลงสัญญาณ การอ่านถี่เกินไปจะทำให้ค่าเพี้ยน
float h = dht.readHumidity(); และ float t = dht.readTemperature();
• สั่งอ่านค่าความชื้นเก็บไว้ในตัวแปร h และอุณหภูมิเก็บไว้ในตัวแปร t โดยใช้ข้อมูลชนิด float เพราะต้องการเก็บค่าเป็นทศนิยม
if (isnan(h) || isnan(t)) { ... }
• ตรวจสอบว่าค่าที่อ่านได้ "ไม่ใช่ตัวเลข" (Is Not a Number) หรือไม่ หากเกิดจากสายหลุดหรือเซนเซอร์มีปัญหา โปรแกรมจะแจ้งเตือนและข้ามรอบนั้นไปทันที
Serial.print(...)
• สั่งพล็อตค่าอุณหภูมิและความชื้นที่อ่านได้ออกไปยังหน้าจอ Serial Monitor
6. ไอเดียการนำไปประยุกต์ใช้ต่อ (Challenge)
เมื่อน้อง ๆ สามารถอ่านค่าพื้นฐานได้แล้ว ลองนำแนวคิดนี้ไปประยุกต์และพัฒนาต่อยอดเป็นโปรเจกต์ของตัวเองดูนะครับ เช่น:
- ระบบเตือนภัยความร้อน: เขียนเงื่อนไข
if (t > 35)เพื่อให้ ESP32 สั่งเปิดเสียง Buzzer เตือนภัย หรือเปิดไฟ LED สีแดง - ระบบโรงเรือนอัจฉริยะ: ใช้คำสั่งตรวจสอบความชื้น
if (h < 60)ให้ไปเปิด Relay ควบคุมปั๊มน้ำพ่นหมอกเพื่อเพิ่มความชื้นอัตโนมัติ - โปรเจกต์ IoT เต็มรูปแบบ: ส่งค่าตัวแปร
tและhเข้าแอปพลิเคชันอย่าง Blynk หรือส่งแจ้งเตือนผ่าน LINE Notify เพื่อดูค่าสภาพแวดล้อมในห้องได้จากทุกที่ทั่วโลก
