[TH] Using the DHT22/DHT11 Temperature and Humidity Sensor Module with ESP8266

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

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

ภาพที่ 1 ผลลัพธ์จาก code17-1

อุปกรณ์

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

โมดูล DHT22 และ DHT11

โมดูล DHT22 และ DHT11 เป็นโมดูลของเซ็นเซอร์ทำงานด้วยขาสัญญาณเพียงเส้นเดียว และใช้แรงดันไฟฟ้ากระแสตรง 3V3 ถึง 5V5 โดยไอซีของ DHT22 คือ AM2302 ความแตกต่างระหว่าง DHT22 และ DHT11 เป็นดังต่อไปนี้

คุณสมบัติDHT11DHT22
อุณหภูมิต่ำสุด (องศาเซลเซียส)0-40
อุณหภูมิสูงสุด (องศาเซลเซียส)5080
ความละเอียดของอุณหภูมิ (องศาเซลเซียส)+/- 2+/-0.5 – 1
ความชื้นต่ำสุด20%0%
ความชื้นสูงสุด95%99.9%
ความละเอียดของความชื้น+/- 5%+/- 2%
Sampling Period (millisecond)12

โมดูล DHT22 สำเร็จรูปเป็นดังภาพที่ 3 มีข้อดีที่ไม่ต้องต่อวงจร R-Pull up และเหลือขาเชื่อมต่อเพียง 3 ขา สำหรับ + หรือ Vcc, – หรือ GND และ S สำหรับขารับ/ส่งข้อมูล

การเชื่อมต่อ

การเชื่อมต่อระหว่างโมดูลเซ็นเซอร์ DHT22 กับ ESP8266

ESP8266DHT22
5V+
GPIO2 (D4)Sig
GND
ภาพที่ 4 ขาของโมดูล DHT22

การเชื่อมต่อระหว่างโมดูลแอลซีดีตัวอักษรกับ ESP8266

ESP8266I2C LCD 16×2
5VVcc
GNDGND
GPIO4 (D2)SCL
GPIO5 (D1)SDA
ภาพที่ 5 ขาของโมดูล I2C LCD
ภาพที่ 6 โมดูล DHT22 ที่พร้อมใช้งาน
ภาพที่ 7 การเชื่อมต่อโมดูลเซ็นเซอร์และแอลซีดีเข้ากับ ESP8266

ไลบรารี

การใช้งานไลบรารีสำหรับใช้งานโมดูลเซ็นเซอร์ 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)
ภาพที่ 8 ตัวอย่างผลลัพธ์ของโปรแกรม code17-2

ตัวอย่าง 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)
ภาพที่ 9 ตัวอย่างจากโปรแกรม code17-3

สรุป

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

สุดท้ายนี้ขอให้สนุกกับเขียนโปรแกรมครับผม

อ้างอิง

  1. Temperature and Humidity
  2. DHT11
  3. DHT22
  4. I2C LCD 16×2
  5. ESP8266 and I2C LCD 16×2

(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2024-04-04