
راه اندازی DHT11
در پست های قبلی با مالتی پلکسر و دی مالتی پلکسر آشنا شدیم توی این پست به صورت عملی سعی می کنیم که تعدادی dht11 رو با استفاده از دی مالتی پلکسر به میکرو متصل کنیم
با توجه به اینکه پست جنبه آموزشی دارد تعداد چهار عدد سنسور به مالتی پلکسر وصل خواهد شد بنابراین شما می توانید بسته به نیاز خودتون و همینطور با در نظر گرفتن تعداد خروجی های مالتی پلکسر تعداد دلخواه سنسور خودتون رو انتخاب کنید و وصل کنید
پروتکل ارتباطی DHT11:
ابتدا نیاز است که با پروتکل ارتباطی dht11 اشنا بشید
dht11 چهار پایه دارد که پایه اول VCC ، پایه دوم همان پین DATA و پایه چهارم هم GND می باشد پایه سوم به جایی وصل نخواهد شد
اما ارتباط ما با DHT11 از طریق پایه دوم یعنی DATA خواهد بود برای این سنسور از پروتکل تک سیمه استفاده شده است و اگر به دیتاشیت مراجعه کنید نوع ارتباط دو طرفه می باشد
یعنی میکرو کنترلر یا میزبان ابتدا پالس هایی برای اماده کردن سنسور می فرستد سنسور این پالس ها را دریافت کرده و دیتا را آماده کرده و سپس از طریق همین سیم ارسال می کند یعنی ما توسط یک سیم هم دیتا می فرستیم و هم دریافت می کنیم بنابراین ارتباط ما دو طرفه می باشد خوب مسلما ما نیاز به دی مالتی پلکسر با ورودی و خروجی مشترک داریم
انتخاب مالتی پلکسر مناسب:
مالتی پلکسر ها و دی مالتی پلکسر ها می توانند فقط خروجی و یا هر دو یعنی ورودی و خروجی باشند بنابراین در انتخاب دی مالتی پلکسر باید به این نکته توجه کنیم که حتما از مالتی پلکسر ها یا دی مالتی پلکسر های ورودی خروجی مشترک استفاده کنیم اگر پایه خروجی مشترک باشد هم می توان به عنوان مالتی پلکسر و هم به عنوان دی مالتی پلکسر از آن استفاده نمود
معرفی مالتی پلکسر ۷۴HC4051:
آی سی ۷۴HC4051 و ۷۴HC4067 هر دو مالتی پلکسر یا دی مالتی پلکسر با ورودی و خروجی مشترک هستند مالتی پلکسر ۷۴HC4051 یک ماتی پلکسر سه به هشت و مالتی پلکسر ۷۴HC4067 یک مالتی پلکسر ۴ به ۱۶ می باشد شما می توانید برای ۷۴HC4051 تعداد هشت سنسور وصل کنید و توسط چهار پایه که به میکرو کنترلر وصل می شوند عمل خواندن را انجام دهید و همینطور می توانید به مالتی پلکسر ۷۴HC4067 تعداد ۱۶ تا سنسور وصل کنید و توسط ۵ پایه عمل کنترل را انجام دهید همچنین با استفاده تعداد بیشتر از این مالتی پلکسر ها و با در نظر گرفتن پایه های enable انها می توانید سنسور های بیشتر از ۱۶ عدد را نیز به مالتی پلکسر وصل کرده و عمل کنترل را انجام دهید
خوب در این پروژه ما از مالتی پلکسر ۷۴Hc4051 استفاده می کنیم بهتر است سری به دیتاشیت ای سی زده و با پایه های مالتی پلکسر آشنا شویم.
ولتاژ کاری ۷۴HC4051:
ولتاژ کاری این مالتی پلکسر ۴٫۵ تا ۵٫۵ ولت می باشد و همینطور کمترین ولتاژ سنس پایه های ورودی خروجی ۲ و بیشترین آن ۶ ولت می تواند باشد.
شرح پایه ها:
همانطور که می بینید پایه های A0 تا A7 کانال ورودی و خروجی هستند پس یعنی پایه های دیتا سنسور ها را باید به این پایه ها وصل کنیم و همینطور پایه A هم تک ورودی و خروجی مشترک هست که با آدرسی دهی توسط پایه های S0 تا S2 می توانیم پایه A را به هر یک از کانال ورودی و خروجی وصل کنیم اگر بر فرض مثال پایه های سلکتور را S0 تا S2 را با مقدار صفر پیکره بندی کنیم پایه A به پایه A0 متصل شده و در نتیجه سنسوری که به پایه A0 وصل هست آماده دریافت داده است و اگر مقدار سلکتور را با عدد ۲ مقدار دهی کنید پایه A به پایه A2 وصل شده و اینبار می توانید مقدار سنسور سوم را بخوانید و همینطور تا خواندن هشتمین سنسور ادامه خواهید داد.
مالتی پلکسر ۷۴hc4051 در پکیجاهای مختلفی تولید می شود که مهمترین آنها پکیج dip و پکیج smd می باشد.
البته در این پروژه از پکیج Smd و برای راحتی کار از ماژول آن استفاده شده است.
در ادامه مثالی با همین مالتی پلکسر برای خواندن مقدار دما و رطوبت چهار سنسور dht11 آورده می شود
کدها هم به زبان بیسیک و هم به زبان سی گذاشته می شوند که در ادامه می توانید ببینید
شماتیک پروژه در محیط پروتیوس:
ال سی دی مورد استفاده در این پروژه از نوع ۲X20 می باشد شما می توانید از ال سی دهای دیگری نظیر ۱۶X2 استفاده کرده که در این صورت حتما باید کد ها را متناظر با نوع ال سی دی تغییر دهید.
کد های بیسیک و کدویژن:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
'****************************************************************************** ' ---------------------- WWW.MCULIBRARY.IR ----------------------- * '****************************************************************************** ' Title : DHT11 With MULTIPLEXER(74HC4051) * ' Version : -- * ' Last Updated : 2020/11/07 --- 1399/08/17 * ' Compiler : Bascom-Avr * ' Author : Mohammad * ' Telegram : @MCULIBRARYIR * '****************************************************************************** $regfile = "m8def.dat" $crystal = 8000000 config portc=output config portb=OUTPUT config portd=OUTPUT Config Lcd = 20 * 2 Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.0 Cursor Off Cls '////////////////////////////////////////// Declare Sub Get_th(t As Byte , H As Byte) Dht_put Alias Portd.6 Dht_get Alias Pind.6 Dht_io_set Alias Ddrd.6 '////////////////////////////////////////// Dim T As Byte Dim H As Byte Dim Crc As Byte Dim Mybyte As Byte Dim Sensor_data As String * 40 Dim Tmp_str8 As String * 8 Dim Count As Byte dim str_1 as string *21 dim integral_h as byte,integral_t as byte dim i as byte, _start as byte dim sensor_t(4) as byte,sensor_h(4) as byte dim sensor2_t as byte,sensor2_h as byte dim sensor3_t as byte,sensor3_h as byte dim sensor4_t as byte,sensor4_h as byte '////////////////////////////////////////// Home lcd "DHT11 With Multiplex" lowerline lcd " WWW.MCULIBRARY.IR" waitms 2000 cls Set Dht_io_set Set Dht_put i=0 _start=2 Do for i=1 to 4 step 1 PORTC=i-1 t=0:h=0 Get_th t , H sensor_t(i)=t sensor_h(i)=h waitms 10 next if _start=0 then cls locate 1,1 lcd "T=";sensor_t(1);",H=";sensor_h(1) locate 1,11 lcd "T=";sensor_t(2);",H=";sensor_h(2) locate 2,1 lcd "T=";sensor_t(3);",H=";sensor_h(3) locate 2,11 lcd "T=";sensor_t(4);",H=";sensor_h(4) endif waitms 1500 if _start>0 then decr _start Loop end '//////////////////////////////////////////////////////////////////////////////// '// sub get_th... '//////////////////////////////////////////////////////////////////////////////// Sub Get_th(t As Byte , H As Byte) Count = 0 Sensor_data = "" Set Dht_io_set Reset Dht_put Waitms 25 Set Dht_put Waitus 40 Reset Dht_io_set Waitus 40 If Dht_get = 1 Then H = 1 Exit Sub End If Waitus 80 If Dht_get = 0 Then H = 2 Exit Sub End If While Dht_get = 1 : Wend Do While Dht_get = 0 : Wend Waitus 30 If Dht_get = 1 Then Sensor_data = Sensor_data + "1" While Dht_get = 1 : Wend Else Sensor_data = Sensor_data + "0" End If Incr Count Loop Until Count = 40 Set Dht_io_set Set Dht_put Tmp_str8 = Left(sensor_data , 8) H = Binval(tmp_str8) Tmp_str8 = Mid(sensor_data , 17 , 8) T = Binval(tmp_str8) Tmp_str8 = Mid(sensor_data , 9 , 8) integral_h= Binval(tmp_str8) Tmp_str8 = Mid(sensor_data , 25 , 8) integral_t= Binval(tmp_str8) Tmp_str8 = Right(sensor_data , 8) Crc = Binval(tmp_str8) Mybyte = T + H Mybyte=Mybyte+integral_h Mybyte=Mybyte+integral_t If Mybyte <> Crc Then t=231 H = 201 End If End Sub |
کد کدویژن:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
/****************************************************************************** ' ---------------------- WWW.MCULIBRARY.IR ----------------------- * '****************************************************************************** ' Title : DHT11 With MULTIPLEXER(74HC4051) * ' Version : -- * ' Last Updated : 2020/11/07 --- 1399/08/17 * ' Compiler : CodeVision 3.14 * ' Author : Mohammad * ' Telegram : @MCULIBRARYIR * '****************************************************************************** ' Chip type : ATmega8 * ' Program type : Application * ' AVR Core Clock frequency : 8.000000 MHz * ' Memory model : Small * ' External RAM size : 0 * ' Data Stack size : 256 * *******************************************************************************/ #include <mega8.h> #include <alcd.h> #include <delay.h> #include <string.h> #include <stdlib.h> //////////////////////////////////////////// void Get_th(); #define Dht_put PORTD.6 #define Dht_get PIND.6 #define Dht_io_set DDRD.6 //////////////////////////////////////////// unsigned char T; unsigned char H; unsigned char Crc; unsigned char Mybyte; unsigned char Sensor_data[40]; unsigned char Tmp_str8[8]; unsigned char Count; unsigned char str_lcd[20]; unsigned char integral_h,integral_t; unsigned char i, _start; unsigned char sensor_t[4],sensor_h[4]; //////////////////////////////////////////// void main(void) { DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0); PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); DDRC=(1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0); PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0); PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTB Bit 0 // RD - PORTB Bit 1 // EN - PORTB Bit 2 // D4 - PORTB Bit 4 // D5 - PORTB Bit 5 // D6 - PORTB Bit 6 // D7 - PORTB Bit 7 // Characters/line: 20 lcd_init(20); lcd_clear(); //////////////////////////////////////////// lcd_gotoxy(0,0); lcd_putsf("DHT11 With Multiplex"); lcd_gotoxy(0,1); lcd_putsf(" WWW.MCULIBRARY.IR"); delay_ms(2000); lcd_clear(); Dht_io_set=1; Dht_put=1; i=0; _start=2; while(1){ for(i=0;i<4;i++){ PORTC=i; Get_th(); sensor_t[i]=T; sensor_h[i]=H; delay_ms(20); } if(_start==0){ lcd_clear(); for(i=0;i<2;i++){ strcpy(str_lcd,"T="); itoa(sensor_t[2*i],Tmp_str8); strcat(str_lcd,Tmp_str8); strcat(str_lcd,",H="); itoa(sensor_h[2*i],Tmp_str8); strcat(str_lcd,Tmp_str8); lcd_gotoxy(0,i); lcd_puts(str_lcd); strcpy(str_lcd,"T="); itoa(sensor_t[(2*i)+1],Tmp_str8); strcat(str_lcd,Tmp_str8); strcat(str_lcd,",H="); itoa(sensor_h[(2*i)+1],Tmp_str8); strcat(str_lcd,Tmp_str8); lcd_gotoxy(11,i); lcd_puts(str_lcd); } } delay_ms(1500); if(_start>0) _start--; } } ////////////////////////////////////////////////////////////////////////////////// // sub get_th... ////////////////////////////////////////////////////////////////////////////////// void Get_th(){ unsigned char i2; Count = 0; strcpy(Sensor_data,""); Dht_io_set=1; Dht_put=0; delay_ms(25); Dht_put=1; delay_us(40); Dht_io_set=0; delay_us(40); if(Dht_get == 1){ H = 1; return; } delay_us(80); if(Dht_get == 0){ H = 5; return; } while(Dht_get == 1); while(Count < 40){ while(Dht_get == 0); delay_us(30); if(Dht_get == 1){ Sensor_data[Count] = 49; while(Dht_get == 1); }else{ Sensor_data[Count] = 48; } Count++; } Dht_io_set=1; Dht_put=1; H=0; for(i2=0;i2<8;i2++){ H|=((Sensor_data[i2]-48)<<(7-i2)); } T=0; for(i2=16;i2<24;i2++){ T|=(Sensor_data[i2]-48)<<(23-i2); } integral_h=0; for(i2=8;i2<16;i2++){ integral_h|=(Sensor_data[i2]-48)<<(15-i2); } integral_t=0; for(i2=24;i2<32;i2++){ integral_t|=(Sensor_data[i2]-48)<<(31-i2); } Crc=0; for(i2=32;i2<40;i2++){ Crc|=(Sensor_data[i2]-48)<<(39-i2); } Mybyte = T + H + integral_h + integral_t; if(Mybyte != Crc){ T=231; H = 201; } } |
در ادامه می توانید ویدیو این پروژه رو مشاهده بفرمایید
شما می توانید سنسور های دیگری مثل DHT22 که آدرس فیزیکی ندارند به همین طریق راه اندازی کنید…
هر گونه سوالی که مد نظرتان بود بپرسید پاسخ می دهیم.
ممنون بابت به اشتراک گذاشتن کدها
تو هیج سایتی پیداش نمیکردم
خواهش می کنم
و موفق و موید باشید...