در این پست از سایت اِمیک, یک پروژه بسیار جالب و کاملاً تست شده به نام پروژه AVR سنجش نور محیط قرار داده شده است. همانطور که از نام این پروژه مشخص است ما میزان یا شدت نور محیط را اندازه گیری می کنیم و روی یک LCD کاراکتری نمایش می دهیم. نمایش شدت نور محیط به صورت درصدی انجام می شود یعنی با توجه به نور محیط عددی بین 0 تا 100 درصد روی LCD نمایش داده می شود. این پروژه با استفاده از میکروکنترلر AVR انجام شده است. در زیر شماتیک این پروژه جالب را مشاهده می کنید:
همانطور که مشاهده می کنید, ما در این پروژه از میکروکنترلر ATmega16 استفاده کرده ایم. از یک LCD کاراکتری نیز استفاده کرده ایم که این LCD به پورت D میکروکنترلر متصل شده است. پتانسیومتر RV1 نیز برای تنظیم کنتراست یا میزان روشنایی LCD کاراکتری استفاده شده است.
در این پروژه از یک فتوسل (LDR) برای سنجش نور محیط استفاده شده است. سنسور LDR به همراه مقاومت R1 یک تقسیم ولتاژ مقاومتی ایجاد می کنند. هر چه نور محیط بیشتر باشد, مقدار مقاومت سنسور LDR کمتر است و در نتیجه ولتاژ بیشتری روی پین 40 میکروکنترلر (پین 0 از پورت A) که در واقع یکی از ورودی های انالوگ میکرو است می افتد. با کاهش نور محیط مقدار مقاومت سنسور LDR افزایش می یابد و در نتیجه ولتاژ روی پایه 40 میکرو کاهش می یابد. با اندازه گیری ولتاژ روی پایه 40 میکرو توسط ADC میکروکنترلر, می توانیم میزان یا شدت نور محیط را اندازه گیری کنیم.
در نهایت این شدت نور اندازه گیری شده را به صورت عددی بین 0 تا 100 درصد روی ال سی دی کاراکتری نمایش می دهیم. در انتهای مطلب می توانید کلیپ تست عملی پروژه را مشاهده کنید.
توجه کنید که پایه های تغذیه میکروکنترلر (پایه 10 و 11) را که در شماتیک بالا نیست, فراموش نکنید به تغذیه 5 ولت متصل کنید و همچنین پایه های 30 و 32 میکرو را هم بدلیل استفاده از ADC باید به مثبت تغذیه متصل کنیم.
برنامه کدویژن:
در این پروژه فرکانس میکروکنترلر 1 مگاهرتز تنظیم شده است. در زیر برنامه نوشته شده به زبان C و کامپایلر کدویژن را مشاهده می کنید:
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 |
////////// WWW.EMIC.IR ////////// #include <mega16a.h> #include <delay.h> #include <alcd.h> #include <stdio.h> // sprintf براي استفاده از تابع stdio فراخواني کتابخانه // //ايجاد مي شوند adc که توسط خود کدويژن با فعالسازي adc از خط 7 تا 16 دستورات مربوط به// #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR)) unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; delay_us(10); ADCSRA|=(1<<ADSC); while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCW; } void main(void) { float A; //از خط 20 تا 22 تعدادي متغير براي استفاده در برنامه تعريف شده است// int L; unsigned char lcd[16]; //ميکرو ورودي شده است A در زير پورت// DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); //ميکرو براي اتصال به ال سي دي کاراکتري خروجي شده است D در زير پورت// 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); //که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند adc از خط 34 تا 36 رجيسترهاي مربوط به// // ADC initialization // ADC Clock frequency: 500/000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); lcd_init(16); lcd_clear(); lcd_gotoxy(2,0); lcd_putsf("WWW.EMIC.IR"); delay_ms(2000); while (1) { A=read_adc(0); //ميکرو است A خواندن عددي بين 0 تا 1023 که بيانگر مقدار ولتاژ انالوگ روي پين 0 از پورت// L=(A*100)/1023; //دستور روبرو عدد خوانده شده بين 0 تا 1023 را در بازه ي 0 تا 100 تبديل مي کند// lcd_gotoxy(0,0); //رفتن به ستون 0 و سطر 0 از ال سي دي کاراکتري// lcd_putsf("amount of light"); //روي ال سي دي کاراکتري amount of light نمايش عبارت// lcd_gotoxy(6,1); //رفتن به ستون 6 و سطر 0 از ال سي دي کاراکتري// sprintf(lcd,"%d",L); //براي نمايش روي ال سي دي کاراکتري lcd به رشته اي از کاراکتر و ذخيره ان در متغير L تبديل مقادير موجود در متغير// lcd_puts(lcd); //ذخيره کرده بوديم lcd نمايش مقدار نور محيط (به درصد) که به صورت کاراکتر در متغير// lcd_putsf("%"); // % نوشتن کاراکتر // delay_ms(500); //ايجاد 500 ميلي ثانيه تاخير// lcd_clear(); //پاک کردن ال سي دي کاراکتري// } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می تونید در قسمت نظرات مطرح کنید. فایل های کدویژن و شبیه سازی پروتئوس را هم می تونید از انتهای مطلب دانلود کنید.
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…
سلام وقت بخیر . ببخشبد من میخواهم این پروژه را با atmega8 راه اندازی کنم بهم ارور های undefined symbol ADATE و ADTE2 میدهد مشکل چیست ؟ برنامه شما هم ایراد دارد وقتی وارد کدویژن میکنم میخواهم فایل هگز درست کنم میزنم not library alphanumeric lcd not set is project و فایل پرتئوس هم باز نمیشه !!؟؟!
سلام, برای تغییر میکروکنترلر به ATmega8 باید هم شماتیک پروژه و هم برنامه تغییر کنند
سلام خسته نباشید مهندس یک سوال خارج از این پروژه
من یک مدار تقویت کننده صوتی می خوام که فقط با میکروفن و auxهمراه با هم کار کنه ممنون می شم رهنمای کنید