📑 เนื้อหาในบทความ
🔍 ภาพรวม
การเลือกเซ็นเซอร์วัดอุณหภูมิและความชื้นที่เหมาะสม เป็นเรื่องสำคัญสำหรับโปรเจกต์ IoT บทความนี้จะเปรียบเทียบเซ็นเซอร์ยอดนิยม 3 รุ่นที่ใช้กันบ่อยที่สุด:
- DHT11: เซ็นเซอร์ราคาประหยัด เหมาะสำหรับมือใหม่
- DHT22 (AM2302): เซ็นเซอร์คุณภาพสูง แม่นยำกว่า DHT11
- DS18B20: เซ็นเซอร์วัดอุณหภูมิเท่านั้น แม่นยำสูงและทนทาน
💡 สรุปเลย: DHT11 = ถูก + ง่าย | DHT22 = แม่นยำ + วัดความชื้นดี | DS18B20 = ทนทาน + แม่นยำสูง + วัดอุณหภูมิเท่านั้น
📊 ตารางเปรียบเทียบ
| คุณสมบัติ | DHT11 | DHT22 (AM2302) | DS18B20 |
|---|---|---|---|
| ชนิดเซ็นเซอร์ | อุณหภูมิ + ความชื้น | อุณหภูมิ + ความชื้น | อุณหภูมิเท่านั้น |
| ช่วงวัดอุณหภูมิ | 0°C to 50°C | -40°C to 80°C | -55°C to 125°C |
| ความแม่นยำอุณหภูมิ | ±2°C | ±0.5°C | ±0.5°C |
| ช่วงวัดความชื้น | 20% to 80% | 0% to 100% | - |
| ความแม่นยำความชื้น | ±5% | ±2-5% | - |
| ความละเอียด | 1°C, 1% | 0.1°C, 0.1% | 0.0625°C |
| แรงดันไฟ | 3.3V - 5V | 3.3V - 5V | 3.0V - 5V |
| กระแสไฟ | 0.5-2.5mA | 1-1.5mA | <1mA |
| Sampling period | 1 เฮิรตซ์ (1 วินาที) | 0.5 เฮิรตซ์ (2 วินาที) | ถี่สูง (สูงสุด ~10 เฮิรตซ์) |
| ราคาโดยประมาณ | ฿20-40 | ฿60-100 | ฿40-80 |
| ความทนทาน | ปานกลาง | ปานกลาง | สูง (Waterproof) |
🌡️ DHT11 Temperature & Humidity Sensor
ข้อดี
- ราคาถูกมาก (฿20-40)
- ใช้งานง่าย เหมาะสำหรับมือใหม่
- รองรับทั้ง 3.3V และ 5V
- มี library พร้อมใช้งาน
- ขนาดเล็ก ต่อใช้งานง่าย
ข้อเสีย
- ความแม่นยำต่ำ (±2°C, ±5%)
- ช่วงวัดแคบ (0-50°C)
- อ่านค่าได้ช้า (1 ครั้ง/วินาที)
- ความละเอียดต่ำ (1°C)
- ไม่ทนทานต่อความชื้นสูง
เหมาะสำหรับ
- โปรเจกต์เรียนรู้ / การศึกษา
- โปรเจกต์งบประมาณต่ำ
- การทดสอบและพัฒนา prototype
- การตรวจสอบอุณหภูมิห้องทั่วไป
✅ เลือก DHT11 เมื่อ: ต้องการเซ็นเซอร์ถูกๆ สำหรับเรียนรู้ หรือโปรเจกต์ที่ไม่ต้องการความแม่นยำสูง
🌡️ DHT22 (AM2302) Temperature & Humidity Sensor
ข้อดี
- แม่นยำกว่า DHT11 (±0.5°C, ±2-5%)
- ช่วงวัดกว้าง (-40 to 80°C)
- ความละเอียดสูง (0.1°C)
- วัดความชื้นได้ 0-100%
- ใช้ library เดียวกับ DHT11
ข้อเสีย
- ราคาแพงกว่า DHT11
- อ่านค่าได้ช้ากว่า (2 วินาที)
- ยังคงมีความเสี่ยงเรื่องความชื้น
- ไม่สามารถวัดอุณหภูมิต่ำกว่า 0°C ได้แม่นยำ
เหมาะสำหรับ
- โปรเจกต์ Smart Home ทั่วไป
- การตรวจสอบสภาพแวดล้อม
- ระบบควบคุมความชื้น
- โปรเจกต์ที่ต้องการความแม่นยำปานกลาง
✅ เลือก DHT22 เมื่อ: ต้องการความแม่นยำกว่า DHT11 แต่ยังต้องการวัดความชื้นด้วย
🌡️ DS18B20 Digital Temperature Sensor
ข้อดี
- แม่นยำสูงมาก (±0.5°C)
- ช่วงวัดกว้าง (-55 to 125°C)
- ความละเอียดสูง (0.0625°C)
- ใช้ OneWire protocol (เชื่อมต่อหลายตัวบน 1 ขา)
- มีรุ่น Waterproof ทนทานต่อน้ำ
- อ่านค่าได้เร็ว (สูงสุด ~10 Hz)
- ประหยัดพลังงาน
ข้อเสีย
- วัดอุณหภูมิได้เท่านั้น (ไม่มีความชื้น)
- ใช้ library เฉพาะ (OneWire)
- การเชื่อมต่อซับซ้อนกว่า DHT
- ต้องใช้ pull-up resistor (4.7kΩ)
เหมาะสำหรับ
- การวัดอุณหภูมิของเหลว
- โปรเจกต์ outdoor / outdoor sensor
- การวัดอุณหภูมิแม่นยำสูง
- ระบบที่ต้องการเซ็นเซอร์หลายตัวบน bus เดียว
✅ เลือก DS18B20 เมื่อ: ต้องการความแม่นยำสูง วัดอุณหภูมิของเหลว หรือใช้งาน outdoor
🎯 คำแนะนำการเลือกใช้
🏠 สำหรับ Smart Home ในบ้าน
แนะนำ:DHT22
เหมาะสำหรับการตรวจสอบอุณหภูมิและความชื้นในห้อง มีความแม่นยำพอสมควรและราคาไม่แพง
🌊 สำหรับ Outdoor / วัดอุณหภูมิน้ำ
แนะนำ:DS18B20 (Waterproof)
ทนทานต่อสภาพอากาศ วัดอุณหภูมิของเหลวได้ แม่นยำสูงและเชื่อถือได้
🎓 สำหรับเรียนรู้ / Testing
แนะนำ:DHT11
ราคาถูก ใช้งานง่าย เหมาะสำหรับการเรียนรู้และทดสอบโปรเจกต์
🏭 สำหรับ Industrial / High Accuracy
แนะนำ:DS18B20หรือPT100 / Thermocouple
ต้องการความแม่นยำสูงและความเสถียร DS18B20 หรือเซ็นเซอร์ระดับ industrial
💻 ตัวอย่างโค้ด
DHT11 / DHT22 Code (Arduino)
/*
* ตัวอย่างการใช้งาน DHT11/DHT22 กับ Arduino/ESP32
*
* ฟังก์ชันนี้ใช้ได้ทั้ง DHT11 และ DHT22
* เพียงแค่เปลี่ยน DHTTYPE ให้ตรงกับรุ่นที่ใช้
*/
#include "DHT.h"
// ==================== Configuration ====================
// DHT Sensor pin (เชื่อมต่อกับขาใดก็ได้)
#define DHTPIN 4 // Digital pin connected to the DHT sensor
// กำหนดประเภทเซ็นเซอร์ (เลือกตามรุ่นที่ใช้)
// #define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
// #define DHTTYPE DHT21 // DHT 21 (AM2301)
// สร้าง object สำหรับ DHT sensor
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
// เริ่มต้น DHT sensor
dht.begin();
Serial.println("DHTxx Sensor Test");
Serial.println("================");
}
void loop() {
// รอ 2 วินาทีระหว่างการวัด (DHT sensor ช้า)
delay(2000);
// อ่านค่าความชื้น (เปอร์เซ็นต์)
float humidity = dht.readHumidity();
// อ่านค่าอุณหภูมิ (เซลเซียส)
float temperature = dht.readTemperature();
// ตรวจสอบว่าการอ่านค่าสำเร็จหรือไม่
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// แสดงผลใน Serial Monitor
Serial.print("💧 Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("🌡️ Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
// คำนวณ Heat Index (อุณหภูมิที่รู้สึกจริง)
float heatIndexC = dht.computeHeatIndex(temperature, humidity, false);
Serial.print("🔥 Heat Index: ");
Serial.print(heatIndexC);
Serial.println(" °C");
Serial.println("----------------------------");
}DS18B20 Code (Arduino)
/*
* ตัวอย่างการใช้งาน DS18B20 กับ Arduino/ESP32
*
* ใช้ OneWire protocol สำหรับการเชื่อมต่อ
* สามารถเชื่อมต่อเซ็นเซอร์หลายตัวบน 1 bus ได้
*/
#include <OneWire.h>
#include <DallasTemperature.h>
// ==================== Configuration ====================
// Data wire เชื่อมต่อกับขา GPIO 4 บน ESP32 (หรือขาใดก็ได้)
#define ONE_WIRE_BUS 4
// สร้าง OneWire object
OneWire oneWire(ONE_WIRE_BUS);
// สร้าง DallasTemperature object และส่ง OneWire object ไป
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
// เริ่มต้น DS18B20 library
sensors.begin();
Serial.println("DS18B20 Temperature Sensor");
Serial.println("===========================");
// ตรวจสอบว่าพบเซ็นเซอร์กี่ตัว
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" sensors.");
// ตั้งค่าความละเอียดเป็น 10 bits (ค่า 9-12 bits)
sensors.setResolution(10);
}
void loop() {
Serial.println("\nRequesting temperatures...");
// สั่งให้เซ็นเซอร์วัดอุณหภูมิ
sensors.requestTemperatures();
// อ่านค่าอุณหภูมิจากเซ็นเซอร์ตัวแรก (index 0)
float tempC = sensors.getTempCByIndex(0);
// ตรวจสอบว่าการอ่านค่าสำเร็จหรือไม่
if (tempC != DEVICE_DISCONNECTED_C) {
Serial.print("🌡️ Temperature for Device 1: ");
Serial.print(tempC);
Serial.println(" °C");
// แปลงเป็นฟาเรนไฮต์
float tempF = DallasTemperature::toFahrenheit(tempC);
Serial.print(" (");
Serial.print(tempF);
Serial.println(" °F)");
} else {
Serial.println("Error: Could not read temperature data!");
}
// ถ้ามีเซ็นเซอร์หลายตัว สามารถอ่านได้โดยใช้ index:
// float tempC2 = sensors.getTempCByIndex(1);
// float tempC3 = sensors.getTempCByIndex(2);
// รอ 5 วินาทีก่อนวัดใหม่
delay(5000);
}