در این مطلب، نحوهی اتصال سنسور رطوبت DHT22 به رزبریپای و استفاده از پایتون برای خواندن داده از روی آن را آموزش خواهیم داد.
DHT22 یک سنسور رطوبتی ارزان و پرکاربرد است که میتواند دمای یک محیط را نیز اندازه گیری کند. این سنسور دارای مسافت انتقالی نسبتا طولانی است، که به آن اجازه میدهد تا داده را از طریق سیم تا فاصله ۲۰ متری از رزبریپای انتقال دهد.
DHT22 یک سنسور دیجیتال با یک مبدل آنالوگ به دیجیتال داخلی است. این مبدل اتصال سنسور به رزبریپای را بسیار آسانتر کرده و نیاز به هر گونه چیپ اضافی را از بین میبرد.
بزرگترین ایراد DHT11 و DHT22 این است که سنسورها نسبتاً کند هستند. این سنسورها دارای نرخ نمونهبرداری برابر با یک ثانیه برای DHT11 و دو ثانیه برای DHT22 هستند.
میتوان DHT22 را همراه آردوینو نیز به کار گرفت، اگر میخواهید از بورد آردوینو استفاده کنید، حتما نگاهی به مطلب آموزشی ما بیندازید.
هرچند این مطلب طریقه اتصال DHT22 به رزبریپای را پوشش میدهد، اما میتوان از آن برای کار با سنسورهای رطوبتی DHT11 و AM2302 نیز استفاده کرد، زیرا همه آنها از پینهای یکسانی استفاده میکنند.
تجهیزات مورد نیاز
تجهیزات مورد نیاز برای اتصال سنسور DHT22 به رزبریپای در زیر لیست شده است.
تجهیزات پیشنهادی
- رزبریپای
- کارت اس دی ۸ گیگا بایت یا اگر از رزبریپای ۲،۳ یا +B استفاده میکنید، کارت میکرواس دی
- سیم بردبوردی
- بردبورد
- سنسور رطوبتی DHT22
- مقاومت ۱۰ کیلواهمی (قهوه ای، سیاه، نارنجی، طلایی)
تجهیزات اضافی
- جعبه رزبریپای
ویدئو
ویدئوی زیر تمام مراحل اسمبل کردن مدار سنسور و نحوه اتصال آن به رزبریپای را قدم به قدم نشان میدهد. همچنین مراحل نوشتن اسکریپت پایتون برای گفتگو با سنسور DHT22 را نیز دربر میگیرد.
اگر آموزش متنی را ترجیح میدهید، با ما همراه باشید.
تنظیمات سختافزاری سنسور رطوبتی رزبری پای
در این بخش، فرآیند اتصال سنسور رطوبتی DHT22 را به رزبریپای آموزش میدهیم.
به لطف سنسور دیجیتالی DHT22، اتصال آن به رزبریپای بسیار آسان شده است. تک پین داده را میتوان مستقیماً به پینهای ورودی خروجی (GPIO) رزبریپای وصل کرد. میتوانید راهنمای زیر را برای مشاهده نحوه اتصال DHT22 به رزبریپای مشاهده کنید.
نقشه پین DHT22
برای آسانتر کردن نصب مدار سنسور رطوبتی، ما نقشه سنسور DHT22 را هم به نمایش گذاشتهایم.
این دیاگرام به شما کمک میکند که بدانید هر پین به کدام قسمت رزبریپای میرود.
- پین ۱ VCC است. (منبع تغذیه)
- پین ۲ داده است. (سیگنال دیتا)
- پین ۳ NULL است. (اتصال داده نمیشود)
- پین ۴ GND است. (زمین)
مدار رزبریپای DHT22
در اینجا روشهای مختلفی که میتوان مطابق آن، مدار رزبریپای و سنسور رطوبتی را به همدیگر متصل کرد آوردهایم.
میتوانید از هر کدام از دیاگرامهای زیر کمک بگیرید تا جای هر پین را پیدا کرده و یا میتوانید از مراحل زیر کمک بگیرید.
- یک مقاومت ۱۰ کیلواهم بین پین یک و پین دو DHT22 قرار دهید.
- پین یک DHT22 را به پین فیزیکی یک (3v3) رزبریپای وصل کنید.
- پین دو از DHT22 را به پین فیزیکی هفتم (GPIO4) رزبریپای وصل کنید.
- پین چهار از DHT22 را به پین فیزیکی ششم (GND) رزبریپای وصل کنید.
آمادهسازی رزبریپای برای برقراری ارتباط با سنسور رطوبتی
- پیش از شروع نوشتن اسکریپت برای سنسور رطوبتی رزبریپای، باید مطمئن شویم که آخرین بروزرسانی را روی رزبریپایمان داریم.
میتوان این کار را با اجرای دو دستور زیر برای آپیدت لیست پکیجها و پکیجهای نصب شده اجرا کنیم.
sudo apt-get update sudo apt-get upgrade
- حال که لیست پکیجها آپدیت شده، باید پایتون ۳ و pip را نصب کنیم. از هر دوی این پکیجها برای مبادله اطلاعات با سنسور رطوبتی استفاده میکنیم.
دو پکیج python3-dev و python3-pip را با دستور زیر نصب کنید
sudo apt-get install python3-dev python3-pip
- قبل از پیشروی و نصب کتابخانه DHT، باید دستور زیر را برای کسب اطمینان از بروز بودن پیکجهای setuptools ،wheel و pip اجرا کنیم.
sudo python3 -m pip install --upgrade pip setuptools wheel
- حال با استفاده از pip، کتابخانه Adafruit DHT را روی رزبریپای نصب کنید. از این کتابخانهی پایتون برای ردوبدل اطلاعات با سنسور رطوبت/دما DHT22 استفاده میکنیم.
به عنوان جایزه، کتابخانه از سنسورهای رطوبتی/دمایی DHT11 و AM2302 نیز پشتیبانی میکند، این ویژگی این کتابخانه را به یک کتابخانهی فوقالعاده تبدیل میکند.
دستور زیر را برای نصب کتابخانهی DHT روی رزبریپای اجرا کنید.
sudo pip3 install Adafruit_DHT
- در بخش بعدی این مطلب اموزشی، نحوه استفاده از این کتابخانه برای نوشتن اسکریپت پایتون و تبادل اطلاعات با سنسور DHT22 را نشان خواهیم داد.
برنامهنویسی سنسور رطوبتی رزبریپای
- حال که کتابخانه Adafruit DHT را روی رزبریپای نصب کردهاید، برای برنامهریزی آن قدم پیش میگذاریم. اول از همه،باید یک اسکریپت پایتون برای ذخیره کد خود ایجاد کنیم. برای نوشتن این فایل، میتوان از دستور زیر روی رزبریپای استفاده کرد.
nano ~/humidity.py
- درون این فایل، باید کدها را وارد کنیم. در زیر هر بخش از کد را توضیح خواهیم داد.
import Adafruit_DHT
این خط کتابخانهی «Adafruit DHT» که با استفاده از pip در بخش قبل نصب کردیم را ضمیمه برنامه میکند.
از این کتابخانه برای گفتگو و رد وبدل اطلاعات با سنسور DHT22 استفاده میکنیم. کتابخانه ما را یاری میکند تا تنها با چند خط کد پایتون، به سادگی دما و رطوبت را از سنسور دریافت کنیم.
DHT_SENSOR = Adafruit_DHT.DHT22
در این خط، یک ثابت برای سنسور تعریف میکنیم تا از آن همراه با کتابخانهی DHT استفاده کنیم. کتابخانهی Adafruit DHT، بسته به سنسور به کار رفته، سه انتخاب پیش پایمان میگذارد.
برای این مطلب آموزشی، ما از سنسور DHT22 استفاده کردهایم، بنابراین ثابت «DHT_SENSOR» را به صورت «Adafruit_DHT.DHT22» تعریف کردهایم.
اگر شما از سنسور DHT11 و یا AM2302 استفاده میکنید، میتوانید ثابت را به ترتیب به صورت «Adafruit_DHT.DHT11» یا «Adafruit_DHT_AM2302» تعریف کنید.
DHT_PIN = 4
سپس، یک ثابت با نام «DHT_PIN» تعریف میکنیم، این ثابت شماره پین GPIO رزبریپای که DHT22 به آن وصل شده است را ذخیره میکند.
شمارهای که ما وارده کردهایم به شماره گذاری BCM پینهای GPIO ارجاع میدهد. بنابراین، اینجا باید شماره «۴» را وارد کنیم زیرا خروجی دیتا را به پین GPIO4 وصل کردهایم.
اگر پین GPIO دیگری استفاده کرده بودیم، باید ثابت مذکور را مطابق با شماره آن شماره تعریف کنیم.
while True: humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
سپس،حلقه بینهایت را با نوشتن «:while TRUE» آغاز میکنیم. این حلقه تا زمانی که کاربر اسکریپت را متوقف کند، بدون وقفه اجرا خواهد شد.
در ابتدای هر حلقه ای، از کتابخانه Adafruit DHT برای دریافت رطوبت و دما از سنسور DHT22 استفاده میکنیم و ثابتهای DHT_SENSOR و DHT_PIN را مشخص میکنیم.
تابع «read_retry» برای دریافت داده از سنسور رطوبتی بدون وقفه کار میکند.
if humidity is not None and temperature is not None: print("Temp={0:0.1f}*C Humidity={1:0.1f}%".format(temperature, humidity)) else: print("Failed to retrieve data from humidity sensor")
در نهایت، بررسی میکنیم که داده بازگشتی از کتابخانه DHT برای ما مفید است یا نه.
اگر هرکدام از متغیرهای «humidity» یا «temperature» برابر «None» باشند، آنگاه پیامی بازگردادنده شده تا به کاربر نشان دهد که در دریافت داده از سنسور رطوبتی ناموفق بوده است.
اگر هر دوی این متغیرها مقدار داشته باشند، پیامی چاپ خواهیم کرد تا رطوبت و دمای دریافتی از سنسور رطوبتی را به کاربر نشان دهد.
- پس از پایان نوشتن کدها، باید چیزی شبیه زیر داشته باشید.
import Adafruit_DHT DHT_SENSOR = Adafruit_DHT.DHT22 DHT_PIN = 4 while True: humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) if humidity is not None and temperature is not None: print("Temp={0:0.1f}*C Humidity={1:0.1f}%".format(temperature, humidity)) else: print("Failed to retrieve data from humidity sensor")
- اگر از صحت کد وارد شده اطمینان دارید، فایل را با فشردن کلیدهای CTRL + X ذخیره کرده و سپس کلید Y را و پس از آن Enter را وارد کنید.
- با ذخیره این اسکریپت، بگذارید پیشتر رفته و با اجرای آن دادهی ورودی از سنسور رطوبتی را مشاهده کنیم.
میتوان اسکریپت را با نوشتن دستور زیر اجرا کنیم.
python3 ~/humidity.py
- از این دستور به بعد، باید نتایجی همانند نتایج زیر مشاهده کنید. دما و رطوبت باید در خط فرمان نمایش داده شود.
Temp=25.6*C Humidity=51.8% Temp=25.2*C Humidity=45.4% Temp=25.1*C Humidity=45.4% Temp=25.0*C Humidity=45.3%
- در بخش بعدی آموزش، اسکریپت را به گونهای ویرایش میکنیم تا دادهها را درون یک فایل ثبت کند. فایل را میتوان با برنامههایی نظیر Microsoft Excel یا Google Spreadsheets خواند.
ثبت دادهها از سنسور رطوبتی رزبریپای
- با ایجاد یک اسکریپت جدید شروع میکنیم. این اسکریپت تقریبا شبیه اسکریپت قبلی است و تنها چند تغییر کوچک در آن ایجاد شده است.
دستور زیر را برای نوشتن اسکریپت جدیدمان وارد میکنیم.
nano ~/humidity_logger.py
- درون این فایل، کدهای زیر را وارد کنید. در این بخش تنها کدهای جدید را توضیح خواهیم داد.
import os import time import Adafruit_DHT
دو کتابخانهی «os» و «time» را ضمیمه کردهایم. از کتابخانهی «os» برای بررسی وجود فایل CSV قبل از نوشتن در آن استفاده میکنیم و از کتابخانهی «time» برای ثبت زمان (timestamp) هر سطر جدید با تاریخ و ساعت جاری استفاده میکنیم.
DHT_SENSOR = Adafruit_DHT.DHT22 DHT_PIN = 4
تفاوتی در این دو خط وجود ندارد، دقیقا مشابه اسکریپت قبلی میباشند.
try: f = open('/home/pi/humidity.csv', 'a+') if os.stat('/home/pi/humidity.csv').st_size == 0: f.write('Date,Time,Temperature,Humidity\r\n') except: pass
در اینجا تمام کد را برای مدیریت هرگونه خطای احتمالی درون یک عبارت try قرار دادهایم.
یک متغیر هندل برای فایل «home/pi/humidity.csv/» همراه با برچسب «+a» باز کردهایم. برچسب +a بدین معنی است که هرگونه داده نوشته شده در فایل به انتهای آن افزوده میشود.
سپس، از کتابخانه «os» برای مشاهده اینکه فایل از پیش وجود دارد یا خیر استفاده میکنیم. اگر size مقدار ۰ را برگرداند، آنگاه یک مقدار خط اولیه در فایل مینویسیم. این خط شامل سربرگ ستونها، برای فهم بهتر دادهها میباشد.
while True: humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
در اینجا مجددا حلقه while داریم. از کتابخانهی DHT برای خواندن مجدد از سنسور DHT22 استفاده میکنیم.
این تابع مقدار دادهای که از سنسور میخواند را در متغیرهای «humidity» و «temperature» ذخیره میکند.
if humidity is not None and temperature is not None: f.write('{0},{1},{2:0.1f}*C,{3:0.1f}%\r\n'.format(time.strftime('%m/%d/%y'), time.strftime('%H:%M'), temperature, humidity)) else: print("Failed to retrieve data from humidity sensor") time.sleep(30)
تغییر بزرگ ما در این بخش از کد این است که به جای چاپ دما و رطوبت در صفحه کنسول، آنها را در فایل «humidity.csv» مینویسیم. این کار را با استفاده از هندل فایلی که قبلا باز کرده بودیم انجام میدهیم.
متن نوشته شده در فایل را به گونهای فرمت میکنیم تا شامل تاریخ جاری، ساعت جاری و دما و رطوبت فرمت شده باشد.
در انتهای حلقه، به مدت ۳۰ ثانیه وارد حالت اسلیپ میشویم. اگر میخواهید اسلیپ طولانیتر باشد، عدد را ویرایش کنید.
- پس از پایان کدنویسی، باید چیزی شبیه زیر را ملاحظه کنید.
import os import time import Adafruit_DHT DHT_SENSOR = Adafruit_DHT.DHT22 DHT_PIN = 4 try: f = open('/home/pi/humidity.csv', 'a+') if os.stat('/home/pi/humidity.csv').st_size == 0: f.write('Date,Time,Temperature,Humidity\r\n') except: pass while True: humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) if humidity is not None and temperature is not None: f.write('{0},{1},{2:0.1f}*C,{3:0.1f}%\r\n'.format(time.strftime('%m/%d/%y'), time.strftime('%H:%M'), temperature, humidity)) else: print("Failed to retrieve data from humidity sensor") time.sleep(30)
- فایل را با فشردن کلیدهای CTRL + X ذخیره کرده و سپس کلید Y را و پس از آن Enter را وارد کنید.
- همانند اسکریپت قبلی، با وارد کردن دستور زیر آن را اجرا کنید.
python3 ~/humidity_logger.py
- با خروج از اسکریپت، میتوانید فایل «humidity.csv» را چک کرده و نتایج ثبت شده در طول زمان را مشاهده کنید.
اگر دستور زیر را اجرا کنید، میتوانید محتوای فایل را ببینید.
nano ~/humidity.csv
- مثالی از محتوای فایل در زیر آمده است.
Date,Time,Temperature,Humidity 05/04/19,05:47,22.3*C,50.6% 05/04/19,05:48,22.2*C,50.4% 05/04/19,05:48,22.2*C,50.6% 05/04/19,05:49,22.2*C,50.4% 05/04/19,05:49,22.2*C,50.4% 05/04/19,05:50,22.2*C,50.3% 05/04/19,05:50,22.2*C,50.3% 05/04/19,05:51,22.2*C,50.2%
اگر فایل به درستی نوشته شده است، کار برنامهنویسی سنسور رطوبتی رزبریپای با موفقیت پایان یافته است.
اگر به یک سنسور دمای ضدآب نیاز دارید، حتما مطلب آموزشی سنسور دمای DS18B20 را ملاحظه کنید. این مطلب آموزشی هر چیزی که برای کار با این سنسور باید بدانید را در برمیگیرد.
امیدواریم همه چیز را با موفقیت انجام داده باشید و مشکلی با سنسور رطوبتی و حرارتی نداشته باشید. اگر میخواهید نظر خود را با ما درمیان بگذارید، لطفا کامنت خود را در زیر قرار دهید.
- منبع: ترجمه از سایت pimylifeup.com
امیداریم مطلب آموزشی «اتصال سنسور رطوبت DHT22 به رزبریپای» برایتان مفید واقع شده باشه.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.