บทความครั้งนี้เป็นการใช้งานโมดูลวัดค่าอุณหภูมิและความชื้น DHT22 และ DHT11 ด้วยภาษาไพธอน ซึ่งเป็นโมดูลเซ็นเซอร์ที่ทำงานด้วยการใช้สายสัญญาณเพียงเส้นเดียว ทำให้ประหยัดพอร์ตของไมโครคอนโทรลเลอร์ในการเชื่อมต่อกับโมดูลเซ็นเซอร์ นอกจากนี้ MicroPython มีไลบรารีเตรียมไว้สำหรับการใช้งาน DHT22 และ DHT11 จึงสะดวกและประหยัดเวลา ลดความผิดพลาดที่อาจจะเกิดจากการเขียนโปรแกรมด้วยตนเอง
ตัวอย่างในบทความนี้มี 3 ตัวอย่าง code17-1 เป็นการอ่านค่ามาแสดงผลแบปกติ แต่ code17-2 เป็นการวนรอบเพื่ออ่านซ้ำ โดยนำค่าที่อ่านมาหาค่าน้อยสุดและต่ำสุด พร้อมทั้งแสดงออกทางโมดูลแอลซีดีดังภาพที่ 8 และตัวอย่าง code17-3 เป็นการแสดงค่าเฉลี่ยของอุณหภูมิและความชื้น

อุปกรณ์
- ESP8266
- DHT11 หรือ DHT22 โดยในบทความนีเลือกใช้โมดุล DHT22 สำเร็จรูป
- I2C LCD 16×2


โมดูล DHT22 และ DHT11
โมดูล DHT22 และ DHT11 เป็นโมดูลของเซ็นเซอร์ทำงานด้วยขาสัญญาณเพียงเส้นเดียว และใช้แรงดันไฟฟ้ากระแสตรง 3V3 ถึง 5V5 โดยไอซีของ DHT22 คือ AM2302 ความแตกต่างระหว่าง DHT22 และ DHT11 เป็นดังต่อไปนี้
คุณสมบัติ | DHT11 | DHT22 |
---|---|---|
อุณหภูมิต่ำสุด (องศาเซลเซียส) | 0 | -40 |
อุณหภูมิสูงสุด (องศาเซลเซียส) | 50 | 80 |
ความละเอียดของอุณหภูมิ (องศาเซลเซียส) | +/- 2 | +/-0.5 – 1 |
ความชื้นต่ำสุด | 20% | 0% |
ความชื้นสูงสุด | 95% | 99.9% |
ความละเอียดของความชื้น | +/- 5% | +/- 2% |
Sampling Period (millisecond) | 1 | 2 |
โมดูล DHT22 สำเร็จรูปเป็นดังภาพที่ 3 มีข้อดีที่ไม่ต้องต่อวงจร R-Pull up และเหลือขาเชื่อมต่อเพียง 3 ขา สำหรับ + หรือ Vcc, – หรือ GND และ S สำหรับขารับ/ส่งข้อมูล
การเชื่อมต่อ
การเชื่อมต่อระหว่างโมดูลเซ็นเซอร์ DHT22 กับ ESP8266
ESP8266 | DHT22 |
---|---|
5V | + |
GPIO2 (D4) | Sig |
GND | – |

การเชื่อมต่อระหว่างโมดูลแอลซีดีตัวอักษรกับ ESP8266
ESP8266 | I2C LCD 16×2 |
---|---|
5V | Vcc |
GND | GND |
GPIO4 (D2) | SCL |
GPIO5 (D1) | SDA |



ไลบรารี
การใช้งานไลบรารีสำหรับใช้งานโมดูลเซ็นเซอร์ DHT22/DHT11 ต้องเรียกใช้ไลบรารี dht ด้วยคำสั่ง
เมื่อเรียกใช้ไลบรารีต้องสร้างวัตถุของเซ็นเซอร์โดยกำหนดขาเชื่อมต่อดังนี้
ตัวแปรขา = machine.Pin( ขาเชื่อมต่อกับโมดูล )
วัตถุ = dht.DHT11( ตัวแปรขา )หรือ
ตัวแปรขา = machine.Pin( ขาเชื่อมต่อกับโมดูล )
วัตถุ = dht.DHT22( ตัวแปรขา )
เมธอดสำหรับให้ทำการอ่านค่าจากเซ็นเซอร์และประมวลผลข้อมูลจากเซ็นเซอร์เป็นดังนี้
วัตถุ.measure()
เมธอดสำหรับอ่านข้อมูลอุณหภูมิหลังจากได้สั่งประมวลผลข้อมูลจากเซ็นเซอร์มาก่อนหน้านี้แล้ว เป็นดังนี้
อุณหภูมิ = วัตถุ.temperature()
เมธอดสำหรับการอ่านข้อมูลความชื้นหลังจากได้เรียกการประมวลผลข้อมูลจากเซ็นเซอร์มาก่อนหน้านี้มีรูปแบบการใช้งานดังนี้
ข้อมูลความชื้น = วัตถุ.humidity()
ตัวอย่างโปรแกรม
ตัวอย่างโปรแกรม code17-1 เป็นการอ่านข้อมูลจากโมดูลเซ็นเซอร์ DHT22 มาแสดงที่โมดูลแสดงผลแอลซีดีตัวอักษร 16 ตัวอักษรต่อแถวจำนวน 2 แถว โดยเชื่อมต่อกับโมดูลเซ็นเซอร์ผ่านทาง GPIO2 และใช้บัส I2C เชื่อมต่อกับโมดูลแอลซีดีตัวอักษร
สำหรับกรณีที่ผู้อ่านใช้ DHT11 ต้องแก้ไขบรรทัดต่อไปนี้
sensor = dht.DHT22( sensorPin )
ให้เป็น
sensor = dht.DHT11( sensorPin )
# code17-1
import sys
import gc
import os
import time
import dht
import machine as mc
from kjlcd import LCD
sclPin = mc.Pin(5) #D1
sdaPin = mc.Pin(4) #D2
sensorPin = mc.Pin(2) #D4
i2c = mc.I2C(scl=sclPin,sda=sdaPin)
sensor= dht.DHT22(sensorPin)
sensor.measure()
tempValue = sensor.temperature()
humidValue = sensor.humidity()
lcd_addr= const(0x27)
lcd = LCD(i2c,lcd_addr)
lcd.goto(0,0)
lcd.puts("T:{}C H:{}%".format(tempValue, humidValue))
lcd.goto(0,1)
lcd.puts("(C)2020,JarutEx")
ตัวอย่าง code17-2 เป็นการนำ code17-1 มาปรับปรุงให้วนรอบทุกประมาณ 2 วินาที และหาค่าอุณหภูมิและความชื้นต่ำสุดกับสูงสุดเพื่อนำมาแสดงบนโมดูลแสดงผล ดังภาพที่ 8
# code17-2
import sys
import gc
import os
import time
import dht
import machine as mc
from kjlcd import LCD
sclPin = mc.Pin(5) #D1
sdaPin = mc.Pin(4) #D2
dht22Pin = mc.Pin(2) #D4
i2c = mc.I2C(scl=sclPin,sda=sdaPin)
dht22 = dht.DHT22(dht22Pin)
lcd_addr= const(0x27)
lcd = LCD(i2c,lcd_addr)
tMin = 99.0
tMax = 0.0
hMin = 99.9
hMax = 0.0
while True:
dht22.measure()
tempValue = dht22.temperature()
humidValue = dht22.humidity()
if (tMin > tempValue):
tMin = tempValue
if (tMax < tempValue):
tMax = tempValue
if (hMin > humidValue):
hMin = humidValue
if (hMax < humidValue):
hMax = humidValue
lcd.goto(0,0)
lcd.puts("T{} {}-{}".format(tempValue,tMin,tMax))
lcd.goto(0,1)
lcd.puts("H{} {}-{}".format(humidValue,hMin,hMax))
time.sleep_ms(1900)

ตัวอย่าง code17-3 เป็นการนำตัวอย่าง code17-2 มาหาค่าเฉลี่ยจากค่า tMin/tMax, hMin/hMax และแสดงค่าเฉลี่ยของอุณหภูมิและความชื้นออกทางโมดูลแอลซีดีตัวอักษรดังภาพที่ 9 ซึ่งในตัวอย่างนี้ได้เพิ่มวิธีการควบคุมการแสดงตัวเลขทศนิยมให้ใช้พื้นที่ 4 ตัวอักษรและให้ใน 4 ตัวอักษรนั้นเป็นทศนิยม 1 ตำแหน่ง ดังนั้น คำสั่ง lcd.puts( ) จึงใช้รูปแบบแตกต่างจากตัวอย่างก่อนหน้านี้ คือ
lcd.puts(“T-Average: {:4.1}”.format( tAverage ))
# code17-3
import sys
import gc
import os
import time
import dht
import machine as mc
from kjlcd import LCD
sclPin = mc.Pin(5) #D1
sdaPin = mc.Pin(4) #D2
dht22Pin = mc.Pin(2) #D4
i2c = mc.I2C(scl=sclPin,sda=sdaPin)
dht22 = dht.DHT22(dht22Pin)
lcd_addr= const(0x27)
lcd = LCD(i2c,lcd_addr)
tMin = 99.0
tMax = 0.0
hMin = 99.9
hMax = 0.0
while True:
dht22.measure()
tempValue = dht22.temperature()
humidValue = dht22.humidity()
if (tMin > tempValue):
tMin = tempValue
if (tMax < tempValue):
tMax = tempValue
if (hMin > humidValue):
hMin = humidValue
if (hMax < humidValue):
hMax = humidValue
tAverage = tMin + ((tMax-tMin)/2.0)
hAverage = hMin + ((hMax-hMin)/2.0)
lcd.goto(0,0)
lcd.puts("T-Average: {:4.1f}C ".format(tAverage))
lcd.goto(0,1)
lcd.puts("H-Average: {:4.1f}% ".format(hAverage))
time.sleep_ms(1900)

สรุป
จากบทความนี้ผู้อ่านสามารถเขียนโปรแกรมภาษาไพธอนเพื่ออ่านค่าอุณหภูมิและความชื้นจากโมดูลเซ็น DHT22 หรือ DHT11 เพื่อแสดงผลที่โมดูลแอลซีดีตัวอักษรขนาด 2 แถว แถวละ 16 ตัวอักษร ซึ่งมีความแตกต่างกันในเรื่องของคุณสมบัติ และที่ต้องพึงระวังในการนำไปใช้งาน คือ ความเร็วในการทำงานของโมดูลเซ็นเซอร์ทั้ง 2 นี้มีความแตกต่างกัน ทำให้การวนรอบเพื่ออ่านค่าต้องสัมพันธ์กับการทำงานของเซ็นเซอร์ด้วย ดังนั้น เมื่อเลือกใช้โมดูลเซ็นเซอร์ DHT22 การวนรอบจะต้องไม่เร็วกว่า 2 มิลลิวินาที และสำหรับ DHT11 จะต้องไม่เร็วกว่า 1 มิลลิวินาที
สุดท้ายนี้ขอให้สนุกกับเขียนโปรแกรมครับผม
อ้างอิง
(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2024-04-04