این آموزش نشان میدهد چگونه با بردهای ESP32/ESP8266 و با استفاده از فریمور میکروپایتون،از سنسورهای دما و رطوبت DHT11 یا DHT22 استفاده کنید.
استفاده از ماژول DHT
یک ماژول به نام dht به صورت پیشفرض در فریمور میکروپایتون وجود دارد که گرفتن دما و رطوبت را آسان میکند.
۱- با وارد کردن ماژولهای dht و machine شروع کنید:
import dht
from machine import Pin
۲- یک آبجکت(شی) dht ایجاد کنید که به پین داده سنسور، که در اینجا GPIO 14 است، اشاره کند:
sensor = dht.DHT11(Pin(14))
#sensor = dht.DHT22(Pin(14))
۳- برای اندازهگیری و خواندن مقادیر سنسور، از دستور زیر استفاده کنید:
sensor.measure()
sensor.temperature()
sensor.humidity()
پیشنیازها – فلش کردن میکروپایتون
برای دنبال کردن این آموزش، نیاز دارید که فریمور میکروپایتون روی برد ESP32 یا ESP8266 نصب باشد. همچنین برای نوشتن وآپلود کد در بردتان، به یک IDE نیاز دارید. ما پیشنهاد میکنیم که از Thonny IDE یا uPyCraft IDE استفاده کنید.
معرفی سنسورهای DHT11 و DHT22
سنسورهای DHT11 و DHT22 برای اندازهگیری دما و رطوبت نسبی استفاده میشوند. این دو در بین سازندگان و علاقمندان به لوازم الکترونیکی بسیار محبوب هستند.

این سنسورها یک چیپ دارند که تبدیل سیگنال آنالوگ به دیجیتال را انجام میدهد و دما و رطوبت را به عنوان سیگنال دیجیتال خروجی میدهد. این ویژگی باعث شده است تا استفاده از آنها با هر میکروکنترلری راحت باشد.
DHT22 و DHT11
DHT22 و DHT11 بسیار شبیه هم هستند اما در جزئیات متفاوتاند. در جدول زیر بعضی از مهمترین مشخصات آنها آمده است. برای آنالیز دقیقتر این سنسورها، دیتاشیت آنها را چک کنید.

DHT22 رزولوشن بهتری دارد و رنج اندازهگیری آن گستردهتر است. هرچند که کمی گرانتر است و با فاصله ۲ ثانیه میتوانید مقادیر را بخوانید.
DHT11 رنج اندازهگیری کوچکتری دارد و دقت کمتری دارد اما میتوانید مقادیر را هر یک ثانیه بخوانید. همچنین ارزانتر است.
DHT22 و DHT11 برخلاف تفاوتهایشان، به صورت مشابه کار میکنند و برای خواندن دما و رطوبت میتوانید از کد یکسان برای آنها استفاده کنید. فقط نیاز دارید که در کد مشخص کنید از کدام سنسور استفاده میکنید.
DHT Pinout
همانطور که در شکل زیر نشان داده شده است، سنسورهای DHT چهار پین دارند. هرچند اگر شما DHT را به یک breakout board (مبدل پاور سرور) وصل کنید، میبینید که دارای ۳ پین و یک مقاومت داخلی pull-up در پین ۲ است.

جدول زیر pinout دو سنسور DHT22 و DHT11 را نشان میدهد. وقتی سنسور رو به شماست، شمارهگذاری پینها از ۱ و از چپ به راست شروع میشود.

قطعات مورد نیاز
برای دنبال کردن این آموزش، نیاز دارید که سنسور DHT22 یا DHT11 را به برد ESP32/ESP8266 وصل کنید. به یک مقاومت ۱۰ کیلواهم pull-up هم نیاز دارید.
لیست قطعاتی که برای ساخت مدار نیاز دارید، به شرح زیر است:
ESP32 یا ESP8266
DHT22 یا DHT11
مقاومت ۱۰ کیلواهم
بردبرد
سیم جامپر
شماتیک: ESP32 با DTH11/DTH22
همانطور که در دیاگرام شماتیک زیر نشان داده شده است، سنسور DTH11/DTH22 را به برد ESP32 وصل کنید.

در این مثال، ما پین داده DTH را به GPIO 14 وصل کردیم. شما میتوانید از هر پین دیجیتل مناسب دیگری استفاده کنید.
شماتیک: ESP8266 با DTH11/DTH22
اگر از برد ESP8266 استفاده میکنید، دیاگرام شماتیک زیر را دنبال کنید.

کد
در Thonny IDE) MicroPython IDE یا uPyCraft IDE) یک فایل جدید باز کنید و کد زیر را در آن کپی کنید.
from machine import Pin
from time import sleep
import dht
sensor = dht.DHT22(Pin(14))
#sensor = dht.DHT11(Pin(14))
while True:
try:
sleep(2)
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
temp_f = temp * (9/5) + 32.0
print('Temperature: %3.1f C' %temp)
print('Temperature: %3.1f F' %temp_f)
print('Humidity: %3.1f %%' %hum)
except OSError as e:
print('Failed to read sensor.')
کد چگونه کار میکند
کلاس Pin را از ماژول machine برای تعریف پینها وارد کنید، متد sleep از ماژول time را برای اضافه کردن تاخیر به کد، وارد کنید.
در نهایت ماژول dht را هم وارد کنید تا بتوانید توابعی را وارد کنید که مقادیر را از سنسورهای DTH بخوانند.
from machine import Pin
from time import sleep
import dht
یک آبجکت dht که sensor نام دارد را در پینِ داده مشخص شده، تعریف کنید. در اینجا ما پین داده را به GPIO 14 وصل کردیم.
اگر از DHT22 استفاده میکنید، از دستور زیر استفاده کنید:
sensor = dht.DHT22(Pin(14))
اگر از DHT11 استفاده میکنید، خط بالا را کامنت کنید و خط زیر را از حالت کامنت خارج کنید:
#sensor = dht.DHT11(Pin(14))
در حلقه while ما از عبارتهای try و except استفاده میکنیم.
در عبارت try، ما میخواهیم مقادیر دما و رطوبت را بگیریم.
توجه: try و excepr به ما این امکان را میدهند که وقتی یک استثنا اتفاق میافتد، اجرای برنامه ادامه پیدا کند. برای مثال، وقتی یک ارور رخ میدهد، اجرای بلوک کد try متوقف میشود و به بلوک except منتقل میشود. در مثال ما، وقتی که مقادیر نمیتوانند از سنسور خوانده شوند، except برای جلوگیری از خراب شدن برد ESP کارآمد است.
در عبارت try، ابتدا یک تاخیر ۲ ثانیهای ایجاد میکنیم؛ چون حداکثر نرخ نمونهبرداری DTH22 برابر ۲ ثانیه است. نرخ نمونهبرداری DTH11 یک ثانیه است.
sleep(2)
قبل از اینکه دما و رطوبت را بگیرید، نیاز دارید که از متد ()measure در آبجکت sensor استفاده کنید:
sensor.measure()
سپس دما را با ()sensor.temperature و رطوبت را با ()sensor.humidity بخوانید.
مقادیر خوانده شده را در متغیرهای temp و hum ذخیره کنید.
temp = sensor.temperature()
hum = sensor.humidity()
دستور زیر دما را به فارنهایت تبدیل میکند:
temp_f = temp * (9/5) + 32.0
در آخر، تمام مقادیر خوانده شده، توسط تابع ()print در صفحه Shell میکروپایتون به نمایش در میآیند.
print('Temperature: %3.1f C' %temp)
print('Temperature: %3.1f F' %temp_f)
print('Humidity: %3.1f %%' %hum)
در صورت بروز خطا در دریافت مقادیر خوانده شده، عبارت except اجرا میشود و یک پیغام خطا چاپ میشود:
except OSError as e:
print('Failed to read sensor.')
نمایش عملی
بعد از کپی کردن کد و انجام تغییرات لازم، میتوانید کد را در برد ESP32/ESP8266 آپلود کنید.
اگر شما از Thonny IDE استفاده میکنید، باید به مسیر زیر بروید و بعد از آپلود کد، دکمه RESET روی برد را فشار دهید.
Device > Upload current script as main script
دما و رطوبت خوانده شده باید هر دو ثانیه یک بار در صفحه Shell میکروپایتون نمایش داده شوند.

جمعبندی
به لطف ماژول dht ، خواندن دما و رطوبت با MicroPython آسان است.
بعد از تعریف یک آبجکت dht، نیاز دارید از متدهای ()temperature و ()humidity استفاده کنید.