[TH] Arduino : DHT Sensor

บทความนี้เป็นการอธิบายการใช้งานไลบรารี DHT Sensor ของ Adafruit ที่รองรับกับทุกสถาปัตยกรรมที่ใช้กับ Arduino ได้ ทำให้สามารถประยุกต์การใช้งานเซ็นเซอร์ DHT ซึ่งใช้สำหรับอ่านค่าความชื้นและอุณหภูมิได้สะดวกและกับหลายแพลตฟอร์มได้ง่ายขึ้น โดยบทความนี้ได้ทดสอบกับ ESP32, ESP8266, Arduino UNO และ stm32f103c แล้วพบว่าสามารถใช้งานได้โดยไม่ต้องปรับแก้ไขโค้ดในส่วนของการทำงานหรือต้องเข้าไปแก้ไขรหัสต้นฉบับเพื่อให้ใช้งานได้กับแพลตฟอร์มที่ใช้งาน

ภาพที่ 1 dht22 Sensor กับ BluePill

DHT Sensor

DHT Sensor เป็นเซ็นเซอร์สำหรับอ่านค่าอุณหภูมิและความชื้นที่เป็นที่นิยมใช้เป็นอุปกรณ์พื้นฐานในการเรียนรู้ด้านสมองกลฝังตัวและ IoT โดยเซ็นเซอร์ประเภทนี้มี 2 รุ่น เรียกว่า DHT11 และ DHT22 ซึ่งมีความแตกต่างกันในเรื่องคุณสมบัติในการทำงาน แต่ขาเชื่อมต่อเหมือนกัน คือ ขาสำหรับจ่ายไฟเลี้ยง ขากราวด์ และขาข้อมูล

การติดตั้ง

การติดตั้งไลบรารีเข้าจากเมนู Sketch เลือก Include Library หลังจากนั้นเลือกรายการ Manage Libraries … จะแสดงหน้าต่างสำหรับค้นหาและอัพเกรดไลบรารี ให้พิมพ์ dht เพื่อค้นหาไลบรารีของ Adafruit ดังภาพที่ 2 หลังจากนั้นสั่ง Install และปิดหน้าเมื่อเสร็จขั้นตอนของการติดตั้ง

ภาพที่ 2 หน้าจอ Library Manager

การใช้งานไลบรารี DHT ทำได้ด้วยการนำเข้าไฟล์ส่วนหัว ดังนี้

#include <DHT.h>

สำหรับการสร้างตัวแปรวัตถุสำหรับเข้าถึงเซ็นเซอร์จะต้องกำหนด 2 สิ่ง คือ ขาที่เชื่อมต่อกับขาข้อมูลของเซ็นเซอร์ และประเภทของเซ็นเซอร์ที่ติดต่อด้วย ซึ่งต้องกำหนดเป็น DHT11 หรือ DHT22 ให้ตรงกับอุปกรณ์ที่เลือกใช้ จึงได้บรรทัดคำสั่งสำหรับสร้างตัวแปรวัตถุของเซ็นเซอร์เป็นดังนี้

DHT ตัวแปร = DHT( ขาเชื่อมต่อ, ประเภทของเซ็นเซอร์ )

ชุดคำสั่ง

เมื่อสร้างตัวแปรของวัตถุเซ็นเซอร์ประเภท DHT เป็นที่เรียบร้อย สิ่งที่ต้องทราบต่อมาคือชุดคำสั่งการใช้งานไลบรารี DHT sensor ซึ่งประกอบด้วยคำสั่งต่อไปนี้

เริ่มต้นทำงาน

คำสั่งสำหรับเริ่มต้นทำงานมีรูปแบบของการใช้งานดังนี้

ตัวแปร.begin();

อ่านค่าอุณหภูมิ

การอ่านค่าอุณหภูมิในหน่วยองศาสเซลเซียสมีรูปแบบของการใช้งานดังต่อไปนี้


  float ค่าอุณหภูมิแบบเซลเซียส = ตัวแปร.readTemperature();

สำหรับการอ่านแบบฟาเรนไฮต์สามารถใช้คำสั่งอ่านอุณหภูมิและเพิ่มอาร์กิวเมนต์ true ให้กับคำสั่งดังนี้

  float ค่าอุณหภูมิแบบฟาเรสไฮต์  = ตัวแปร.readTemperature(true);

อ่านค่าความชื้น

คำสั่งสำหรับอ่านค่าร้อยละของความชื้นมีรูปแบบของการใช้งานดังต่อไปนี้

  float ค่าความชื้น = ตัวแปร.readHumidity();

คำนวณอุณหภูมิชี้วัด

คำสั่งสำหรับการนำค่าอุณหภูมิมาคำนวณกับค่าความชื้นเพื่อให้เป็นค่าอุณหภูมิชี้วัด หรือ Heat Index แบบค่าองศาสเซลเซียสมีรูปแบบการใช้งานดังนี้

  float ค่าอุณหภูมิชี้วัดแบบเซลเซียส = ตัวแปร.computeHeatIndex(ค่าอุณหภูมิแบบเซลเซียส , ค่าความชื้น, false);

กรณีที่ต้องการค่าหน่วยวัดเป็นฟาเรนไฮต์ให้ใช้คำสั่งต่อไปนี้

  float ค่าอุณหภูมิชี้วัดแบบฟาเรสไฮต์ = ตัวแปร.computeHeatIndex(ค่าอุณหภูมิแบบฟาเรสไฮต์, ค่าความชื้น);

ทดสอบการใช้งาน

ตัวอย่างโปรแกรมในครั้งนี้เป็นการอ่านค่าอุณหภูมิและความชื้นจากเซ็นเซอร์ DHT22 เพื่อแสดงผลบน LCD แบบ I2C (การใช้งานอ่านได้จากบทความนี้) โดยใช้กับบอร์ด Blue Pill ซึ่งเป็น STM32F103 ที่มีขนาดเท่ากับ Arduino Nano และเชื่อมขาสัญญาณของ DHT เข้ากับขา PA1 (การติดตั้ง Arduino IDE สำหรับ STM32 อ่านได้จากบทความนี้) ซึ่งการทำงานของโปรแกรมประกอบด้วย

  • แสดงหน้าจอแรก
  • แสดงอุณหภูมิแบบองศาเซลเซียส องศาฟาเรนไฮต์ และค่าความชื้น
  • แสดงอุณหภูมิชี้วัด

ตัวอย่างของการทำงานเป็นดังภาพที่ 2, 3 และ 4 และโค้ดโปรแกรมเป็นดังนี้

////////////////////////////////////////////////////////
// demoDHT
// chip: stm32f103
// board: stm32-station lab
// (C) 2020-2021, JarutEx
/////////////////////////////////////////////////////////
#include <DHT.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
DHT dht = DHT(PA1, DHT22);

void setup() {
  Serial.begin(115200);
  dht.begin();
  lcd.init();
  lcd.backlight();
}

void loop() {
  float h = dht.readHumidity();
  float tc = dht.readTemperature();
  float tf = dht.readTemperature(true);

  if (isnan(h) || isnan(tc) || isnan(tf)) {
    lcd.setCursor(0, 1);
    lcd.print("DHTsensor Failed");
    return;
  }

  float hic = dht.computeHeatIndex(tc, h, false);
  float hif = dht.computeHeatIndex(tf, h);

  lcd.setCursor(0, 0);
  lcd.print("STM32-StationLab");
  lcd.setCursor(0, 1);
  lcd.print(" www.jarutex.com");
  delay(2000);

  lcd.setCursor(0, 0);
  lcd.print("T:      C      F");
  lcd.setCursor(3, 0);
  lcd.print(tc);
  lcd.setCursor(10, 0);
  lcd.print(tf);
  lcd.setCursor(0, 1);
  lcd.print("Humidity:     % ");
  lcd.setCursor(9, 1);
  lcd.print(h);
  delay(5000);

  lcd.setCursor(0, 0);
  lcd.print("   Heat index   ");
  lcd.setCursor(0, 1);
  lcd.print("T:      C      F");
  lcd.setCursor(3, 1);
  lcd.print(hic);
  lcd.setCursor(10, 1);
  lcd.print(hif);
  delay(5000);
}
ภาพที่ 3 แสดงหน้าจอแรก
ภาพที่ 4 แสดงอุณหภูมิและความชื้น
ภาพที่ 5 แสดง Heat Index

ตัวอย่างสำหรับ Arduino Mega เป็นดังนี้ โดยเชื่อมต่อ dht11 เข้ากับขา D13 ดังภาพที่ 5 และผลลัพธ์การทำงานเป็นดังภาพที่ 6

// Arduino Mega2560

#include <DHT.h>

DHT dht = DHT(13, DHT11);

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

void loop() {

  float h = dht.readHumidity();
  float tc = dht.readTemperature();
  float tf = dht.readTemperature(true);

  if (isnan(h) || isnan(tc) || isnan(tf)) {
    Serial.print("DHTsensor Failed");
    return;
  }

  float hic = dht.computeHeatIndex(tc, h, false);
  float hif = dht.computeHeatIndex(tf, h);

  Serial.print("T: ");
  Serial.print(tc);
  Serial.print("C/");
  Serial.print(tf);
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print("%, ");
  Serial.print("   Heat index   ");
  Serial.print(hic);
  Serial.print("C/");
  Serial.print(hif);
  Serial.println("F");
  delay(5000);
}
ภาพที่ 6 โมดูล DHT11 ที่ต่อเข้ากับขา D13 ของ Arduino Mega 2560
ภาพที่ 7 ตัวอย่างผลลัพธ์ที่ได้จากการทำงานของ Arduino Mega2560

สรุป

จากบทความนี้จะพบว่าไลบรารี DHT ทำให้การเขียนโปรแกรมมีความสะดวกในการใช้งาน และไม่ขึ้นกับสถาปัตยกรรมของหน่วยประมวลผล ขอเพียงใช้งานได้กับเฟรมเวิร์ก Arduino เท่านั้น แต่อย่างไรก็ดี การอ่านค่าจากเซ็นเซอร์จะต้องอ่านรายละเอียดของ DHT11 และ DHT22 ให้ดี เนื่องจากเซ็นเซอร์แต่ละประเภทใช้เวลาในการอ่านค่าและการรอค่าที่มีความเสถียรไม่เท่ากัน สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ

ท่านใดอยากพูดคุยสามารถคอมเมนต์ไว้ได้เลยครับ

(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-06-24, 2021-07-12, 2021-10-22