บทความ: ใช้งานเซ็นเซอร์วัดอุณหภูมิและความชื้น DHT22 กับ ESP32

เรียนรู้วิธีการเชื่อมต่อและใช้งานเซ็นเซอร์ DHT22 กับ ESP32 เพื่อวัดอุณหภูมิและความชื้น พร้อมโค้ดตัวอย่างและคำอธิบายภาษาไทย

📅 7 มีนาคม 2026⏱️ 12 นาที🎯 ระดับ: เริ่มต้น
-40°C
ช่วงอุณหภูมิต่ำสุด
+80°C
ช่วงอุณหภูมิสูงสุด
0-100%
ช่วงความชื้น
±0.5°C
ความแม่นยำ

🎯 ภาพรวม DHT22 คืออะไร?

DHT22 (หรือ AM2302) เป็นเซ็นเซอร์วัดอุณหภูมิและความชื้นแบบดิจิทัลที่ได้รับความนิยมอย่างสูงในโลก IoT เนื่องจาก:

  • ราคาถูก - ราคาเพียง 40-80 บาท
  • ใช้งานง่าย - มีไลบรารีพร้อมใช้งานสำหรับ Arduino, ESP32, ESP8266
  • ความแม่นยำดี - อุณหภูมิ ±0.5°C, ความชื้น ±2-5%
  • ช่วงวัดกว้าง - อุณหภูมิ -40°C ถึง +80°C, ความชื้น 0-100%
  • ส่งสัญญาณดิจิทัล - ไม่ต้องใช้ ADC

💡 DHT22 vs DHT11: DHT22 มีความแม่นยำสูงกว่าและวัดช่วงที่กว้างกว่า DHT11 แต่ราคาแพงกว่าเล็กน้อย หากโปรเจกต์ต้องการความแม่นยำ แนะนำให้ใช้ DHT22

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

1. เซ็นเซอร์ DHT22

DHT22 (AM2302)

เซ็นเซอร์วัดอุณหภูมิและความชื้น

~฿40-80

2. บอร์ด ESP32

任何 ESP32 บอร์ดก็ได้ (NodeMCU-32S, ESP32-DevKitC, ฯลฯ)

3. ตัวต้านทาน 10kΩ (Resistor)

ใช้เป็น Pull-up resistor สำหรับสายข้อมูล

4. Breadboard และ Jumper Wires

สำหรับต่อวงจรทดลอง

🔗 การต่อสาย DHT22 กับ ESP32

DHT22 มี 4 ขา แต่ใช้งานจริงเพียง 3 ขา (ขาที่ 2 ไม่ได้ใช้):

ตารางการต่อสาย

DHT22 Pin ESP32 Pin หมายเหตุ
Pin 1 (VCC) 3.3V ไฟเลี้ยง 3.3V
Pin 2 (DATA) GPIO 4 (หรือใดก็ได้) สายสัญญาณ
Pin 3 (NC) -ไม่ได้ใช้
Pin 4 (GND) GNDกราวด์

⚠️ สำคัญ: ต้องต่อตัวต้านทาน 10kΩ ระหว่าง VCC (3.3V) และ DATA (Pin 2) เพื่อทำหน้าที่เป็น Pull-up resistor

💡 เคล็ดลับ: หากซื้อ DHT22 แบบโมดูล (มีพิมพ์วงจรมาให้) บางรุ่นอาจมี Pull-up resistor ติดมาแล้ว ให้ตรวจสอบก่อนว่ามีหรือไม่

📦 การติดตั้งไลบรารี DHT

เราจะใช้ไลบรารี "DHT sensor library for ESPx" จาก Beegee-Tokyo ซึ่งรองรับ ESP32 และ ESP8266:

วิธีที่ 1: ผ่าน Library Manager (แนะนำ)

  1. เปิด Arduino IDE
  2. ไปที่ Sketch → Include Library → Manage Libraries
  3. ค้นหา "DHT sensor library for ESPx"
  4. คลิก Install

วิธีที่ 2: ดาวน์โหลดจาก GitHub

  1. ไปที่ GitHub Repository
  2. ดาวน์โหลดไฟล์ ZIP
  3. ใน Arduino IDE: Sketch → Include Library → Add .ZIP Library
  4. เลือกไฟล์ ZIP ที่ดาวน์โหลดมา

💻 โค้ดพื้นฐาน: อ่านค่าอุณหภูมิและความชื้น

โค้ดนี้จะอ่านค่าอุณหภูมิและความชื้นจาก DHT22 และแสดงผลใน Serial Monitor:

#include "DHT.h"

// กำหนดขาที่ต่อ DHT22
#define DHTPIN 4     // GPIO 4 ของ ESP32

// ระบุประเภทเซ็นเซอร์
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// สร้างออบเจ็กต์ DHT
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);  // เริ่ม Serial Monitor
  dht.begin();           // เริ่มต้นเซ็นเซอร์

  Serial.println("DHT22 Test Started!");
}

void loop() {
  // รอ 2 วินาทีระหว่างการวัด (DHT22 ช้ากว่า DHT11)
  delay(2000);

  // อ่านค่าอุณหภูมิและความชื้น
  float humidity = dht.readHumidity();
  // อ่านค่าอุณหภูมิเป็นเซลเซียส (ค่าเริ่มต้น)
  float temperature = dht.readTemperature();
  // อ่านค่าอุณหภูมิเป็นฟาเรนไฮต์ (isFahrenheit = true)
  // float fahrenheit = dht.readTemperature(true);

  // ตรวจสอบว่าการอ่านค่าสำเร็จหรือไม่
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // แสดงผลใน Serial Monitor
  Serial.print("Humidity: ");
  Serial.print(humidity);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" *C");

  // หากต้องการแสดงผลเป็นฟาเรนไฮต์
  // Serial.print(fahrenheit);
  // Serial.println(" *F");
}
📝 คำอธิบาย:
  • delay(2000) - DHT22 ต้องการรออย่างน้อย 2 วินาทีระหว่างการวัด
  • isnan() - ตรวจสอบว่าค่าที่อ่านได้เป็นตัวเลขที่ถูกต้อง
  • Serial.begin(115200) - ตั้งค่า Baud rate ให้ตรงกับ Serial Monitor

🚀 โค้ดขั้นสูง: แสดงผลบน Web Server

โค้ดนี้สร้าง Web Server บน ESP32 เพื่อแสดงค่าอุณหภูมิและความชื้นบนเบราว์เซอร์:

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

// กำหนดขา DHT22
#define DHTPIN 4
#define DHTTYPE DHT22

// ข้อมูล WiFi
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";

// สร้าง Web Server ที่พอร์ต 80
WiFiServer server(80);

// สร้างออบเจ็กต์ DHT
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();

  // เชื่อมต่อ WiFi
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // เริ่มต้น Web Server
  server.begin();
}

void loop() {
  WiFiClient client = server.available();

  if (client) {
    Serial.println("New Client!");
    String currentLine = "";

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n') {
          if (currentLine.length() == 0) {
            // อ่านค่าเซ็นเซอร์
            float h = dht.readHumidity();
            float t = dht.readTemperature();

            // ส่งหน้าเว็บ
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();

            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta charset='UTF-8'>");
            client.println("<meta name='viewport' content='width=device-width, initial-scale=1.0'>");
            client.println("<title>DHT22 Sensor</title>");
            client.println("<style>");
            client.println("body { font-family: Arial; margin: 40px; background: #f5f5f5; }");
            client.println(".container { background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }");
            client.println("h1 { color: #333; }");
            client.println(".sensor { margin: 20px 0; padding: 15px; background: #e3f2fd; border-radius: 5px; }");
            client.println(".value { font-size: 36px; font-weight: bold; color: #1976d2; }");
            client.println("</style></head><body>");
            client.println("<div class='container'>");
            client.println("<h1>🌡️ ข้อมูลเซ็นเซอร์ DHT22</h1>");

            if (isnan(h) || isnan(t)) {
              client.println("<p>❌ ไม่สามารถอ่านค่าเซ็นเซอร์ได้</p>");
            } else {
              client.println("<div class='sensor'>");
              client.println("<p>💧 ความชื้น</p>");
              client.println("<p class='value'>" + String(h) + " %</p>");
              client.println("</div>");

              client.println("<div class='sensor'>");
              client.println("<p>🌡️ อุณหภูมิ</p>");
              client.println("<p class='value'>" + String(t) + " °C</p>");
              client.println("</div>");

              // คำนวณ Heat Index
              float hic = dht.computeHeatIndex(t, h, false);
              client.println("<div class='sensor'>");
              client.println("<p>🔥 Heat Index</p>");
              client.println("<p class='value'>" + String(hic) + " °C</p>");
              client.println("</div>");
            }

            client.println("<script>setTimeout(() => location.reload(), 5000);</script>");
            client.println("</div></body></html>");
            client.println();
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
      }
    }
    client.stop();
    Serial.println("Client disconnected");
  }

  delay(2000);  // รอ 2 วินาทีก่อนวัดค่าใหม่
}
🎯 ฟีเจอร์เพิ่มเติม:
  • หน้าเว็บจะรีเฟรชอัตโนมัติทุก 5 วินาที
  • คำนวณ Heat Index (ความร้อนที่รู้สึกได้)
  • ดีไซน์หน้าเว็บสวยงามด้วย CSS
  • แสดงผลได้ทั้งบนคอมพิวเตอร์และมือถือ

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

ปัญหา: อ่านค่าเซ็นเซอร์ไม่ได้ (NaN)

สาเหตุ: ต่อสายไม่ถูกต้อง หรือไม่ได้ต่อ Pull-up resistor

วิธีแก้: ตรวจสอบการต่อสายให้ถูกต้อง และต้องมีตัวต้านทาน 10kΩ ระหว่าง VCC และ DATA

ปัญหา: ค่าเซ็นเซอร์แม่นยำน้อย

สาเหตุ: DHT22 อ่านช้ากว่า 2 วินาที

วิธีแก้: เพิ่ม delay(2000) หรือมากกว่าระหว่างการอ่านค่า

ปัญหา: Web Server ไม่ได้

สาเหตุ: ไม่ได้เชื่อมต่อ WiFi หรือ IP ผิด

วิธีแก้: ตรวจสอบชื่อ WiFi และรหัสผ่าน ดู IP address จาก Serial Monitor

💡 ไอเดียโปรเจกต์ที่พัฒนาต่อ

🏠 ระบบควบคุมอุณหภูมิบ้าน

ใช้ DHT22 ตรวจสอบอุณหภูมิทุกห้อง และเปิด/ปิดแอร์อัตโนมัติ

🌱 ควบคุมความชื้นในโรงเรือน

เปิดน้ำพริกให้อัตโนมัติเมื่อความชื้นต่ำเกินไป

📊 ส่งข้อมูลไป CynoIoT Platform

บันทึกและวิเคราะห์ข้อมูลอุณหภูมิและความชื้นระยะยาว

🔔 แจ้งเตือนอุณหภูมิผิดปกติ

ส่งแจ้งเตือน Line Notify เมื่ออุณหภูมิสูงเกินไป

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