در این پست از سایت اِمیک, شما با ساخت یک دماسنج با استفاده از سنسور پرکاربرد و معروف LM35 اشنا خواهید شد. سنسور LM35 یک سنسور انالوگ می باشد, به این معنی که با تغییرات دمای محیط ولتاژ انالوگی در خروجی ان ایجاد می شود که با اندازه گیری ان توسط ADC میکروکنترلر می توانیم دمای محیط را اندازه گیری کنیم . در صورتی که با ADC و راه اندازی ان در میکرو AVR اشنا نیستید ” این پست “ را مطالعه کنید .
اشنایی با سنسور LM35 :
همانطور که گفته شد LM35 یک سنسور انالوگ می باشد که دما را برحسب درجه سانتی گراد به صورت کالیبره شده در خروجی به صورت ولتاژ نمایش می دهد. ای سنسور دارای دقت بسیار مناسبی می باشد و با توجه به قابلیت های ان دارای قیمت مناسبی هم می باشد . سنسور LM35 دارای تغییرات ولتاژ خروجی خطی نسبت به تغییرات دما می باشد و نیاز به کالیبراسیون ندارد.
ویژگی ها:
- کالیبره شده برای درجه سانتی گراد (سلسیوس)
- تغییرات خطی ولتاژ خروجی به ازای هر درجه، ۱۰mV
- در دمای ۲۵ درجه سانتی گراد دارای دقت ۰٫۵ درجه
- محدوده اندازه گیری بین -۵۵ تا ۱۵۰ درجه سانتی گراد
- مناسب برای کاربرد های کنترل از راه دور
- کم هزینه با توجه به ویژگی ها
- محدوده عملکرد ولتاژی بین ۴ تا ۳۰ ولت
- جریان درین کمتر از ۶ میکرو آمپر
- ایجاد گرمای بسیار کم توسط خود سنسور(اتلاف گرمایی)، حدود ۰٫۰۸ درجه سانتی گراد
- امپدانس خروجی کم، برای بار یک میلی آمپر حدود ۰٫۱ اهم
شماتیک پروژه :
در این پروژه ما توسط مبدل انالوگ به دیجیتال (ADC) میکرو ولتاژهای خروجی سنسور LM35 را اندازه گیری می کنیم و با قرار دادن این مقادیر در یک نسبت ساده انها را به مقادیر دما تبدیل می کنیم و بر روی LCD کاراکتری نمایش می دهیم . شماتیک به صورت زیر است :
برنامه پروژه :
در کدویزارد میکرو ATmega16 را انتخاب کنید و فرکانس ان را 1 مگاهرتز قرار دهید, پورت D را برای اتصال به LCD خروجی کنید و تنظیمات LCD کاراکتری را برای اتصال به پورت D انجام دهید. ADC میکرو را فعال کنید و در نهایت کدهای این پروژه به صورت زیر است :
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 |
//////////////// www.emic.ir //////////////// #include <mega16.h> #include <delay.h> #include <alcd.h> #include <stdio.h> // sprintf براي استفاده از تابع stdio فراخواني کتابخانه // #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR)) // که توسط خود کدويژن توليد مي شوند adc از خط 7 تا خط 16 دستورات مربوط به // 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) { int a=0 ; // در ان adc براي ريختن مقادير خوانده شده از int تعريف متغير از نوع // float Temperature ; // براي ريختن مقادير دما در ان float تعريف متغير از نوع // char Buffer_LCD[16]; // کاراکتري نمايش دهيم lcd براي تبديل مقادير دما به رشته اي از کاراکتر تا بتوانيم ان را روي char تعريف متغير از نوع // 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); 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); ADMUX=ADC_VREF_TYPE; //که توسط خود کدويژن با توجه به تنظيماتي که انجام داده ايم ايجاد مي شوند adc از خط 30 تا 32 رجيسترهاي مربوط به // ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (1<<ADPS1) | (0<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); lcd_init(16); //(LCD بررسي اتصال) LCD پيکره بندي // lcd_clear(); // LCD پاک کردن // while (1) { a=read_adc(0); // a خواندن عددي بين 0 تا 1023 که نشان دهنده مقدار ولتاژ انالوگ روي ان پين ميکرو است و ريختن ان در متغير // Temperature=(a/2.054) ; // را به دما تبديل مي کند ADC مقادير خوانده شده LM35 دستور روبرو با توجه به ديتاشيت // sprintf(Buffer_LCD,"T=%3.1f",Temperature); // LCD براي نمايش روي Buffer_LCD تبديل مقادير دما به رشته اي از کاراکتر و ذخيره ان در متغير // lcd_gotoxy(0,0); // رفتن به ستون 0 و سطر 0 // lcd_puts(Buffer_LCD); // ذخيره شده اند Buffer_LCD نمايش مقادير دما که به صورت کاراکتر در متغير // lcd_gotoxy(7,0); // رفتن به ستون 7 و سطر 0 // lcd_putsf("C"); // بعد از دما به عنوان سانتي گراد LCD روي C نوشتن کاراکتر // lcd_gotoxy(2,1); // رفتن به ستون 2 و سطر 1 // lcd_putsf("www.emic.ir"); // LCD روي www.emic.ir نوشتن متن // delay_ms(500); /* ايجاد تاخير به مدت 500 ميلي ثانيه يا 0.5 ثانيه*/ } } |
برای نمایش مقادیر دما بر روی LCD کاراکتری لازم است که ابتدا این مقادیر به رشته ای از کاراکتر تبدیل شوند تا بتوانیم انها را بر روی LCD نمایش دهیم برای این کار از دستور sprintf استفاده می کنیم . این دستور یکی از توابع کتابخانه stdio می باشد, بنابراین برای استفاده از ان لازم است که در ابتدای برنامه این کتابخانه را فراخوانی کنیم .
همانطور که می دانید دستور read_adc عددی بین 0 تا 1023 با توجه به ولتاژ انالوگ ما از پین های میکرو می خواند (در صورتی که تیک Use 8 bits را نزده باشیم), و از انجایی که در دیتاشیت LM35 گفته شده که به ازای هر درجه سانتیگراد، ۱۰ میلی ولت تغییرات در خروجی سنسور داریم بنابراین می توانیم با یک تناسب ولتاژ خواند شده از سنسور را به مقادیر دما تبدیل کنیم, این کار در خط 40 برنامه انجام شده و با تقسیم مقادیر خوانده شده از ADC بر 2.054 ولتاژ ما به مقادیر دما تبدیل می شود .
توجه : زمانی که از دستور sprintf در کدویژن استفاده می کنیم باید از مسیر
1 |
" Project/Configure/C Compiler/Code Generation " |
گزینه ی s}Printf Features} را روی float, width, precision قرار دهیم .
کلیپ شبیه سازی :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…
سلام مهندس عابد وقت بخیر 🌹
مهندس این پروژه رو در عمل که میبندم جواب نمیده و مقدار ۴۷۸ درجه رو نشون میده ولی داخل پروتئوس همه چیز گل و بل بل هست نمیدونم دلیلش چیه اینقدر باهاش ور رفتم دیگه دیوانه شدم لطفا راهنمایی بفرمایید ، تمام نکاتی که در بالا گفتید رو رعایت کردم ولی تغییری ایجاد نشد
سلام پروژتون عالی بود فقط وقتی که بالای دمای 28میره 1درجه اختلاف می یافته باید برای رفع این کار چه کرد .
سلام من مدار را در پروتوس بستم مشکلی نداشت اما در عمل دما را روی 498.1 نشون میده ممنون میشم راهنمایی کنید
سلام . من این پروژه رو به صورت عملی و هم بصورت شبیه ساز بستم تو شبیه سازی جواب گرفتم ولی تو عملی دما رو درست نشان میده چی کار کنم ممنون میشم کمکم کند .
سلام خسته نباشید. من این برنامه رو ت کدوبژن ابلود کردم ت بروتئوس درستع ولی نمایشگر کار نمیکنه هیچ مشکلی هم نداره
میشع راهنمایی کنید.ممنون
سلام
میخوام دما رو روی سگمنت نشون بدم. چه تغییری باید بدم؟
سگمنت هر نوعی باشه فرقی ندارد… یک رقمی یا دو رقمی یا سه رقمی فرقی ندارن برام…
سلام مهندس خسته نباشید. ببخشید اگه بخوایم مثلا به جای ال سی دی از یک فن استاده کنیم که در صورت افزایش دما فن شروع به کار کند باید چی کار کنیم .
ممنون میشم اگه راهنمایی کنید
سلام, این پروژه را بررسی کنید
سلام. این پروژه رو میشه طوری تغییر بدید که خروجی ولتاژ 220 ولت اعمالی رو بصورت پی وی ام نسبت به دما بهمون ارائه بده . در واقع میخوام سرعت فن 220 ولت رو کنترل کنه به نحوی که اگر دما بالا رفت سرعت فن زیاد بشه و با کاهش دما سرعت هم بیاد پایین دقیقا مثل فن سی پی یو ولی با ولتاژ220
سلام من این رو عملی بستم ولی هیچی نشد و اصلا روشن نشد چکار کنم؟
سلام, فایل هگز موجود در فایل های انتهای مطلب را روی میکرو پروگرام کنید و برنامه را تغییر ندهید. این پروژه را من در عمل تست کردم و بخوبی جواب داده پس باید بررسی کنید که چه اشتباهی انجام داده اید
سلام خسته نباشید پروژه انجام دادم ولی مشکلی که هست دما ثابت نشون می ده (498) به گفته شما سنسور را هم عوض کردم ولی مشکل حل نشده ممنون می شم اگه کمکم کنید.
سلام, در شبیه سازی مشکل دارید یا عملی؟ من الان در پروتئوس چک کردم پروژه مشکلی نداشت
تو شبیه سازی مشکل دارم .
البته برنامه پروتئوس که نصب کردم رو سیستمم فکر کنم درست کرک نشده
بهتره در عمل تست کنید یا اینکه در پروتئوس مدل های مختلف سنسور LM35 را تست کنید ببینید با کدوم یکی جواب میده
منم همین مشکل دارم متاسفانه سنسور دیگه هم نیتس باهاش تست کنم بیشتر راهنمایی کنید
(داخل شبیه ساز)
سلام خسته نباشید دوتا مشکل داشتم یکی سنسور تو پروتئوس ورودی نشون نمیده و اینکه عددشم بالا و پایین نمیره روی عدد t=498.1.c می مونه
سلام, سنسور را عوض کنید ممکنه مشکل از سنسور در پروتئوس باشه
سلام دمتون گرم بابت پروژه من کد های برنامه را نوشتم واز توضیحات خوبتون استفاده کردم برای ساخت یک فیلم اموزشی که نشان استادم بدم و خیلی هم عالی شد بازم ممنون
با سلام
بنده دیتاشیت این سنسور را مطالعه نموده و مطلبی مبنی بر ضریب 2.054 جهت محاسبه دما ندیدم.
لطفاً مبنا و مأخذ این فرمول را ارائه بفرمایید.
با تشکر
سلام, فرمول کلی خواندن دما از این سنسور به صورت زیر است:
Temperature=analog_value*factor*100
factor=5/1023
که ضریب مورد نظر از فرمول بالا بدست امده
سلام من میخوام عملی ببندم ولی چیزی نشون نمیده باید پایه های 10و11و31باید وصل کنم به منفی و مثب یا نمیخواد
سلام, بله دوست عزیز پایه های تغذیه میکرو و پایه های تغذیه ADC باید متصل بشن. پایه های 10, 30 و 32 را به مثبت تغذیه و پایه های 11 و 31 را به منفی تغذیه متصل کنید.
ببخشید واسه پتانسیومتر چند کیلو بزارم
اگر منظورتون پتانسیومتر برای تنظیم کنتراست lcd هست 10 کیلو استفاده کنید
من این مدار بستم رو برد برد جواب نداد ولی توی پروتوس کار میکنه
از یه سایت دیگه دانلود کردم اون جواب دادایا باید کاری کنم
پایه های تغذیه را که قبلا بهتون گفتم به درستنی متصل کنید و فایل هگز موجود در فایل های انتهای مطلب را بدون تغییر روی میکرو بریزید و تست کنید
سلام.
پس دمای منفی رو چجوری نشون میده؟
سلام, دمای منفی رو نشون نمیده اگه وقت شد حتما پروژه نمایش دمای منفی با lm35 را هم قرار می دم
سلام من این پروژه رو انجام دادم ولی دما نشون داده نمیشه فقط بصورت T=1f c نشون داده میشه .
مشکل چیه ؟
و اینکه میشه راجع به خط 41 کد بیشتر توضیح بدید؟
سلام, نکته ای که در انتهای مطلب در مورد دستور sprintf گفته شده را انجام بدید
در توضیحات گفته شده که باید مقادیر دمایی که محاسبه کردیم را برای نمایش روی ال سی دی کاراکتری به کاراکتر تبدیل کنیم که دستور sprintf این کار را انجام میدهد
سلام منم همین مشکل دارم و روی بردم دما رو به صورتی که سارا گفته نمایش میده
LM35 هم سالمه و اتصالات برقراره
سلام, گفتم که اون نکته اخر در مورد دستور sprintf را انجام بدید
سلام ممنون از پروژه فوق العاده تون
اگه ما بخوایم به میکرو بگیم مثلا ” توی دمای 20 درجه این کار رو انجام بده (مثلا یه پین رو روشن کن)”
باید چجور دستور بنویسیم
سلام, شما می تونید با یک شرط if به راحتی اینکار را انجام بدید. قبلا یک پروژه مشابه به اسم “کنترل دمای کولر با سنسور LM35” قرار داده بودم که می تونید مطالعه کنید
خیلی ممنون از پاسختون