پروژه های AVR, پروژه‌ها

پروژه راه اندازی سنسور دما و رطوبت DHT22 با استفاده از مجموعه آموزشی AVR WIZARD توسط برد پلاریس به زبان C

راه-انداری-سنسور-DHT22-باAVR

فهرست مطالب

هدف از این آموزش راه اندازی سنسور DHT22 و نمایش مقادیر دما و رطوبت بر روی LCD می باشد.

قطعات مورد نیاز:

سنسور DHT22 با توجه به برگه اطلاعاتی خود ، قادر به اندازه گیری رطوبت نسبی 0 تا 100٪ با رزولوشن 0.1 و درجه حرارت از 40- تا 125 درجه سانتیگراد است. دقت سنسور DHT22 برای رطوبت + 2 / و برای دما + / 0.3 می باشد.

شکل 1. سنسور DHT22

این سنسور از یک بخش سنجش رطوبت ، یک سنسور دمای NTC  یا ( ترمیستور ) و یک IC در قسمت پشتی سنسور تشکیل شده است. قسمت سنجش رطوبت که برای اندازه گیری رطوبت استفاده می شود دارای دو الکترود با لایه نگهدارنده رطوبت (معمولاً یک پلیمر پلاستیکی،نمکی یا رسانا) بین آنها می باشد. با جذب بخار آب توسط لایه نگهدارنده رطوبت یون‌ها  آزاد می شوند ، که به نوبه خود باعث افزایش هدایت بین الکترودها می شود. تغییر مقاومت بین دو الکترود متناسب با رطوبت نسبی است. رطوبت نسبی بالاتر مقاومت بین الکترودها را کاهش می دهد، در حالی که رطوبت نسبی پایین مقاومت بین الکترودها را افزایش می‌دهد.

شکل 2. اجزای سنسور رطوبت

علاوه بر این ، سنسور DHT22 برای اندازه گیری دما از یک سنسور دما یا NTC تشکیل شده اند. ترمیستور مقاومت حرارتی است – مقاومتی که مقاومت خود را با دما تغییر می دهد. از نظر فنی ، همه مقاومت ها ترمیستور هستند – مقاومت آنها کمی با درجه حرارت تغییر می کند – این تغییر معمولاً بسیار کوچک و اندازه گیری آن دشوار است.

ترمیستورها به گونه ای ساخته شده اند که مقاومت آنها با درجه حرارت به شدت تغییر می کند به طوری که می تواند 100 درجه یا بیشتر از تغییر در هر درجه باشد! اصطلاح NTC به معنای “ضریب دمای منفی” است ، بدین معنی که با افزایش دما مقاومت کاهش می یابد.

نحوه اتصال ماژول DHT22 به برد SENSOR SHIELD مجموعه آموزشی AVR WIZARD

در برد شیلد سنسور موسوم به  SENSOR SHIELD سوکت ماژول DHT22 بر روی برد موجود بوده و کاربر می تواند به راحتی شروع به کدنویسی کند.

شکل 3.قرراگیری ماژول DHT22 روی برد SENSOR SHIELD

نحوه برنامه نویسی و خواندن مقادیر دما و رطوبت از سنسور DHT22

به دلیل پروتکل ارتباطی تک سیم “single-bus” سنسور DHT22، به نام تک اتوبوس، می‌توانید خروجی ماژول را به هر پین دیجیتال میکروکنترلر وصل کنید.

برای شروع ، ابتدا میکروکنترلر باید برای درخواست داده ها ی رطوبت و دما سیگنال شروع را را ارسال کند.بدین صورت که منطق 0 ( LOW ) برای حداقل 500 میکرو ثانیه و به دنبال آن منطق 1 ( HIGH ). سپس DHT22 باید با  پایین کشیدن  ( LOW ) باس داده برای 80 میکروثانیه به میکروکنترلر پاسخ دهد و سپس باس داده را قبل از آنکه دوباره (LOW) کند ، برای 80 میکرو ثانیه دیگر در سطح لاجیک 1 ( HIGH ) نگه دارد.

ابتدا  مقادیر رطوبت و به دنبال آن مقادیر دما را ارسال می کند. هر دو داده 16 بیتی هستند ، اما 8 بیت ( 1 بایت ) به طور همزمان ارسال می شوند. MSB مهمترین بیت در ابتدا ارسال می شود.  MSB در بایت درجه حرارت بیت نشانه است. اگر این بیت 1 باشد ، درجه حرارت منفی است. در غیر این صورت درجه حرارت مثبت است.

منطق 1، یک پالس LOW  به طول 50 میکروثانیه که به دنبال آن یک پالس HIGH به طول 70 میکروثانیه است. در همین حال ، منطق 0 یک پالس LOW  به طول 50 میکروثانیه که به دنبال آن یک پالس HIGH به طول 26 میکروثانیه است. نمودار زمان بندی در زیر نشان داده شده است:

سپس توجه داشته باشید که طول واقعی پالس ممکن است دقیقاً مقادیری نباشد که اینجا گفته شد. در واقع ، دیتاشیت می گوید که LOW PULSE در هر دو منطق 0 و 1 ( 50 ما ) بین 48 تا 55 است. علاوه بر این ،در منطق 1 HIGH PULSE 68 تا 75 بوده و در منطق 0 HIGH PULSE بین 22 تا 30 می باشد.

سنسور پس از ارسال دو بایت برای رطوبت و دو بایت برای دما ، قبل از HIGH کردن باس داده ، انتقال را با یک بایت parity خاتمه می دهد. بایت parity فقط مجموع چهار بایت داده است:

حال  با یک محاسبات ریاضی ، یک انتقال تقریباً 5 میلی ثانیه طول می کشد. با این وجود توصیه می شود که به دلیل ماهیت سنسورهای مورد استفاده حداقل بین هر خواندن دیتا 2 ثانیه منتظر بمانید. بنابراین ، DHT22 برای قرائت دمای سریع توصیه نمی شود.

حال پس از اضافه کردن کتابخانه راه انداز DHT22.h در ابتدای برنامه که بر اساس توضیحات بالا نوشته شده است ، مقادیر دما ورطوبت را بر روی LCD نمایش می دهیم:

				
					 
#include <mega16a.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <delay.h>
#include <alcd.h>
#include "DHT22.h"
// Declare your global variables here
 
void main(void)
{
float temperature,humidity;
char str[10],temp[10],hum[10];
lcd_init(16);
// Declare your local variables here
 
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
 
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
 
// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRC=(1<<DDC7) | (1<<DDC6) | (1<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
 
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=(0<<DDD7) | (0<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
lcd_init(16);
lcd_putsf( "   HI Wellcom   " ) ;
lcd_putsf( "TO REDRONIC.COM" ) ;
delay_ms(2000);
lcd_clear();
// Global enable interrupts
#asm("sei")
while (1)
      {           
        lcd_putsf("www.redronic.com");
        if(dht22_read(&temperature,&humidity) == -40) 
          {
          lcd_putsf("DHT22  ERROR");
          }
       else     
          {
            ftoa(temperature,1,temp);                 
            ftoa(humidity,1,hum); 
            lcd_gotoxy(0,1); 
            sprintf(str,"Tmp=%sHum=%s %",temp,hum);      // cast temprature and humidity value to char
           // lcd_clear();                                                      
            //lcd_gotoxy(0,0); 
            lcd_puts(str);       
          }
      if(temperature>38)           //if temp goes higher than 38 the buzzer and relay will be on
          {
           PORTC.7=1;   
            PORTC.6=1;
            PORTD.5= 1;
          }  
          else
          { 
            PORTC.7=0; 
            PORTC.6=0;
            PORTD.5= 0;
          }   
           if(humidity>50)            //if humidity goes higher than 50 the buzzer and relay will be on
          {
           PORTC.7=1;
            PORTC.5=1; 
            PORTB.5= 1;
          }  
          else
          { 
             PORTC.7=0;  
             PORTC.5=0; 
             PORTB.5= 0;
          }           
        delay_ms(2000);  
      }        }
				
			

خروجی برنامه

نظرتان را درباره این مقاله بگویید 8 نظر

پروژه راه اندازی سنسور دما و رطوبت DHT22 با استفاده از مجموعه آموزشی AVR WIZARD توسط برد پلاریس به زبان C

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

1 دیدگاه در “پروژه راه اندازی سنسور دما و رطوبت DHT22 با استفاده از مجموعه آموزشی AVR WIZARD توسط برد پلاریس به زبان C

  1. ساره گفت:

    سلام طلوع غروب مصنوعی اموزشی دارید؟

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

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