📑 เนื้อหาในบทความ
🎯 ภาพรวม 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
เซ็นเซอร์วัดอุณหภูมิและความชื้น
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 (แนะนำ)
- เปิด Arduino IDE
- ไปที่ Sketch → Include Library → Manage Libraries
- ค้นหา "DHT sensor library for ESPx"
- คลิก Install
วิธีที่ 2: ดาวน์โหลดจาก GitHub
- ไปที่ GitHub Repository
- ดาวน์โหลดไฟล์ ZIP
- ใน Arduino IDE: Sketch → Include Library → Add .ZIP Library
- เลือกไฟล์ 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 เมื่ออุณหภูมิสูงเกินไป