راه اندازی سنسور دما و رطوبت dht11
سنسور dht11 یه سنسور پر کاربرد برای اندازه گیری دما و رطوبت محیط هستش که چند وقتی هستش بین مهندسان ایرانی جا افتاده و به دلیل سهولت در استفاده و قیمت پایین اون در پروژه های زیادی مورد استفاده قرار میگیره.
تو این قسمت آموزش کار با سنسور dht11تهیه شده و کتابخونه ی آن را برای کدویژن مینویسیم.
این سنسور برای اندازه گیری دما و رطوبت در کارهای معمولی،پرکاربرد میباشد.
در شکل فوق نحوه ی اتصالات آنرا مشاهده میکنیم. برای ارتباط با میکرو تنها یک پین لازم دارد.
عملکرد سنسور به این صورت میباشد که برای شروع ارتباط با آن ابتدا باید خط DATAرا به مدت 02میلی ثانیه صفر کنیم تا سنسور متوجه درخواست شود سپس پین را به حالت یک منطقی تبدیل میکنیم و منتظر دریافت پاسخ از سنسور میمانیم.
سنسور در پاسخ، پنج بایت یعنی 02بیت برای ما ارسال میکند.
بایت اول مقدار رطوبت بوده، بایت دوم مقدارش صفر میباشد، بایت سوم مقدار دما بوده، بایت چهارم مقدارش صفر است، بایت پنجم مقدار مجموع چهار بایت قبلی میباشد که بوسیله آن میتوانیم از صحت دیتای دریافتی اطمینان داشته باشیم.
سنسور قبل از ارسال هر بیت خط را به مدت 40میکروثانیه صفر میکند.سپس خط یک میشود.
اگر مدت زمانی که خط یک میماند 00 میکروثانیه باشد مقدار بیت ارسالی صفر است و اگر خط به مدت 02 میکرو ثانیه یک باشد یعنی مقدار بیت دریافتی یک منطقی است.
از قوانین فوق استفاده میکنیم و کتابخانه ی سنسور را در بوسیله ی سه تابع مینویسیم.
تابع درخواست ()Request :
1 2 3 4 5 6 |
void Request(void)} DDRD |= (1<<6); PORTD &= ~(1<<6); delay_ms(20); PORTD |= (1<<6); { |
خط دیتا را به پین 6پورت Dزدیم در مگا32
ابتدا پین رو خروجی کردیم، سپس خط رو به مدت 20 میلی ثانیه صفر
کردیم تا درخواست مشاهده شود. سپس خط رو یک کردیم.
تابع دریافت جواب سنسور:
1 2 3 4 5 6 |
void Response)({ DDRD &= ~(1<<6); while(PIND & (1<<6)); while((PIND & (1<<6))==0); while(PIND & (1<<6)); } |
برای دریافت جواب ابتدا پین را ورودی کردیم که بتوانیم آنرا بخوانیم.
در خط دو منتظر میمانیم تا سنسور پین را صفر کند .
سیستم به مدت 20 میکروثانیه در خط سوم منتظر میماند، سپس سنسور پین را یک میکند و به مدت 20 میکرو ثانیه در خط چهارم توقف میکنیم.
در این هنگام سنسور شروع به ارسال 4بایت میکند که بوسیله تابع زیر آنها را به راحتی دریافت میکنیم.
تابع دریافت جواب سنسور:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
unsigned char Receive_data() { while(cnt_bit<8){ cnt_bit++; while((PIND & (1<<6))==0); delay_us(30); if(PIND & (1<<6)){ c=(c<<1)|(0x01); } else{ c=c<<1; } while(PIND & (1<<6)); } cnt_bit=0; return c; } |
متغیر cnt_bitاز قبل تعریف شده و شمارنده تعداد بیت های ارسالی در هر بایت هست.
برنامه ابتدا توقف میکند تا سنسور شروع به ارسال مقدار یک کند، سپس به مقدار 22میکروثانیه تاخیر ایجاد میشود،
اگر بعد از 22میکرو ثانیه باز مقدار یک رو خط شناسایی شود، یعنی بیت دریافتی 1هست،
در غیر این صورت صفر خواهد بود(بر اساس آنچه در ابتدا از عملکرد سنسور گفته شد).
در نهایت بعد از 0مرتبه دریافت بیت ها، یک بایت کامل میشود و به خروجی تابع میرود. نحوه و ترتیب استفاده از تئابع به صورت زیر است:
1 2 3 4 5 6 7 |
Request(); Response(); H= Receive_data(); H1= Receive_data(); T= Receive_data(); T1= Receive_data(); E= Receive_data(); |
مقادیر Hو Tرطوبت و دما خواهند بود که میتوانیم در طول برنامه از آن ها استفاده کنیم.
نکته: خط dataکه از میکرو به سنسور متصل است باید توسط یک مقاومت 12کیلو پول آپ شود.
نکته: حداکثر فرکانس خواندن مقادیر سنسور 1هرتز است.
نکته: اگر جمع 0بایت ابتدایی که دریافت میشود با مقدار Eبرابر نباشد یعنی مقدار دریافتی صحیح نیست.
با استفاده از توابع فوق میتوانید توابع هارا برای هر میکرویی بازنویسی کنید.
این آموزش توسط جناب آقای خلیل آقایی توسط گروه گارد منتشر شده است.

درباره مهدی
مهدی طالبی هستم ،مدرس وبسایت هشت هسته.. تو زمینه الکترونیک ، بعضی وقت ها هم توی علوم کامپیوتری و علوم دیگه براتون مطالب مفید میذارم.برای دیدن اطلاعات بیشتر از من اینجا کلیک کنید.
نوشته های بیشتر از مهدی
دیدگاهتان را بنویسید