تابلو روان و اندازه گیری دما با SMT160 تاریخ : چهارشنبه، 3 شهريور ماه ، 1389
موضوع : تابلوروان - تابلو روان


در این پروژه قصد داریم شما را با نحوه ی کار کردن با نمایشگرهای ماتریسی و همچنین کار کردن با سنسور SMT160 که یک سنسور دما است آشنا کنیم .

 معرفی سنسور SMT160

 این سنسور برای اندازه گیری دما درمحدوده -45C تا +130Cبه کار می رود . مزیت این سنسور نسبت به سنسورهای آنالوگ دما نظیر LM35 این است که خروجی سنسور SMT160 دیجیتال و به صورت مدولاسیون عرض پالس (PWM) است و نیازی به مبدل آنالوگ به دیجیتال ندارد و همچنین خروجی CMOS آن باعث شده تا بتوان سنسور را با کابلی به طول 20 متر به میکرو وصل کرد .در دیاگرام زمانی زیر نمونه ای از پالس خروجی سنسور SMT160 را مشاهده می کنید . این پالس از دو قسمت (T1 سطح مثبت و T2 سطح صفر) تشکیل شده است . در این سنسور زمان کل یعنی T1+T2 ثابت است ولی نسبت یک بودن T1 به T2 متناسب با دما تغییر می کند که به آن D.C (Duty sycle) گفته می شود و ما باید D.C را اندازه گیری کنیم , سپس از فرمول زیر استفاده نماییم . در فرمول زیر temp بر حسب درجه سانتی گراد است

فرمول محاسبه دیوتی سایکل

سنسوری SMT160 دارای سه نوع بسته بندی است سنسوری که ما در این پروژه استفاده می کنیم از نوع بسته بندی TO – 18 بوده است .

دیاگرام پایه های سنسور SMT160

ولتاژ کاری SMT160 در محدوده ی 4.75 تا 7 ولت است و حداکثر جریان مصرفی آن 200 میکرو آمپر است . در این برنامه برای خواندن دما باید زمانT1 و T2 موج مربعی خروجی سنسور را اندازه گیری کنیم تا توسط فرمول ذکر شده بتوانیم دما را به دست آوریم . برای اندازه گیری زمان از وقفه خارجی صفر و تایمر یک استفاده می کنیم . موقعیکه لبه پایین رونده پالس سبب وقفه خارجی می شود محتویات تایمر را در متغییرT1 قرار می دهیم و تایمر را Reset و وقفه را حساس به لبه بالا رونده می کنیم و موقعیکه لبه بالا رونده پالس سبب وقفه خارجی می شود محتویات تایمر را در متغییر T2 ذخیره و مجددا وقفه را حساس به لبه پایین رونده می کنیم و تایمر را Reset می کنیم . بدین ترتیب ما هر دو زمان پالس را داریم و می توانیم زمان وظیفه (Duty sycle ) را اندازه بگیریم .


نرم افزار در آوردن کد های ماتریس
شاید شما به فکر ساختن یک تابلو روان بوده اید اما مشکل اینجاست که در آوردن کد های ماتریس بدون نرم افزار مشکل و وقت گیر است و ما برای حل این مشکل از نرم افزار زیر استفاده می کنیم . ماتریس های استفاده شده در این پروژه 16*8 است . پس در قسمت Row’s‌ عدد سطر 9 را قرار می دهیم توجه کنید چون اولین سطر ماتریس این نرم افزار جز کدهای تولیدی نمی باشد لذا باید یک واحد بیشتر از سطر ماتریس استفاده تنظیم گردد . همچنین نباید در سطر اول ماتریس این نرم افزار چیزی نوشته شود. در سطر بعدی Col’s=85 است چون ما در این ماتریس فقط می توانیم در هر لحظه 16 ستون را به نمایش در آوریم لذا ما برای نمایش کامل متن آن را به سمت چپ شیفت می دهیم . در قسمت language زبان متن حتما باید در حالت انگلیسی باشد حتی اگر متن شما فارسی باشد و در قسمت number save عدد 1 را انتخاب می کنیم تا صفر های اضافی ما بین کدها ایجاد نشود . همچنین در این نرم افزار شما در قسمت وارد کردن متن کلمه مورد نظر خود را تایپ میکنید و میتوانید توست گزینه ی Change font نوع و اندازه ی متن نوشتاری را تعیین کنید و گزینه text to grid را کلیک کنید تا متن نوشته شده در ماتریس به نمایش درآید و در نهایت برای ایجاد کدهای ماتریس گزینه Save to file را کلیک کنید .
برای دانلود کلیک کنید
شرح کار پروژه
در این پروژه ابتدا متن "میکروکنترولرهایAVR " به صورت شیفت به چپ نمایش داده می شود و سپس کلمه " دما " نمایش داده می شود و دمای خوانده شده را نمایش می دهد مانند "25+" برنامه به گونه ای است که می تواند دمای منفی یا مثبت را اندازه گیری کند و نمایش دهد. حال بهتر است برنامه این پروژه را خط به خط بررسی کنیم تا شما با نحوه برنامه نویسی چنین پروژه ای آشنا شوید . اگر احتمالا شما در عمل با مشکل refresh مواجعه شدید می توانید برخی از تاخیر زمانی های این برنامه را تغییر دهید این تغییر زمانی ها را با علامت @ مشخص می کنیم . برنامه این پروژه با زبان C نوشته شده است.  
pre.cppcode { background: #FFFFFF; color: #000000; border:2px dashed #0000FF; font: 10pt; font-family: Lucida Console , DejaVu Sans Mono; direction: ltr; } .cpp01{ color: #007F00; } .cpp02{ color: #007F00; font: 10pt; font-family: Lucida Console , DejaVu Sans Mono; } .cpp03{ color: #3F703F; font: 10pt; font-family: Lucida Console , DejaVu Sans Mono; } .cpp04{ color: #007F7F; font: 10pt; font-family: Lucida Console , DejaVu Sans Mono; } .cpp05{ color: #0000EF; font: 10pt; font-family: Lucida Console , DejaVu Sans Mono; } .cpp06{ color: #7F007F; } .cpp07{ color: #7F007F; } .cpp08{ color: #804080; } .cpp09{ color: #7F7F00; } .cpp10{ font-weight: bold; font: 10pt; font-family: Lucida Console , DejaVu Sans Mono; } .cpp12{ background: #E0C0E0; } .cpp13{ background: #E0FFE0; color: #007F00; } .cpp14{ background: #E0F0FF; color: #3F7F3F; } .cpp15{ color: #3F703F; } .cpp16{ color: #B00040; } .cpp17{ color: #3060A0; } .cpp18{ color: #804020; } .cpp32{ } .cpp34{ color: #0000EE; font-weight: bold; } .cpp35{ color: #EE0000; font-weight: bold; } .cpp36{ color: #808080; } #include <mega16.h> #include <delay.h> #include <math.h> float T1=0.0 , T2=0.0; bit control=0; unsigned char part1=0,part2=0; signed char number=0 ; flash unsigned char number0[]={126,129,129,129,126}; flash unsigned char number1[]={0,130,255,128,0}; flash unsigned char number2[]={198,161,145,137,134}; flash unsigned char number3[]={66,129,137,137,118}; flash unsigned char number4[]={56,36,34,255,32}; flash unsigned char number5[]={79,137,137,137,113}; flash unsigned char number6[]={126,137,137,137,114}; flash unsigned char number7[]={1,255,17,9,7}; flash unsigned char number8[]={118,137,137,137,118}; flash unsigned char number9[]={78,145,145,145,126}; flash unsigned char positive_sign[]={16,56,16,0,0}; flash unsigned char minus_sign[]={16,16,16,0,0}; flash unsigned char text_micro[]= {0,0,0,0,0,0,0,0,0,0,0,128,224,120,46,39, 46,120,224,128,63,127,192,192,127,63,0,254,255,51,51,127, 238,128,0,0,0,120,192,192,220,118,6,0,31,63,48,48, 60,54,58,156,192,112,48,31,159,192,120,50,50,24,48,50, 24,48,55,55,53,29,129,220,116,60,128,192,120,56,48,55, 55,53,29,177,177,56,16,48,56,40,56,0,0,0,0,0,0,0,0,0,0,0,0}; flash unsigned char temp_text[]= {63,96,96,96,32,112,216,112,0,96,192,204,120,0,0,0}; interrupt [EXT_INT0] void ext_int0_isr(void){ TCCR1B=0x00; if (control) { T2=TCNT1; TCNT1=0; MCUCR=0x02; control=0; } else{ T1=TCNT1; TCNT1=0; MCUCR=0x03; control=1; TCCR1B=0x02; } void main () { float DC=0.0; float t=0.0,tp=0.0; signed int loop,refresh,code; PORTA=0x00; DDRA=0xFF; PORTC=0x00; DDRC=0x0F; TCCR1A=0x00; TCCR1B=0x02; TCNT1H=0x00; TCNT1L=0x00; GICR = 0x40; MCUCR=0x02; MCUCSR=0x00; GIFR=0x40; for(code=104;cod>8;code--) { for(refresh=0;refresh<100;refresh++) { for(loop=0,loop<16;loop++) { PORTC=loop; PORTA=~text_micro[abs(code-loop) ] ; delay_us (100); PORTA=0xFF; } } } PORTA=0xFF; asm("sei") for(refresh=0;refresh<250;refresh++) { for(loop=0,loop<16;loop++) { PORTC=~(loop+1); PORTA=~temp_text[loop]; delay_us(500); PORTA=0xFF; } } while(1){ for(loop=0;loop<5;loop++){ DC=T1/(T1+T2); DC+=0.018; t=(DC-0.32)/0.0047; tp=t; part2 = (abs(number) % 10); part1 = (abs(number) / 10); PORTC=~(loop+4); switch (part1) { case 0 : PORTA=~number0[loop];break; case 1 : PORTA=~number1[loop];break; case 2 : PORTA=~number2[loop];break; case 3 : PORTA=~number3[loop];break; case 4 : PORTA=~number4[loop];break; case 5 : PORTA=~number5[loop];break; case 6 : PORTA=~number6[loop];break; case 7 : PORTA=~number7[loop];break; case 8 : PORTA=~number8[loop];break; case 9 : PORTA=~number9[loop];break; default:PORTA=0xFF; } delay_us(1000); PORTA=0xFF; PORTC=~(loop+10); switch (part2) { case 0 : PORTA=~number0[loop];break; case 1 : PORTA=~number1[loop];break; case 2 : PORTA=~number2[loop];break; case 3 : PORTA=~number3[loop];break; case 4 : PORTA=~number4[loop];break; case 5 : PORTA=~number5[loop];break; case 6 : PORTA=~number6[loop];break; case 7 : PORTA=~number7[loop];break; case 8 : PORTA=~number8[loop];break; case 9 : PORTA=~number9[loop];break; default:PORTA=0xFF; } delay_us(1000); PORTA=0xFF; DC=T1/(T1+T2); DC+=0.018; t=(DC-0.32)/0.0047; tp=(tp+t)/2; number=t; if(number >= 0){ PORTC=~(loop); PORTA=~positive_sign[loop]; delay_us(1000); PORTA=0xFF; } else{ PORTC=~(loop); PORTA=~minus_sign[loop]; delay_us(1000); PORTA=0xFF; } } }; } شماتیک و PCB و برنامه پروژه تابلو روان و اندازه گیری دما با SMT160
جهت دانلود کلیک کنید.
توضیحات لازم در مورد سخت افزار
همان طور که مشاهده می کنید در به وقفه خارجی صفر , سنسور SMT160 را متصل کرده ایم و با یک مقاومت k 10 (مقاومت بالا کش) ورودی وقفه را pull-up نموده ایم . نقش بافر 74LS245 تقویت جریان پورت و همچنین حفاظت پورت میکروکنترلر است . نقش دیکدر 4514 این است که ما می خواهیم هر بار یک ستون را انتخاب کنیم ودیتای مربوط به آن سطر را بفرستیم . بنابراین باید در هر لحظه یک ستون انتخاب شود و این کار را با سرعتی مناسب تکرار کنیم تا بر اساس خطای چشم انسان متن مورد نظر به نمایش در آوریم حسن این دیکدر این است که دارای Latch داخلی است و این کمک می کند برای ماتریس های بزرگتر از 16 ستون بتوان از چند دیکدر به خوبی بهره برد . نقش ترانزیستورهای متصل به خروجی دیکدر تقویت جریان برای نوردهی مناسب LED ها می باشد . شاید سوال شما این باشد که جریان اضافی ناشی از مقاومت های 22 اهمی که در مسیر ترانزیستورها قرار دارند ممکن است به LED ها آسیب برساند اما این طور نیست زیرا LED ها مرتبا خاموش و روشن می شوند وجریان ماکزیمم به صورت لحظه ای به آنها اعمال می شود . شما باید کانکتورهای 8 پایه (Data Row) و 16 پایه (Data column) را به پایه های کانکتور مشابه در ماتریس متصل نمایید .



مرجع :
کتاب میکرو کنترلر AVR
مولف:
مهندس جابر الوندی
ناشر:
نص


LED Sign Board SMT160 تابلوروان سنسوردما دما سنسور



منبع این مقاله : سايت مهندس لاچيني | پروژه ها و آموزش الكترونيك و تابلوروان
http://www.HLachini.elewiz.com

آدرس این مطلب :
http://www.HLachini.elewiz.com/modules.php?name=News&file=article&sid=45