กำลังโหลด...
สอนต่อ ESP32 อ่านค่าอุณหภูมิและความชื้นด้วย DHT11 สำหรับมือใหม่
บทความและข่าวสาร

สอนต่อ ESP32 อ่านค่าอุณหภูมิและความชื้นด้วย DHT11 สำหรับมือใหม่

Chalothorn Kosakul 10 กรกฎาคม 2569 550 ครั้ง

วิธีต่อ 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ขาส่งสัญญาณข้อมูล (เปลี่ยนเป็นขาอื่นได้)
โน้ตสำคัญ: หากใช้ DHT11 แบบ 4 ขาดิบ ๆ ที่ไม่ใช่ Module จำเป็นต้องต่อตัวต้านทาน 10kΩ คร่อมระหว่างขา VCC กับขา DATA เพื่อเป็น Pull-up Resistor แต่ถ้าใช้แบบ Module 3 ขา สามารถต่อตรงตามตารางได้เลยครับ

3. การเตรียมโปรแกรม Arduino IDE

  1. เปิดโปรแกรม Arduino IDE
  2. ไปที่เมนู Sketch → Include Library → Manage Libraries...
  3. ในช่องค้นหา ให้พิมพ์ว่า DHT sensor library ของ Adafruit แล้วกด Install
  4. ระบบอาจจะมีหน้าต่างเตือนให้ติดตั้ง 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)

เมื่อน้อง ๆ สามารถอ่านค่าพื้นฐานได้แล้ว ลองนำแนวคิดนี้ไปประยุกต์และพัฒนาต่อยอดเป็นโปรเจกต์ของตัวเองดูนะครับ เช่น:

  1. ระบบเตือนภัยความร้อน: เขียนเงื่อนไข if (t > 35) เพื่อให้ ESP32 สั่งเปิดเสียง Buzzer เตือนภัย หรือเปิดไฟ LED สีแดง
  2. ระบบโรงเรือนอัจฉริยะ: ใช้คำสั่งตรวจสอบความชื้น if (h < 60) ให้ไปเปิด Relay ควบคุมปั๊มน้ำพ่นหมอกเพื่อเพิ่มความชื้นอัตโนมัติ
  3. โปรเจกต์ IoT เต็มรูปแบบ: ส่งค่าตัวแปร t และ h เข้าแอปพลิเคชันอย่าง Blynk หรือส่งแจ้งเตือนผ่าน LINE Notify เพื่อดูค่าสภาพแวดล้อมในห้องได้จากทุกที่ทั่วโลก