บล็อกของ PoundXI
เทคโนโลยี, คอมพิวเตอร์, เขียนโปรแกรม และอื่นๆ

สอนใช้ Arduino อ่านค่าจากเซ็นเซอร์วัดอุณหภูมิ DHT11


โพสต์เมื่อ 2016-05-09 โดย PoundXI

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 หรือก็คือไม่ได้ใช้ประโยชน์นั่นเอง”

DHT11 pinout

การต่อวงจร

การต่อวงจรให้ดูรูปด้านล่างครับ เราจะใช้ 5kΩ pull-up resistor สำหรับการต่อสายระหว่าง Arduino กับ DHT11 ในระยะที่ห่างกันไม่เกิน 20 เมตรนะครับ (อ้างอิงจาก DHT11 datasheet)

การต่อวงจร DHT11 กับ Arduino

โค้ดตัวอย่าง

ดาวน์โหลดไลบรารี 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 จะเห็นผลลัพธ์การทำงานดังนี้

DHT11 program output

ข้อมูลเพิ่มเติม


โพสต์ที่เกี่ยวข้อง


ความคิดเห็น

ยังไม่มีความคิดเห็น
โปรดเข้าสู่ระบบก่อนแสดงความคิดเห็น