ARDUINOAVRSTM32بسکامکدویژن

راه اندازی سنسور DHT22 و DHT11 با آردوینو – کدویژن – بسکام – STM32

5/5 - (79 امتیاز)

سنسورهای رطوبت و دما متعددی جهت اندازه گیری و سنجش آب و هوا تولید شده است که در این آموزش قصد داریم به یکی از پرکاربردترین آنها  یعنی سنسور رطوبت و دما دیجیتال DHT22  که با نام AM2302 نیز شناخته می شود بپردازیم .

ویژگی های سنسور رطوبت و دما DHT22 , DHT11

سنسور DHT22 از قبل عمل کالیبراسیون بر روی آن انجام شده است و نیاز به اجزای اضافی ندارد . بنابراین ما می توانیم براحتی سنسور DHT22 را راه اندازی کنیم و عملیات خواندن رطوبت نسبی و درجه حرارت را توسط سنسور DHT22 انجام دهیم  .

یکی از ویژگی های خوب سنسور DHT22 دقت اندازه گیری رطوبت و دما تا یک دهم اعشار می باشد ، تنها ایراد که می توان به آن اشاره نمود سرعت خواندن اطلاعات از سنسور می باشد که در سنسور DHT22 برابر با 0.5 هرتز یعنی هر دو ثانیه یک بار می باشد که البته نسبت به قیمت سنسور DHT22 نباید از این موضوع ایراد گرفت .

سنسور رطوبت و دما DHT دارای دو مدل می باشد . یک مدل DHT11 و دیگری DHT22 که نوع جدیدتر با مشخصات بهتر نسبت به نوع قدیمیتر خود یعنی DHT11 است . سنسور DHT22 نسخه گرانقیمت است و بدیهی است دارای مشخصات بهتر باشد. محدوده اندازه گیری دما از -40 ° C تا + 125 ° C با دقت + -0.5 درجه ، در حالی که در سنسور DHT11 از 0 درجه سانتی گراد تا 50 درجه سانتی گراد با دقت + -2 درجه است. همچنین سنسور DHT22 دارای رنج اندازه گیری رطوبت بهتر است، از 0 تا 100٪ با دقت 2الی5٪، در حالی که رطوبت DHT11 از 20 تا 80٪ با دقت 5٪ است.

DHT11 و DHT22 / AM2302 مقایسه مشخصات
DHT11 و DHT22 / AM2302 مقایسه مشخصات

اگر چه سنسور DHT22 / AM2302 دقیق تر است و در محدوده وسیعی از دما و رطوبت کار می کند؛ اما DHT11 نسبت به DHT22 سه مزیت بهتر دارد .  ارزان تر است ، ابعاد کوچکتر دارد و نرخ نمونه گیری بالاتری دارد . نرخ نمونه گیری در DHT11 یک هرتز است ، یعنی در هر ثانیه می توان یک بار اطلاعات سنسور را خواند ، در حالی که نرخ نمونه گیری DHT22 نیم هرتز است، یعنی هر دو ثانیه یک بار می توان اطلاعات سنسور را خواند .

نکته مفید هر دو سنسورها این است که سنسورهای DHT11 و DHT22 / AM2302 دارای پایه های مشابه هستند ، به این معنی که اگر شما پروژه خود را با یکی ساختید، می توانید آن را جدا کنید و از دیگری استفاده کنید . اما کدنویسی شما ممکن است کمی نیاز به تغییر داشته باشد . اما حداقل سیم کشی یا PCB مدار نیاز به تغییر ندارد .

برای کسب اطلاعات بیشتر می توانید به دیتاشیت سنسورهای DHT11 و DHT22 / AM2302 مراجعه کنید.

بررسی مدار داخلی سنسورهای DHT11 , DHT22 / AM2302

برای مشاهده مدار داخلی سنسورهای DH11 , DHT22  باید پوشش پلاستیکی سنسور را از هم جدا کرد . داخل جعبه پلاستیکی یک PCB کوچک است که بر روی آن یک سنسور رطوبت حساس و یک سنسور دمای NTC وجود دارد .

مدارداخلی سنسور DHT22 , DHT11
مدارداخلی سنسور DHT22 , DHT11

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

سنسور dht22
سنسور dht22

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

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

سنسور dht22
سنسور dht22

طرف دیگر PCB داخل سنسور یک آی سی 8 بیت با بسته بندی SOIC-14 وجود دارد . وظیفه این IC ، اندازه گیری و پردازش سیگنال آنالوگ با ضریب کالیبراسیون ذخیره شده ، سنسور رطوبت و NTC را انجام می دهد ، و در نهایت  مقادیر آنالوگ خوانده شده از سنسورها را به دیجیتال تبدیل می کند و مقادیر رطوبت و دما را از هم تفکیک کرده که ما می توانیم توسط پروتوکل یک سیمه 1WIRE این اطلاعات را بخوانیم .

خواندن رطوبت و دما  سنسور DHT11 و DHT22 / AM2302

سنسورهای DHT11، DHT22 / AM2302 از پروتکل یک سیمه 1WIRE غیر استاندارد و مخصوص به خود برای ارتباط استفاده می کنند. یعنی برای راه اندازی این سنسور نمی توان از کتابخانه های استاندارد یک سیمه کامپایلرهای کدویژن یا بسکام و آردوینو استفاده کرد . بنابراین جهت خواندن اطلاعات این سنسور باید کتابخانه جدا نوشته شود .

این سنسورها (معمولا همه سنسورهای 1 سیمه) دارای خروجی های open drain هستند، بنابراین پایه دیتا باید توسط مقاومتی حدود 5.1k  الی 10k به تغذیه پول آپ شود و تنها به پول آپ داخلی میکروکنترلر بسنده نکنید . این عمل باعث می شود هنگامی که خط دیتا در حالت بیکاری است ، وضعیت آن به HIGH یا منطق “1” تغییر کند همانند پروتکل i2c .

زمانی که تغذیه سنسور وصل می شود دو ثانیه طول می کشد تا سنسور DHT22 به حالت پایدار برسد . در این زمان سنسور DHT22 مقادیر رطوبت و دما را تست و ثبت می کند و بعد از سپری شدن این زمان به حالت SLEEP می رود .

زمانی که MCU یا میکرو کنترلر سیگنال START را بر روی خط دیتا ارسال کند ، ارتباط آغاز می شود . و سنسور DHT22 از حالت SLEEP خارج شده و به مد High-speed می رود و یک سیگنال پاسخ بر روی خط دیتا ارسال می کند .  پس از آن یک رشته  اطلاعات  40 بیتی که شامل مقادیر نسبی رطوبت و دما و CHECK SUM است را بر روی خط دیتا ارسال می کند . پس از پایان ، سنسور DHT22 به طور خودکار به حالت SLEEP می رود و در انتظار ارتباط بعدی می ماند . نمودار زمانی مربوطه به صورت زیر نشان داده شده است.

نمودار زمانی ارتباط سنسور DHT22
نمودار زمانی ارتباط سنسور DHT22

سیگنال شروع سنسور DHT22 / AM2302

خط دیتا در حالت بیکاری در حالت HIGH قرار دارد . زمانی که ارتباط بین MCU و سنسور DHT22 / AM2302 آغاز می شود ، MCU خط دیتا را در حدود 1 الی 10 میلی ثانیه در حالت LOW می برد . سپس MCU خط را به اندازه 20  ال 40 میکرو ثانیه در حالت HIGH می برد و منتظر پاسخ از سنسور DHT22 / AM2302 می ماند . 

سیگنال شروع سنسور DHT22 / AM2302
سیگنال شروع سنسور DHT22 / AM2302

سیگنال پاسخ سنسور DHT22 / AM2302

زمانی که سیگنال شروع به پایان رسید سنسور DHT22 / AM2302 خط دیتا را به مدت 80 میکرو ثانیه در حالت LOW نگه داشته و سپس خط دیتا را برای مدت زمان 80 میکرو ثانیه به حالت HIGH می برد . در این مدت زمان سنسور DHT22 / AM2302  درجه حرارت و رطوبت محیط را دوباره تست و اندازه گیری می کند ، و داده های نسبی را ثبت می کند و برای انتقال داده آماده می شود.

سیگنال پاسخ سنسور DHT22 / AM2302
سیگنال پاسخ سنسور DHT22 / AM2302

سیگنال دیتا (40bit) سنسور DHT22 / AM2302

هنگامی که سیگنال پاسخ به پایان می رسد ، سنسور DHT22 / AM2302 تعداد 40 بیت دیتا را  بر روی خط ارسال می کند . قبل از ارسال هر بیت ، سنسور DHT22 / AM2302 خط دیتا را به مدت 50 میکرو ثانیه در حالت LOW  قرار می دهد . بعد از آن مدت زمان طول پالس که در وضعیت HIGH قرار می گیرید نشان دهنده  وضعیت “1” یا “0” بودن بیت را مشخص می کند .

اگر خط دیتا برای مدت زمان 26 الی 28 میکرو ثانیه در وضعیت HIGH باشد ، به معنای بیت “0” است و اگر خط دیتا برای مدت زمان 70 میکرو ثانیه در وضعیت HIGH باشد ، به معنای بیت “1” می باشد . هنگامی که تمام 40 بیت منتقل می شود ، سنسور DHT22 / AM2302 خط دیتا را برای مدت زمان 50 میلی ثانیه در حالت LOW قرار می دهد . تا انتهای ارتباط را نشان دهد و به طور خودکار به حالت SLEEP وارد می شود .

سیگنال دیتا سنسور DHT22
سیگنال دیتا سنسور DHT22

تفکیک دما و رطوبت از داده های 40 بیتی سنسور DHT22 / AM2302

 40 بیت اطلاعات ، حاوی 16 بیت رطوبت ، 16 بیت دما و 8 بیت CHECK SUM  یا پریتی (ساده ترین شکل تشخیص خطا) که شروع با بیت باارزش (MSB) است . نمودار زمانی مربوطه به صورت زیر نشان داده شده است.

خواندن اطلاعات سنسور DHT22
خواندن اطلاعات سنسور DHT22

به عنوان مثال فرض کنید 40 بیت داده زیر از سنسور خوانده شده است و می خواهیم مقدار رطوبت و دما و تشخیص خطا را بررسی کنیم :

0010101011010000000100000010100100100000

همانطور که در بالا ذکر شد، 16 بیت اولیه نشان دهنده رطوبت است . 16 بیت بعدی نشان دهنده دما است و 8 بیت آخر نشان دهنده  CHECK SUM می باشد .

ابتدا باید مقدار پریتی یا CHECK SUM بررسی شود تا تشخیص بدهیم دیتا درست دریافت شده یا دارای خطا می باشد . قائده به این شکل است که اگر مجموع چهار بایت اول برابر با بایت آخر باشد ، دیتا درست می باشد . اما اگر مجموع چهار بایت اول با بایت CHECK SUM برابر نباشد ، دیتا درست دریافت نشده است .

00100000 =00101010+11010000+00010000+00101001

اگر نتیجه تساوی فوق درست باشد ، داده های دریافت شده معتبر می باشند . بنابراین می توانیم محاسبه رطوبت و دما را ادامه دهیم .

برای بدست آوردن مقدار رطوبت نسبی و دما ، فقط باید مقدار دودویی 16 بیتی(باینری) را به دهدهی (دسیمال) تبدیل کنیم .

658 = 0010101011010000

 265 = 0001000000101001

اما به یاد داشته باشید، این مقادیر 10 برابر بیشتر از مقادیر واقعی است. بنابراین، نتیجه نهایی باید بر 10 تقسیم شود . مقدار رطوبت همواره عددی مثبت بین 0 تا 100 می باشد ، اما  اگر با ارزشترین بیت از مقدار دما برابر با عدد “1” باشد ، نشانگر دمای زیر صفر می باشد و باید موقع نمایش دما با علامت منفی نمایش داده شود .

 265 = 1001000000101001

رطوبت  = RH 65.8٪

دما  = 26.9 درجه سانتی گراد

پایه های خروجی یا PINOUT سنسور DHT22 / AM2302 , DHT11

سنسورهای DHT11، DHT22 / AM2302 پایه های نسبتا مناسبی برای اتصال به بردبورد ، میکروکنترلر و PCB هستند . آنها دارای چهار پین می باشند :

DHT22/AM2302 Pinout
DHT22/AM2302 Pinout

VCC :  تغذیه برای سنسور را تامین می کند. اگر چه ولتاژ خروجی از 3.3 تا 5.5V است ، اما ولتاژ 5V توصیه می شود. اگر از منبع تغذیه 5 ولت استفاده شود ، شما می توانید طول سیم سنسور را تا 20 متر افزایش دهید . با این حال، با ولتاژ 3.3V ، طول کابل نباید بیشتر از 1 متر باشد. در غیر این صورت، افت ولتاژ خط منجر به اشتباه در اندازه گیری خواهد شد.

Data : برای ارتباط بین سنسور و میکروکنترلر استفاده می شود.

NC : بلا استفاده است .

GND : باید به زمین وصل شود .

راه اندازی سنسور DHT22 با آردوینو

اکنون که ما درک کاملی از کارکرد سنسورهای DHT داریم، می توانیم شروع به اتصال آن به Arduino کنیم !خوشبختانه، برای سنسور DHT22 / AM2302 به آردوینو اهمیت ندارد که پایه دیتا را به کدام یک از پایه های آردوینو متصل کنیم .پایه vcc سنسور DHT22 را با 5 ولت وصل کنید و زمین را به زمین متصل کنید. در نهایت، پین داده را به پین ​​دیجیتالی شماره 8 وصل کنید .

به یاد داشته باشید، همانگونه که قبلا در این آموزش توضیح داده شد، ما باید یک مقاومت 10KΩ بین VCC و خط داده قرار دهیم تا آن را برای ارتباط مناسب بین سنسور و MCU فراهم سازیم .

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

ابتدا فایل پیوست را دانلود کنید و دو فایل کتابخانه سنسور DHT22 را به آردوینو اضافه کنید .

آموزش نصب کتابخانه در نرم افزار آردوینو را مطالعه نمایید .

#include <DHT.h>
#define DHTPIN 8     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino

int chk;
float hum;  //Stores humidity value
float temp; //Stores temperature value

void setup()
{
  Serial.begin(9600);
  dht.begin();
}

void loop()
{
    delay(2000); 
    hum = dht.readHumidity();
    temp= dht.readTemperature();
    //Print temp and humidity values to serial monitor
    Serial.print("Humidity: ");
    Serial.print(hum);
    Serial.print(" %, Temp: ");
    Serial.print(temp);
    Serial.println(" Celsius");
}

راه اندازی سنسور DHT22 با کدویژن

جهت دانلود کتابخانه و سورس کد کامل راه اندازی سنسور رطوبت و دمای DHT22 با نرم افزار CODEVISION فایل پیوست را دانلود کنید .

#define DHT22_PIN          PINA.0
#define DHT22_DDR          DDRA.0
#define DHT22_PORT         PORTA.0

ابتدا فایل DHT22.h را باز کنید و چند خط کد فوق را تغییر داده و پاییه ای از میکرو کنترلر که می خواهید سنسور DHT22 را به آن متصل کنید را بنویسید .

#include <mega16.h>
#include <stdio.h>

#include "DHT22.h"

void main(void)
{
float temperature,humidity;
char str[10],temp[10],hum[10];


// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x67;

while (1)
      {
      
      if(dht22_read(&temperature,&humidity) == 0)
        {
        putsf("DHT22  ERROR");
        }
      else
        {                                                      
        ftoa(temperature,1,temp);                                         
        ftoa(humidity,1,hum);  
        sprintf(str,"Temp=%s , Hum=%s %",temp,hum);       
        puts(str); 
        putchar(13);
        putchar(10);      
        }
      
      delay_ms(5000);
      }
}

راه اندازی سنسور DHT22 , DHT11 با بسکام

در مثال زیر چون مقادیر رطوبت و دما اعشاری هستند ، دو متغییر با نام های hum , temp از نوع single در برنامه تعریف می کنیم . توسط تابع dht_read  عمل قرائت رطوبت و دما را انجام می دهیم . اگر خروجی این تابع عدد 0 را برگرداند یعنی عملیات خواندن سنسور dht با خطا مواجع شده یا اصلا سنسوری وجود ندارد . اما اگر خروجی تابع عدد 11 باشد یعنی سنسور استفاده شده dht11 و اگر خروجی تابع عدد 22 باشد یعنی سنسور استفاده شده dht22 می باشد .

در مثال زیر اگر خروجی تابع غیر از 0 باشد ، به ترتیب مقدار رطوبت را درون متغییر hum و مقدار دما را درون متغییر temp قرار می دهد . نوع سنسور نیز در انتها چاپ می شود . جهت دانلود کتابخانه و سورس کد کامل راه اندازی سنسور رطوبت و دمای DHT22 با نرم افزار bascom فایل پیوست را دانلود کنید .

$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 80
$swstack = 100
$framesize = 100
$baud = 9600

declare function dht_read( Dht_hum As Single , Dht_temp As Single) as byte


Dht_put Alias PortB.0                         'Sensor pins
Dht_get Alias PinB.0
Dht_io_set Alias DdrB.0

Dim Temperature As String * 6 , Humidity As String * 5
dim temp As Single , hum As Single , b as Byte


Do
 b=dht_read(hum,temp)
 if b=0 then
 print "error read sensor dht"
 else
   Humidity = Fusing(hum , "#.#") + "%"
   Temperature =Fusing(temp, "#.#") + "C"
   print "Temp=" ; Temperature;"    ";
   print "Hum=" ; Humidity
   print "type sensor : dht";str(b)
 end if
   wait 2
Loop
End

 

راه اندازی سنسور dht22 , dht11 با بسکام
راه اندازی سنسور dht22 , dht11 با بسکام

 

راه اندازی سنسور DHT22 , DHT11 با STM32

در این پروژه ما  هر دو ثانیه مقدار رطوبت و دما را از سنسور DHT22 می خوانیم و مقدار خوانده شده را بر روی پورت سریال USART1  ارسال کنیم .

ابتدا کتابخانه سنسور و کتابخانه کار با ورودی و خروجی ها و  رشته ها را به برنامه اضافه می کنیم .

#include "main.h"

#include <stdio.h>
#include <string.h>
#include "dht22.h"

در ادامه دو متغییر از نوع اعشاری برای مقادیر دما و رطوبت و یک آرایه برای تبدیل اعداد اعشاری به رشته و ارسال به پورت سریال یا lcd  به برنامه اضافه می کنیم .

char buffer[50]={0};
float Temperature = 0;
float Humidity = 0;

در حلقه اصلی برنامه هر دو ثانیه مقدار دما و رطوبت از سنسور dht22 خوانده شده و به پورت سریال ارسال می شود .

while (1)
{
HAL_Delay(2000);
switch (DHT22_Read (&Temperature,&Humidity))
{
case Response_Error:
	sprintf(buffer,"Sensor error response\r\n");
	HAL_UART_Transmit(&huart1,(uint8_t*)&buffer ,strlen(buffer),100);
	break;
case Read_OK:
	sprintf(buffer,"temp = %.1f C  hum = %.1f %%\r\n",Temperature,Humidity);
	HAL_UART_Transmit(&huart1,(uint8_t*)&buffer ,strlen(buffer),100);
	break;
case Checksum_Error:
	sprintf(buffer,"Checksum Error!\r\n");
	HAL_UART_Transmit(&huart1,(uint8_t*)&buffer ,strlen(buffer),100);
	break;
default:
	break;
}
}

نویسنده : حسین غیاثوند
خرید و دانلود در لحظه :
مثال و کتابخانه سنسور DHT11,DHT22 برای STM32
نوشته شده توسط توابع HAL
انجام کلیه تنظیمات STM32 توسط STM32CubeMX

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

مشترک شدن
اطلاع رسانی کن
guest
26 دیدگاه
قدیمی ترین
جدیدترین محبوب ترین
بازخورد داخلی
مشاهده همه نظرات