در این پروژه AVR با استفاده از سنسور دمای LM35 و میکروکنترلر ATmega16 دمای محیط را اندازه گیری می کنیم و توسط یک رله می توانیم لوازم سرمایشی مختلف را کنترل کنیم, همچنین دمای اندازه گیری شده بر روی lcd نمایش داده می شود . قبلا در پروژه ” دماسنج با سنسور LM35 ” با این سنسور دما اشنا شدید و نحوه راه اندازی و اندازه گیری دما با ان را یاد گرفتید( حتماً این پست را مطالعه کنید ) . قطعه جدیدی که در این پروژه استفاده شده رله می باشد که در ادامه با این قطعه اشنا می شوید.
رله (Relay) :
ما نمیتوانیم قطعاتی مانند موتور و دیگر قطعاتی که نیاز به جریان زیادی برای راه اندازی دارند را مستقیماً به میکرو متصل کنیم, برای اینکه جریانی که هر یک از پین های میکرو می توانند بدهند بسیار کم است (در حد روشن کردن یک led معمولی هست) و در صورتی که قطعه ما جریان یا ولتاژ زیادی نیاز داشته باشد معمولاً از درایورها یا رله استفاده می شود . رله در واقع مانند یک کلید ساده می باشد با این تفاوت که در کلیدهای معمولی برای تغییر وضعیت از یک حالت به حالت دیگر ما خودمان توسط دست با فشار دادن این کار را می کنیم, ولی در رله ها این تغییر وضعیت توسط یک سیگنال صورت می گیرد.

نوع عادی این قطعه دارای 5 پایه می باشد که همانطور که در تصویر زیر مشاهده می کنید 2 پین مربوط به سیم پیچ رله می باشد که با اتصال ولتاژ به انها و برقراری جریان الکتریکی در سیم پیچ کنتاکت درون رله تغییر وضعیت می دهد. سه پین دیگر هم که در تصویر مشخص است, پین مشترک که با POLE مشخص شده و پین های NC و NO می باشند. در حالتی که جریان در سیم پیچ برقرار نیست پایه مشترک (POLE) به NC متصل است و با برقرای جریان الکتریکی درسیم پیچ پایه مشترک (POLE) به NO وصل می شود.

ما در این پروژه توسط یک رله دستگاه سرمایشی خود را (کولر) کنترل می کنیم, البته خود رله را هم نمی توان مستقیم به میکرو متصل کرد و معمولاً توسط یک ترانزیستور و یک مقاومت رله را به میکرو متصل می کنن در مدار زیر نحوه اتصال رله توسط ترانزیستور و مقاومت به میکرو را مشاهده می کنید :

دیود متصل به دوسر سیم پیچ رله برای خنثی کردن ولتاژ القایی حاصل از سیم پیچ در هنگام خاموش شدن رله به کار می رود. با اعمال ولتاژ به پایه بیس ترانزیستور(پایه متصل به مقاوت ۱۰k) ترانزیستور روشن شده و مانند یک کلید بسته عمل می کند. در این حالت پایه کلکتور ترانزیستور(پایه متصل به سیم پیچ رله) با پایه امیتر آن(پایه متصل به زمین) اتصال کوتاه شده و جریان از سیم پیچ رله عبور می کند.با زمین کردن بیس ترانزیستور اتصال بین امیتر و کلکتور قطع می شود و در پی آن رله خاموش می شود.
شماتیک پروژه :
در زیر شماتیک این پروژه را مشاهده می کنید, نکات مهم در قسمت اشنایی با رله گفته شد. فقط توجه کنید که حتماً پین های تغذیه میکرو که در پروتئوس وجود ندارد را به 5 ولت وصل کنید. ما در اینجا بجای کولر از یک موتور 12 ولت استفاده کرده ایم شما می تونید دستگاه سرمایشی خودتون رو بجای موتور متصل کنید, البته به ماکزیمم جریانی که رله میتونه تحمل کنه هم دقت کنید. و نکته دیگر اینکه ما در شماتیک زیر از رله 12 ولت استفاده کرده ایم و به همین خاطر یک سر سیم پیچ رله به 12 ولت متصل است در صورتی که به عنوان مثال رله 5 ولت تهیه کردید سیم پیچ رله باید به 5 متصل بشود و نه 12 ولت .

می تونید بجای مداری که در بالا برای راه اندازی رله گفته شد, از ماژولهای اماده رله استفاده کنید که کار را خیلی راحت تر میکنن تصویر زیر یک نمونه از این ماژول ها می باشد :

برنامه پروژه :
در کدویزارد میکرو ATmega16 را انتخاب کنید و فرکانس ان را ۱ مگاهرتز قرار دهید, پورت C را برای اتصال به LCD خروجی کنید و تنظیمات LCD کاراکتری را برای اتصال به پورت C انجام دهید. پین 0 از پورت 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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
//////////////// 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 i ; // for تعريف متغير براي شمارنده حلقه // int a , b ; // در ان 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 از خط 31 تا 33 رجيسترهاي مربوط به // 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=0; b=0; // متغيرهاي روبرو صفر مي شوند while در ابتداي شروع حلقه // for(i=1;i<=10;i++) // ريخته مي شود a نمونه گيري مي شود و درون متغير adc روبرو و توابع درون ان 10 بار از for براي اينکه دماي اندازه گيري شده ي ما دقيق تر باشد توسط حلقه // { a=a+read_adc(0); delay_ms(30); } b=a/10; Temperature=(b/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 نوشتن کاراکتر // if(Temperature<=20.99) // روبرو حداقل دما را مشخص مي کند if دستور // { PORTD.0=0; // صفر شود c پين 0 از پورت // lcd_gotoxy(1,1); // رفتن به ستون 1 و سطر 1 // lcd_putsf("Cooler--> OFF"); // LCD روي COLER--> OFF نوشتن متن // } if(Temperature>=23.99) // روبرو حداکثر دما را مشخص مي کند if دستور // { PORTD.0=1; // يک شود c پين 0 از پورت // lcd_gotoxy(1,1); // رفتن به ستون 1 و سطر 1 // lcd_putsf("Cooler--> ON"); // LCD روي COLER--> ON نوشتن متن // } } } |
توضیحات کامل برنامه نوشته شده و در صورت مشکل با برنامه در قسمت نظرات مطرح کنید . در پست ” دماسنج با سنسور LM35 ” در مورد دستور sprintf توضیح داده شد که می توانید مطالعه کنید.
توجه : زمانی که از دستور sprintf در کدویژن استفاده می کنیم باید از مسیر
|
1 |
" Project/Configure/C Compiler/Code Generation " |
گزینه ی s}Printf Features} را روی float, width, precision قرار دهیم .
کلیپ شبیه سازی :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…





سلام وقت بخیر
من این پروژه رو روی برید برد بستم
ولی lcd چیزی نشون نمیداد
وفن هم کار نمیکرد
سلام دوست عزیز اول اینکه به خاطر این پروژه ها باید تشکر بکنم من هنوز کد را تست نکردم اما از نقشه دستگاه معلوم هست چیه بنده در یک محیط صنعتی کار میکنم و با این نوع مدارات کنترل البته از نوع برودتی چیلر برخورد دارم خروجی سیستم فقط به دما وابسته نیست و در خروجی یک تایمر کانتر ظاهرا داخل میکرو گزاشته که بعد از رسیدن دما به حد تعریف شده بلافاصله روشن نگردد چون در غیر این صورت موتور باید با فاصله کوتاهی روشن و خاموش بشه و این علاوه بر اسیب به موتور آزار دهنده میباشد نحوه کار تایمر هم دوباره به دما وابسته هست یعنی اگر دما به هر دلیلی دوباره برگردد تایمر ریست میشه و دوباره از صفر شروع میشه نمایشگر علاوه بر دما انواع خطاهای دستگاه را نشان میدهد و قطعا یک کیبرد برای برنامه ریزی دستگاه وجود دراد این مدارات در حد سرگرمی هستند مدارتان را کاربردی و حرفه ای کنید متشکرم
ببخشید من این پروژه رو با ATMEGA 16A بستم به صورت عملی ولی جواب نمیده باید کدش عوض بشه من از همین فایل hexz داخل فایل زیپ استفاده کردم ولی جواب نمیده فقط LCD روشن میشه ولی هیچی نشون نمیده
پروژه عملی می باشد و نیاز به تغییر ندارد. احتمالاً در بستن پروژه اشتباهی انجام داده اید. ممکن است به دلیل تنظیم نبودن کنتراست LCD چیزی نمایش داده نمی شود, یک پتانسیومتر برای تنظیم کنتراست به LCD متصل کنید و همچنین پایه های 15 و 16 ال سی دی را نیز به تغذیه متصل کنید.
با یک پتانسیومتر 10k این کار هم کردم فقط یک چیزی برای تغذیه واحد ADC باید از یک تغذیه جدا استفاده کرد آخه من با پایه های تغذیه میکرو به هم متصل کردم بعدش به تغذیه وصل کردم
داخل کدویزارد برای تنظیم ADC قسمت volt Ref رو روی AREF pin گذاشتم فقط کلاک ADC رو چند باید زد همچنین قسمتAuto Trigger source روی چه گزینه ای باید باشه ؟
ممنون
سلام وقت بخیر ممنون از سایت خوبتون یک سوال برای خرید سنسور LM35 مدل خاصی نداره و فرقی نمیکنن با هم ؟
سلام, نام کامل سنسور LM35DZ
سلام خسته نباشید
LCDداخل برنامه برای من همیشه دما رو نمایش میده 1f
چیکار کنم درست شه ?
سلام دوست عزیز من هم این پروژه رو داشتم میساختم که به همین مشکل بر خوردم و بعد مطلب سایت رو با دقت بیشتری خوندم و دیدم راه حل رو نوشته و مشکلم حل شد… اگر دقت کنید دقیقا بالای کلیپ شبیه سازی راه حلش هست
اما اینجا هم Paste میکنم که مشکلتون حل بشه:
توجه : زمانی که از دستور sprintf در کدویژن استفاده می کنیم باید از مسیر
” Project/Configure/C Compiler/Code Generation ”
گزینه ی s}Printf Features} را روی float, width, precision قرار دهیم .
برای من دما رو 498.1 c نشون میده انگار اصن سنسور کار نکنه دو تا سنسور هم تست کردم باز هم همین مشکل وجود داره کاری که گفتین هم انجام دادم
با سلام وقت بخیر
اگر بخواهیم برای atmega8535
این مدار طراحی کنیم باید چه تغییراتی انجام بدیم؟
چون موقع اجرا دو تا ارور داره
Duplicate part reference: M00000007 [M00000007]. [12v]
Simulation FAILED due to netlist compiler error(s).
ممنون میشم راهنمایی کنید.
سلام وقت بخیر
اگر بخوایم در کنار کولر از یه هیتر هم استفاده کنیم مدارش تو پروتئوس مثل کولر میشه ؟
یعنی به همون صورت رله ودیود … میخواد؟
مرسی از سایت فوق العادتون
سلام این که دوسه تا ارور داره
وکار نمیکنه
مشکل چیه
سلام, خیر دوست عزیز کدها هیچ اروری ندارند و من قبلا این پروژه را تست کردم. بهتره که فایل هگز موجود در فایل های انتهای مطلب را روی میکرو پروگرام کنید و پروژه را تست کنید
سلام من میخواستم این پروژه رو با سنسورdht11 در شبیه ساز راه اندازی کنم میشه لطفا راهنماییم کنید
سلام, با سنسور dht11 یک پروژه متفاوت میشه, در اینده حتما پروژه مورد نظرتون را در سایت قرار خواهم داد
سلام خسته نباشید
من یه پروژه باید بنویسم که قابلیت تنظیم دمای خاموش و روشن داشته باشه مث همینه؟
سلام, می تونید در برنامه دمای خاموش و روشن شدن را وارد کنید ولی این امکان وجود نداره که بعد از ساخت پروژه بصورت دستی دماها را وارد کنید. باید در برنامه تغییراتی داده بشه
سلام و وقت بخیر.بنده شماتیک مدار رو مطابق با همین چیزی ک در سایت موجوده رسم کردم و تنظیماتی ک گفتید رو هم انجام دادم در میکرو و کد رو هم ب کد تولید کدویزارد اضافه کردم ولی در شبیه سازی پروتئوس همیشه دما رو صفر نشون میده و هیچوقت موتور روشن نمیشه!ممنون میشم اگ راهکاری ب ذهنتون میرسه ارایه بدید
سلام, در شبیه سازی این مشکلات پیش میاد بهتره در عمل تست کنید و احتمالا مشکل شبیه سازی هم این هست که سنسور lm35 در پروتئوس کار نمیکنه, سنسور را در شبیه سازی عوض کنید و یکی دیگه بجاش بذارید ممکنه مشکل حل بشه
سلام خسته نباشید مرسی از توضیحاتتون
برای این پروژه مشکلی نداره از دیگر چیپ های atmega استفاده کرد؟
سلام, میشه استفاده کرد ولی بسته به میکروکنترلر لازم است کدها تغییر کند
ازت یه دنیا ممنونم واقعا کمک بزرگی بهم کردی
انشاا… که خدا هرچی میخای بهت بده
فقط یه سوال
من باید حد بالا و پایین دما را با key pad وارد کنم حالا من باید چی کار کنم ؟ وکدش چجوری میشه
ممنون دوست عزیز, قبلا راه اندازی کی پد رو هم اموزش دادم شما فقط باید این دو پروژه رو ترکیب کنید و پروژه مورد نظر خودتون رو درست کنید
نه خداوکیلی شوخی نکوووون
چجوری باید ترکیب کنم
هر دو پست رو کامل مطالعه کنید و باید با برنامه نویسی میکرو تا حدودی اشنا باشید