رزبری پای - Raspberry PIمطالب علمی

راه اندازی سنسور دمای DHT11 و DHT22 توسط Raspberry Pi 3

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

پردازش اطلاعات دریافتی از سنسور:
برای راه اندازی سنسور تنها از یک پین سنسور استفاده میشود. برای ایجاد ارتباط رزبری با سنسور باید یک همزمانی میان این دو ایجاد کنیم. هرباری که اطلاعاتی از سنسور توسط رزبری دریافت میشود باید مدت زمان دریافت کمتر از 4 میلی ثانیه باشد.
اطلاعاتی که از سنسور به رزبری ارسال میشود دارای پنج بخش مختلف به ترتیب زیر است.

8bit integral RH data +
8bit decimal RH data +
8bit integral T data +
8bit decimal T data +
8bit check sum.

اگر اطلاعات دریافتی از سنسور درست باشند باید مقدار check sum کمتر از 8bit باشد. مقدار check sum برابر است با جمع سایر اطلاعات.

check sum =“8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data”.

در حالت عادی پین data سنسور برابر high است. زمانی سنسور شروع به ارسال اطلاعات میکند که رزبری پین خود را به مدت کمتر از 18 میلی ثانیه pull down کند. به اینکار سیگنال شروع میگویند. سپس رزبری برای دریافت اطلاعات بهتر سنسور باید مدت 20-40 میکرو ثانیه پین خود را pull up کند.
زمانی که سنسور سیگنال شروع را دریافت میکند، سنسور برای مدت 80 میکرو ثانیه پین data را pull down میکند. به این سیگنال، سیگنال پاسخ میگویند.
سپس سنسور پین data را برای مدت 80 میکرو ثانیه pull up میکند. حالا اطلاعات از سنسور به رزبری ارسال میشود.
در طول زمان ارسال اطلاعات، هر بیت از اطلاعات به مدت 50 میکرو ثانیه طول میکشد. در مجموع رزبری باید 5*8=40 بیت اطلاعات از سنسور در یافت کند.
نکته ی مهم در هنگام راه اندازی این دوسنسور استفاده از مقاومت پول آپ در سنسور است بطوری که مقاومت پول آپ به خروجی سنسور و تغذیه سنسور متصل شود .
تذکر :درهنگام استفاده از این برنامه هرباری که اقدام به خواندن اطلاعات از سنسور میکنید ممکن است اطلاعات ناقص دریافت شود. علت دریافت ناقص اطلاعات این است که تابع delay استفاده شده دقیق نیست و ممکن است که مقداری اختلاف با مقدار زمان موردنظر داشته باشد.

زمان بندی دریافت اطلاعات از سنسور:
سیگنالهایی که بارنگ سیاه مشخص شده اند از طرف MCU یا رزبری ارسال میشوند و بنام Host Signal مشخص شده اند. سیگنال هایی که با رنگ خاکستری مشخص شده اند سیگنال ارسالی از سنسور به MCU میباشد.

timing-diagram-dht11

برنامه راه اندازی:
الگوریتم راه اندازی و شماتیک این دو سنسور مشابه به هم بوده و در نتیجه از برنامه نوشته شده میتوان برای راه اندازی هر دو سنسور استفاده کرد. این برنامه را میتوانید در فایل های ضمیمه دریافت کنید. شما میتواند با تغییر متغییر ثابتی با نام DHTPIN پین دریافت اطلاعات از سنسور را تغییر دهید. البته بسته به انتخاب نوع شماره گذاری با توابع wiringPi عدد متغییر ثابت DHTPIN متفاوت خواهد بود.
در این مثال اگر از شماره گذاری wiringPi استفاده کنید باید باید مقدار DHTPIN برابر 7 و اگر از شماره گذاری مربوط به GPIO ها استفاده کنید عدد این متغییر 4 خواهد بود

اجرای برنامه:
این برنامه در هر یک ثانیه یک بار از سنسور اطلاعات دریافت میکند و در صفحه نمایش ،نشان میدهد. خروجی برنامه به شکل زیر است . همانطور که کفته شد در هنگامی که اطلاعات دریافت میشود، ممکن است در زمان بندی دریافت اطلاعات از سنسور رزبری دچار مشکل شود.بنابراین زمانی که در این برنامه با این مشکل روبرو میشود سیستم بروی صفحه حروف زیرا تایپ میکند.

dht22_steckplatine-709x1024

Raspberry Pi DHT11 Module
3.3v P1 ————————– VCC (V)
GND P6 ———————- GND (G)
GPIO4 P7 ———————– DATA (S)

dht11_c

 

********************************************
DHT11/DHT22 sensors
********************************************
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAXTIMINGS	85
#define DHTPIN		4
int dht11_dat[5] = { 0, 0, 0, 0, 0 };
void read_dht11_dat(){
	uint8_t laststate	= HIGH;
	uint8_t counter	= 0;
	uint8_t j= 0, i;
	float	f; /* fahrenheit */
dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;
/* pull pin down for 18 milliseconds */
pinMode( DHTPIN, OUTPUT );
digitalWrite( DHTPIN, LOW );
delay( 18 );
/* then pull it up for 40 microseconds */
digitalWrite( DHTPIN, HIGH );
delayMicroseconds( 40 );
/* prepare to read the pin */
pinMode( DHTPIN, INPUT );
/* detect change and read data */
for ( i = 0; i < MAXTIMINGS; i++ ){
counter = 0;
while ( digitalRead( DHTPIN ) == laststate ){
counter++;
delayMicroseconds( 1 );
if ( counter == 255 ){
break;}}
laststate = digitalRead( DHTPIN );
if ( counter == 255 )
break;
/* ignore first 3 transitions */
if ( (i >= 4) && (i % 2 == 0) ){
/* shove each bit into the storage bytes */
dht11_dat[j / 8] <<= 1;
if ( counter > 16 )
dht11_dat[j / 8] |= 1;
j++;	}}
/** check we read 40 bits (8bit x 5 ) + verify checksum in the last byte* print it out if data is good*/
if ( (j >= 40) &&(dht11_dat[4] == ( (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF) ) ){
f = dht11_dat[2] * 9. / 5. + 32;
printf( "Humidity = %d.%d %% Temperature = %d.%d *C (%.1f *F)\n",
dht11_dat[0], dht11_dat[1], dht11_dat[2], dht11_dat[3], f );}else  {
printf( "Data not good, skip\n" );}}
int main( void ){
printf( "Raspberry Pi wiringPi DHT11 Temperature test program\n" );
if ( wiringPiSetup() == -1 )
exit( 1 );
while ( 1 ){
read_dht11_dat();
delay( 1000 ); /* wait 1sec to refresh */}
	return(0);
}

نویسنده: میثم سعیدی      msimeysamsaeedi @ gmail.com

نوشته های مشابه

4 دیدگاه

  1. برای ارسال نقطه نظرات و سوالات خود از ایمیل نویسند استفاده کنید.وهمچنیین برای اطلاع از پروژه های در حال اجرا به صفحه انیستاگرام با آدرس : meysamsaeedi_raspberry مراجعه کنید.

  2. سلام خسته نباشید قسمت آموزش Raspberry عالی بود اگه لطف کنید یک پست آموزشی درباره ی توابع ارتباطی شبکه LAN در #C و Raspberry رو ارائه بدید،تشکر

  3. عرض سلام خدمت مهندس سعیدی
    عااااااااااااااااااااااااااااااااااااااااااااااالی بود
    خدا قوت

  4. سلام من اگه بخوام همین ماژول رو بصورت وایرلس (WIFI) وصل کنم به رزبری پای 3 چه چیزای دیگه لازم دارم؟

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا