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


دوشنبه، 2، آوریل، 2018 در ساعت 08:31


geektab.ir

سنسور DHT11 یکی از نمونه های ارزان قیمت، با دقت متوسط و دومنظوره برای اندازگیری دما و رطوبت در بازار است، این سنسور به راحتی میتواند با انواع میکروکنترلر از جمله AVR راه اندازی شود

از مشخصات این سنسور که در دیتاشبت آن نیز موجود است شروع میکنیم:

ولتاژ مورد نیاز: 3.5V ~ 5.5V

جریان مصرفی: 0.3A

بازه دمای قابل اندازی گیری: 0 تا 50 درجه سانتی گراد با دقت 2 درجه

بازه رطوبت قابل اندازی گیری: 10 تا 90 درصد با دقت 5 درصد

بد نیست یک نگاهی هم به پایه های این سنسور بندازیم:

pin dht11

1- این پایه به مثبت منبع تغذیه وصل میشود

2- این پایه به میکروی ما متصل میشه و همچین با یه مقاومت 4.7k به منبع تغذیه ما متصل میشود

3- به هیچ جایی متصل نمیشود! (به منظور پایه نگه دارنده استفاده میشود)

4- به منفی منبع تغذیه متصل میشود

کدنویسی و راه اندازی DHT11

اگر دیتاشیت این سنسور مطالعه کنید(قطعا که حالشو ندارید!!!!) طرز کار کلی این سنسور به این صورت است، ما پایه دیتا را به اندازه 18 میلی ثانیه منفی میکنیم، بعد منتظر میمونیم و سنسور به ما میگه متوجه شدم حالا اطلاعاتی که خواستی رو بگیر و ما 5 بایت اطلاعات دریافت میکنیم! زمان مثبت و منفی شدن (ولتاژ بالا و پایین) بیت DATA، صفر و یک بودن بیت مورد نظر را نشان میدهد.

  • نکته اول: من در این آموزش از میکروکنتلر ATmega8A استفاده کردم
  • نکته دوم: از پورت D و پین صفرم این میکروکنترلر برای دریافت اطلاعات استفاده کردم
ارسال درخواست

دریافت پیغام “متوجه شدم”

  • نکته اول: ما باید تا یه زمان خاصی منتظر تاییدیه دریافت درخواست بشیم، تاییده ارسال نشه برنامه تا بینهایت توی حلقه گیر کند.
  • نکته دوم: تاییدیه با یک بار ولتاژ پایین و بالا مشخص میشود ینی حدود 80 میکروثانیه پین دیتای ما به حالت ولتاژ صفر میرود
  • نکته سوم: بعد از دریافت تاییدیه سنسور شروع به ارسال اطلاعات دما و رطوبت میکند
دریافت اطلاعات

این قطعه کد نکته خاصی نداره بجز اینکه دریافت اطلاعات از طریق سنسور به این صورت است که سنسور پین مارو به اندازه 50 میکروثانیه صفر میکند بعد به اندازه 26-28 میکروثانیه (بیت 0) یا 70 میکروثانیه (بیت 1) برابر ولتاژ بالا قرار میدهد! چون این زمان تقربیه ما از حلقه while استفاده کردیم، اگر یه کم برنامه رو تریس کنید متوجه عملکرد الگوریتم میشد.

نتیجه نهایی

dht11

dht11

سورس برنامه راه اندازی سنسور DHT11 با AVR

گیت هاب

avatar
13 Comment threads
13 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
11 Comment authors
آریاعلیرضاSADEGHمرصادarmin Recent comment authors
آریا
آریا

ممنون از آموزش خوبتون

علیرضا
علیرضا

بسیار کاربردی و به زبان ساده نوشتید . ممنون بابت زحمتی که رایگان در اختیار عموم قرار دادین.

SADEGH
SADEGH

سلام. از کدتون استفاده کردم البته من از پورت B.0 اتمگا8 استفاده میکنم(DDRD و PORTD را به DDRB و PORTB تغییر دادم). ولی در lcd هیچ عددی حتی صفر چاپ نمیشه جلوی H: و T:
سنسورمم اصلا اشتباه وصل نکردم. از دیجیکالا هم خریدم بعیده سوخته باشه.
راهی به ذهنتون میرسه کمکم کنین؟

مرصاد
مرصاد

سلام ممنون از مطلب عالیت
میخواستم بدونم کتابخونه هایی که معرفی شده تو برنامه چی هست؟

Anonymous
Anonymous

سلام
در پروتئوس و روی بردبورد با mega16 انجام دادم و کار نکرد

armin
armin

سلام متشکر از مطالب مفیدتان چند سوال داشتم یک اینکه موقع کاپایل با اروری مربوط به نشناختن سمبول bit_count روبرو می شوم علت چه است باید چه بکنم ارور از بین برود و مقدار دما و رطوبت در کدام متغیر میرود که نمایش بدهم

m
m

سلام . تو پروتئوس شبیه سازی کردم ولی جواب نمیگیرم!!چرا؟ این هم کدم هست : /***************************************************** AVR Core Clock frequency: 8.000000 MHz *****************************************************/ // add header file #include #include #include // convert bit to number #include #include #include //#include // count bit unsigned char bit_count = 0; // feedback count bit return unsigned char c = 0; // temperature and humidity value unsigned char i_rh, d_rh, i_temp, d_temp, check; // loop count unsigned char cl = 0; //***** start methods *****// void request(void) { // DDRB.6 = 1; DDRD |= (1<<0); // PORTD.6 = 0; PORTD &= ~(1<<0); // delay_ms(18);… Read more »

p
p

حتما باید از پایه rxd استفاده کنیم؟ یعنی باید از usart & uart استفاده کنیم؟

p
p

سلام
خسته نباشید
هر کدوم از این متغیرها چی هستن؟ و هر کدوم یه بایت از اطلاعات دریافتی هستند؟
i_rh = recive();
d_rh = recive();
i_temp = recive();
d_temp = recive();
check = recive();
و تابع itoa چی هست؟

محمد مرصاد
محمد مرصاد

ممنون از اشتراک این مطلب مفیدتون

حسین
حسین

ممنون بابت پاسخ گویی،

من انجام دادم روی پروتئوس درست کار میکنه ولی در بردم دمارو 0 درجه نشون میده مشکل از چی میتون باشه؟

حسین
حسین

با عرض سلام و خسته نباشید میشه یه توضیحی در مورد کد بدین DDRD |= (1<<0);

PORTD &= ~(1<<0); این دقیقا چیکار میکنه ؟؟

PORTD |= (1<<0); همچنین این

منصور
منصور

سلام . مرسی که هستی
یه سوال . قدار دما و رطوبت رو کجا میریزه؟؟ تو کدوم متغییر؟؟ که بخوام تغییرات بهش بدم . و یا مثلا set point درست کنم