สอนใช้ Arduino อ่านค่าจากเซ็นเซอร์วัดอุณหภูมิ DHT11
DHT11 เป็นเซ็นเซอร์สำหรับวัดอุณหภูมิและความชื้นในอากาศ ที่มีขนาดเล็ก และราคาถูกมากๆ เพียงตัวละประมาณ 50 บาท สามารถใช้งานร่วมกับ Arduino ได้ง่ายๆ เพียงแค่จ่ายไฟให้เซ็นเซอร์ และอ่านค่าจาก Arduino โดยใช้ digital pin เพียง 1 pin เท่านั้น
สเปคคร่าวๆ ของ DHT11
- วัดความชื้นในอากาศ (Humidity) ได้ตั้งแต่ 20-90%RH มีโอกาศคลาดเคลื่อน ±5%RH
- วัดอุณหภูมิ (Temperature) ได้ตั้งแต่ 0-50 °C มีโอกาศคลาดเคลื่อน ±2 °C
- ขนาดของตัวเซ็นเซอร์ 1.5 x 1.0 x 0.5 cm
- ใช้ไฟ DC ที่มีแรงดันไฟตั้งแต่ 3-5.5V
DHT11 pinout
DHT11 มีขาทั้งหมด 4 ขา แต่เราจะใช้จริงเพียงแค่ 3 ขาเท่านั้น คือ ขาที่ 1, 2 และ 4 เพราะ datasheet บอกว่า “ขาที่ 3 เป็น Null หรือก็คือไม่ได้ใช้ประโยชน์นั่นเอง”
การต่อวงจร
การต่อวงจรให้ดูรูปด้านล่างครับ เราจะใช้ 5kΩ pull-up resistor สำหรับการต่อสายระหว่าง Arduino กับ DHT11 ในระยะที่ห่างกันไม่เกิน 20 เมตรนะครับ (อ้างอิงจาก DHT11 datasheet)
โค้ดตัวอย่าง
ดาวน์โหลดไลบรารี Dht11_Library.zip (ต้นฉบับมาจาก GitHub ของ Andy Dalton) จากนั้นติดตั้งไลบรารี แล้วใช้โค้ดด้านล่างนี้ทดสอบได้เลย
จุดเด่นของไลบรารีตัวนี้ คือ ไลบรารีมีขนาดเล็กมากเมื่อเทียบกับไลบรารีตัวอื่นเพราะออกแบบมาให้ใช้ได้กับ DHT11 เท่านั้น (ไลบรารีตัวอื่นอาจรองรับ DHT11, DHT22 และ DHT อื่นๆ ในไลบรารีตัวเดียวกัน)
#include <Dht11.h>
// สร้าง object dht11 และใช้ pin 2 ในการรับส่งข้อมูล (ใช้ pin ไหนก็ได้ที่สามารถรับส่งข้อมูลแบบ digital)
Dht11 _dht11(2);
void setup() {
Serial.begin(9600);
}
void loop() {
/*
* หมายเหตุ: ไลบรารีตัวนี้ไม่จำเป็นต้องเช็คสถานะการอ่านจากฟังก์ชั่น read() ว่าค่าที่อ่านได้นั้นถูกต้องหรือไม่
* เพราะค่าจะอัปเดตเมื่อ checksum ถูกต้องเท่านั้น ดังนั้นค่าที่อ่านได้จะถูกต้องเสมอ
*/
_dht11.read(); //อ่านค่าจากเซ็นเซอร์
// พิมพ์ค่า ความชื้นในอากาศ หน่วยเป็น %RH
Serial.print("Humidity: ");
Serial.print(_dht11.getHumidity());
Serial.print(" \%RH");
Serial.print(", "); // เว้นวรรค
// พิมพ์ค่า อุณหภูมิ หน่วยเป็นองศาเซลเซียส
Serial.print("Temperature: ");
Serial.print(_dht11.getTemperature());
Serial.println(" degree Celsius");
// หน่วงเวลา 4 วินาที ก่อนอ่านค่าและแสดงผลครั้งถัดไป (ตรงนี้แล้วแต่ว่าต้องการให้อัปเดตค่าใหม่ช้า/เร็วแค่ไหน)
delay(4000);
}
เมื่อเปิดดู Serial Monitor จะเห็นผลลัพธ์การทำงานดังนี้