บทความนี้เป็นการอธิบายการใช้งานไลบรารี DHT Sensor ของ Adafruit ที่รองรับกับทุกสถาปัตยกรรมที่ใช้กับ Arduino ได้ ทำให้สามารถประยุกต์การใช้งานเซ็นเซอร์ DHT ซึ่งใช้สำหรับอ่านค่าความชื้นและอุณหภูมิได้สะดวกและกับหลายแพลตฟอร์มได้ง่ายขึ้น โดยบทความนี้ได้ทดสอบกับ ESP32, ESP8266, Arduino UNO และ stm32f103c แล้วพบว่าสามารถใช้งานได้โดยไม่ต้องปรับแก้ไขโค้ดในส่วนของการทำงานหรือต้องเข้าไปแก้ไขรหัสต้นฉบับเพื่อให้ใช้งานได้กับแพลตฟอร์มที่ใช้งาน
DHT Sensor
DHT Sensor เป็นเซ็นเซอร์สำหรับอ่านค่าอุณหภูมิและความชื้นที่เป็นที่นิยมใช้เป็นอุปกรณ์พื้นฐานในการเรียนรู้ด้านสมองกลฝังตัวและ IoT โดยเซ็นเซอร์ประเภทนี้มี 2 รุ่น เรียกว่า DHT11 และ DHT22 ซึ่งมีความแตกต่างกันในเรื่องคุณสมบัติในการทำงาน แต่ขาเชื่อมต่อเหมือนกัน คือ ขาสำหรับจ่ายไฟเลี้ยง ขากราวด์ และขาข้อมูล
การติดตั้ง
การติดตั้งไลบรารีเข้าจากเมนู Sketch เลือก Include Library หลังจากนั้นเลือกรายการ Manage Libraries … จะแสดงหน้าต่างสำหรับค้นหาและอัพเกรดไลบรารี ให้พิมพ์ dht เพื่อค้นหาไลบรารีของ Adafruit ดังภาพที่ 2 หลังจากนั้นสั่ง Install และปิดหน้าเมื่อเสร็จขั้นตอนของการติดตั้ง
การใช้งานไลบรารี 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);
}
ตัวอย่างสำหรับ 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);
}
สรุป
จากบทความนี้จะพบว่าไลบรารี DHT ทำให้การเขียนโปรแกรมมีความสะดวกในการใช้งาน และไม่ขึ้นกับสถาปัตยกรรมของหน่วยประมวลผล ขอเพียงใช้งานได้กับเฟรมเวิร์ก Arduino เท่านั้น แต่อย่างไรก็ดี การอ่านค่าจากเซ็นเซอร์จะต้องอ่านรายละเอียดของ DHT11 และ DHT22 ให้ดี เนื่องจากเซ็นเซอร์แต่ละประเภทใช้เวลาในการอ่านค่าและการรอค่าที่มีความเสถียรไม่เท่ากัน สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดอยากพูดคุยสามารถคอมเมนต์ไว้ได้เลยครับ
(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-06-24, 2021-07-12, 2021-10-22