در این پست از سایت اِمیک, راه اندازی سنسور دما DS18B20 را اموزش خواهیم داد. ما در این پروژه با استفاده از میکروکنترلر AVR دمای این سنسور را خوانده و روی یک LCD کاراکتری 2*16 نمایش می دهیم. برنامه نویسی این پروژه در محیط کدویژن انجام شده است و برنامه به زبانی ساده نوشته شده تا همه بتوانید برنامه را به راحتی متوجه بشوید و در صورت نیاز خود تغیرات لازم را در ان اعمال کنید. از انجایی که این سنسور بسیار دقیق و کاربردی است ما در پروژه هایی که در اینده قرار خواهیم داد حتما از این سنسور استفاده می کنیم بنابراین این مطلب را حتما کامل یاد بگیرید.
قبل از هر چیز بهتر است که ابتدا با این سنسور دقیق و کاربردی اشنا شویم .
سنسور دما DS18B20 :
سنسور DS18B20 یک سنسور دمای بسیار دقیق می باشد که می توان از ان در پروژه های مختلفی مانند دستگاه جوجه کشی ، گلخانه های هوشمند ، تنظیم دمای محیط و موارد مشابه استفاده کرد. ما قبلا سنسور دمای LM35 را هم راه اندازی کرده بودیم ولی LM35 یک سنسور انالوگ می باشد و همچنین دقت کمتری نسبت به سنسور سنسور دما DS18B20 دارد. سنسور DS18B20 یک سنسور دمای دیجیتال با دقت اندازه گیری 0.5 درجه سانتی گراد است که می تواند دمای 55- تا 125+ درجه را اندازه گیری کند، پروتکل ارتباطی با این سنسور یک سیمه (1wire) است. با یک سیم می توان تا 9 سنسور دیجیتال DS18B20 را راه اندازی کرد و طول سیم واسط بین سنسور و میکروکنترلر می تواند تا حداکثر 7 متر باشد. سنسور DS18B20 یک سنسور خیلی دقیق و عالی برای استفاده در پروژه هایی است که به دقت و اعتماد نیاز دارند. شکل این سنسور و پین های ان به صورت زیر است :
مشخصات :
- ارتباط 1WIRE (یک سیمه)
- ولتاژ کاری ۳ تا ۵.۵ ولت
- تنظیم دقت اندازه گیری در مدهای ۹ , ۱۰ , ۱۱ و ۱۲ بیتی
- قابلیت اندازه گیری دمای ۵۵- تا ۱۲۵+ سانتی گراد (۶۷- تا ۲۵۷+ فارنهایت)
- اندازه گیری دما با دقت ۱۲ بیت در طول ۷۵۰ میلی ثانیه
- دارای آدرس مخصوص برای هر سنسور در قالب ۶۴ بیت
- قابلیت قرار دادن تعداد زیاد سنسور بر روی یک خط باس
- ساخته شده در دو پکیج TO-92 و SOIC-8 PIN
- خطای اندازه گیری 0.5± درجه سانتی گراد در بازه ۱۰- تا ۸۵+ درجه سانتی گراد
شماتیک پروژه :
همانطور که در تصویر بالا مشاهده می کنید این پروژه دارای شماتیک ساده ای می باشد و قطعات اصلی ان شامل سنسور DS18B20 و میکروکنترلر ATmega16 برای خواندن مقادیر دما از سنسور و یک lcd کاراکتری 2*16 برای نمایش مقادیر دما می باشد. پتانسیومتر RV1 برای تنظیم کنتراست lcd می باشد و در صورتی که نمی خواهید استفاده کنید پین 3 ال سی دی رو به منفی تغذیه متصل کنید. لازم است که پین خروجی سنسور DS18B20 را با یک مقاومت 4.7K (مقاومت بالاکش R1) به مثبت تغذیه متصل کنیم. توجه کنید که از انجایی که در شبیه سازی پروتئوس پین های تغذیه میکروکنترلر وجود ندارد شما در عمل پین های 10 و 11 میکرو را به ترتیب به مثبت و منفی تغذیه متصل کنید.
برنامه :
همانطور که گفته شد برنامه این پروژه به زبان C و با کامپایلر کدویژن نوشته شده است. در ابتدا شما باید در کدویژن یک پروژه جدید ایجاد کنید و از قسمت Chip میکروکنترلر ATmega16 را انتخاب کنید و فرکانس ان را 1 مگ تنظیم کنید
در ادامه در قسمت Port یکی از پورتها را برای اتصال به lcd خروجی کنید. ما پورت C را برای اتصال LCD انتخاب کرده ایم
در مرحله بعد از قسمت 1Wire Bus Interface ما پین صفر از پورت B را برای ارتباط یک سیمه (1wire) انتخاب می کنیم (تنظیمات به صورت تصویر زیر انجام شود)
و در قسمت Alphanumeric LCD تنظیمات را به صورت تصویر زیر برای اتصال به پورت C انجام می دهیم
در مرحله اخر برای ایجاد کدهای ابتدایی برنامه باید مانند تصویر زیر روی Generate program, save and exit کلیک کنیم و پروژه را سه باز ذخیره کنیم
برنامه نهایی ما به صورت زیر می باشد, فقط توجه کنید که کتابخانه سنسور به صورت <ds1820.h> ایجاد می شود که باید به این صورت تغییر دهید <ds18b20.h> یک b اضافه می کنیم. و همانطور که در کد زیر می بینید هنگام خواندن از سنسور هم یک b اضافه می کنیم :
1 |
ds18b20_temperature(0); |
توضیحات قسمت های مهم برنامه نوشته شده, سوالی داشتید می تونید در قسمت نظرات مطرح کنید
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 |
////////////// WWW.EMIC.IR ////////////// #include <mega16.h> // mega16 فراخواني کتابخانه // #include <1wire.h> // 1wire فراخواني کتابخانه // #include <ds18b20.h> // ds18b20 فراخواني کتابخانه // #include <alcd.h> // کاراکتري lcd فراخواني کتابخانه // #include <stdio.h> // sprintf براي استفاده از تابع stdio فراخواني کتابخانه // #include <delay.h> // delay فراخواني کتابخانه // void main(void) { float Temperature=0 ; // براي ريختن مقادير دما در ان float تعريف متغير از نوع // char Buffer_LCD[16]; // کاراکتري نمايش دهيم lcd براي تبديل مقادير دما به رشته اي از کاراکتر تا بتوانيم ان را روي char تعريف متغير از نوع // DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); DDRC=(1<<DDC7) | (1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0); PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); w1_init(); // پيکره بندي پروتکل ارتباطي يک سيمه // lcd_init(16); //(LCD بررسي اتصال) LCD پيکره بندي // lcd_clear(); // LCD پاک کردن // while (1) { Temperature=ds18b20_temperature(0); // مي ريزد Temperature دستور روبرو مقادير دما را از سنسور خوانده و درون متغير // 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 ثانيه// } } |
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…
سلام
پایه خروجی سنسور قرمز شد ولی عدد روی سنسور مثلا 27 درجه است روی LCD نشان داده نمی شود؟ کل برنامه گذاشتم.
خطلا هم کدویژن و پروتئوس نمی دهد.
سلام
خروجی سنسور دیجیتال DS18B20 موقع شبیه سازی پروتئوس باید قرمز شود ولی همچنان خاکستری و غیر فعال است؟
سلام
داخل پروتئوس T=1f نشون میده.
مشکل چیه؟
همه چیز رو بارها چک کردم.
سلام, در کدویژن از مسیر Project/Configure/C Compiler/Code Generation گزینه ی s}Printf Features} را روی float, width, precision قرار دهید
سلام
می خواستم ماژول RCWL- 0516 (تشخیص حرکت مایکروویو) رو با ATmega32 راه بندازم و تو نمایشگر نمایش بده به صورت 0 و 1
یه بخشش رو نوشتم ولی قسمتی که موقع تشخیص باید 1 و عدم تشخیص 0 شود رو نمی تونم بنویسم تو نمایشگر نشون بده
while (1)
{
PORTA.0=1 ;
PORTA.0=0;
lcd_gotoxy(0,0);
delay_ms(500);
lcd_clear();
}
}
ممنون میشم راهنمایی کن
سلام جناب مهندس خسته نباشید میخواستم از شما تقاضا کنم اگه امکانش هست آموزش راه اندازی این مدار را با برد آردوینو در سایت قرار دهید با تشکر
سلام, قبلا در سایت قرار دادم پروژه های اردوینو را بررسی کنید
سلام میشه دما رو رو سون سگمنت نشان بدین دمای منفی رو به چه صورت نمایش میدن ممنون اگه کمکم کنید.
سلام
من همین برنامه رو توی کد ویژن میریزم میخوام کامپایلش کنم ارور زیر رو نشون میده مشکل از کجاس متغیر دما رو از اعشار به char چند چیزه دیگه تغییر دادم اما مشکل حل نشد؟ مرسی اگه راهنمایی کنید
: character constant is too long
سلام, فایل های انتهای مطلب را دانلود و تست کنید
سلام خسته نباشید. ببخشید چرا توی پرانتز جلوی temperature وقتی داریم تعریف می کنیم 0 می گذاریم.
این اشکالی که گفتم در پروتیوس بوجود میاد
ممکنه از پروتئوس باشه بهتره بصورت عملی تست کنید
با عرض سلام و وقت بخیر و تشکر از اموزشهای مفیدتون. اگر بخواهیم دوتا سنسور ds18b20 را به یک پایه وصل کنیم و با تغییر دما در هر سنسور یک پایه از میکرو یک شود چه تغییراتی باید در برنامه انجام دهیم
سلام
من همین کد ها رو که وارد میکنم
دما رو 99999-
نشون میده چراااا؟
و هیچ تغییری هم نمی کنه
ایا ربطی به ورژن پروتیوس داره؟
سلام, این مشکل زمانی پیش می یاد که سنسور را از میکرو جدا کنیم. ببینید که سنسورتون به درستی به میکرو متصل شده است و این احتمال هم وجود دارد که سنسور خراب باشد.
سلام
دمت گرم مهندس جان من خیلی وقت بود که سر همین نکته کوچولو برنامم کار نمیداد
همین که فایل سرآیند ds1820باید به ds18b20 تبدیل بشه
خیلی ممنون
سلام خدمت جناب رازانی و همه ی دوستان
یه سوال داشتم جناب رازانی واونم این هست که اگه بخوایم دما تا دورقم اعشار روی السیدی نشان داده بشه باید چه تغییری تو برنامه بدیم؟
سلام, همانطور که در متن گفته شده این سنسور حدود 0.5 درجه خطا دارد, بنابراین مقدار اعشاری که نمایش می دهد دقیق نیست و لازم نیست تا دو رقم را نمایش دهیم. ولی شما می توانید در خط 28 برنامه با تغییر دستور sprintf به “T=%4.2f” تا دو رقم اعشار را روی lcd نمایش دهید
سلام . از سایت خوبتون و همینطور برنامه راه اندازی این سنسور تشکر میکنم چطور میتونم از وقفه این سنسور توی برنامه استفاده کنم
سلام خسته نباشید میخواستم بدونم اگه بجای یک سنسور ds18b20 بخوام سه عدد سنسور بگذارم باید چیکارکنم
سلام, هر کدام از این سنسورها یک کد شناسایی کارخانه ای دارن، که باید ابتدا یک دستور شناسایی برای همه سنسورها بفرستیم تا خودشان را معرفی کنند! سپس در برنامه به کمک کدهایی شناسایی هر سنسوری را که خواستیم, میتونیم صدا بزنیم و دمایی ان را بخوانیم! در اینده حتما این پروژه رو قرار میدم