- دوشنبه ۲۰ آذر ۱۴۰۲
راه اندازی سنسور دمای DS18B20 بهصورت تکسنسوره و چندسنسوره با CodevisionAVR
راهاندازی سنسور دمای DS18B20 بهصورت تکسنسوره و چندسنسوره با CodevisionAVR
سنسور DS18B20 یک سنسور دمای دیجیتال ارزانقیمت و دقیق است که میتوان از آن برای سنجش دمای محیطهای گوناگون استفاده کرد. این سنسور دقتی برابر ۱۲بیت و حدود ۰.۰۶۲۵ درجه سانتیگراد دارد و طبق اطلاعات ارائهشده توسط شرکت سازنده، میتواند دمای بین ۵۵- تا ۱۲۵+ درجه سانتیگراد را اندازهگیری کند. برای اتصال DS18B20 به میکروکنترلر، از پروتکل یکسیمه (One Wire) استفاده میشود. از آنجایی که هر کدام از سنسورهای DS18B20 آدرس اختصاصی خود را دارند، میتوان تا ۸ سنسور را از طریق یک سیم کنترل کرد و دمای هر کدام از این سنسورها را بهصورت مجزا توسط میکروکنترلر خواند.
هدف آزمایش
در این آزمایش قصد داریم ابتدا یک سنسور دمای DS18B20 را به میکروکنترلر Atmega32 متصل کنیم و سپس با کامپایلر کدویژن، برنامه مربوط به آن را جهت قرائت دما و نمایش آن بر روی السیدی کاراکتری تهیه کنیم.
در مرحله بعد به جای یک سنسور دما، هشت سنسور را به میکرو متصل میکنیم و برنامهای مینویسیم که با نگه داشتن کلیدی که به میکرو متصل است، بهترتیب دمای سنسورهای ۱ تا ۸ را بر روی السیدی کاراکتری نمایش دهد. همچنین در این آزمایش از نرمافزار پروتئوس برای شبیهسازی مدار استفاده خواهیم کرد.
وسایل مورد نیاز
میکروکنترلر Atmega32، سنسور دمای DS18B20، مقاومت ۴.۷ کیلواهم، السیدی کاراکتری، پتانسومتر ۱۰ کیلواهم برای تنظیم کنتراست السیدی، برد برد، سیم برد بردی
برنامه نویسی و راه اندازی میکرو کنترلر AVR
بخش اول: راهاندازی سنسور DS18B20 بهصورت تکسنسوره (Single)
ابتدا مدار مورد نظر را مانند تصویر زیر در نرمافزار پروتئوس پیادهسازی میکنیم. برای اتصال سنسور دما، پایهای که قرار است برای دادههای سنسور اختصاص دهیم، حتماً باید با یک مقاومت ۴.۷ کیلواهم Pull-Up شود. تغذیه و زمین از بخش Generator Mode و Terminal mode آورده شدهاند.
نرمافزار کدویژن را باز کرده و Wizard را اجرا میکنیم.
در پنجره بازشده برای انتخاب Target، گزینه اول را انتخاب کرده و بر روی OK کلیک میکنیم تا وارد محیط Wizard شویم.
در Wizard ابتدا چیپ مورد نظر خود را که در اینجا Atmega32 است انتخاب کرده و سپس در قسمت Clock، فرکانس کاری میکرو را تعیین میکنیم. در این پروژه میخواهیم میکرو با فرکانس داخلی ۸ مگاهرتز کار کند، بنابراین Clock را بر روی 8/000000 MHz تنظیم میکنیم.
برای راهاندازیِ السیدی، از بخش Alphanumeric LCD گزینه Enable Alphanumeric LCD Support را فعال میکنیم. از آنجایی که السیدی استفادهشده ۱۶کاراکتری است، Characters/Line را روی ۱۶ قرار میدهیم.
بخش آخر تنظیمات مربوط به راهاندازی DS18B20 است. برای این کار به بخش 1 Wire Bus Interface رفته و از قسمت 1 Wire Port، پورتی را که سنسور به آن متصل است انتخاب میکنیم. در اینجا ما سنسور را به PORTB متصل کردهایم. در قسمت Data Bit، شماره پایهای را که سنسور به میکرو متصل شده است انتخاب میکنیم که برای ما پایه صفر پورت B است. درنهایت از بخش DS1820/DS18B20 گزینه Enable را فعال میکنیم.
حال نوبت به ذخیرهسازی و Generate کردن پروژه میرسد. برای این کار از منوی Program در کدویزارد گزینه Generate, Save and Exit را انتخاب میکنیم.
برنامه نویسی و راه اندازی میکرو کنترلر AVR
درنهایت هنگام ذخیرهسازی فایلها برای آنها اسم انتخاب کرده و Save میکنیم. در اینجا فایل .c را به نام main ذخیره کردهایم.
بعد از باز شدن فایل .c که در اینجا برای ما main.c است، ابتدا باید کتابخانه سنسورِ دما را اصلاح کنیم. ما از سنسور DS18B20 استفاده میکنیم، بنابراین #include را به #include تغییر میدهیم. حال برنامه را Build میکنیم تا فایل ds18B20.h توسط کامپایلر به پروژه اضافه شود.
بعد از Build کردن برنامه، در قسمت Code Navigator در سمت چپ، ds18B20.h توسط کامپایلر لود شده و نمایان میشود. با کلیک بر روی آن میتوانید توابع این کتابخانه را مشاهده کنید. برای خواندن مقدار دما، تابع ds18b20_temperature که خروجی آن به صورت Float است مورد استفاده قرار خواهد گرفت.
مانند تصویر زیر، در فایل main.c کتابخانههای delay.h و stdio.h را اضافه میکنیم. همچنین متغیرهای Temp از نوع Float را جهت انتقال مقادیر خواندهشده از سنسور تعریف میکنیم. همچنین آرایه رشتهای str را جهت تبدیل مقادیر عددی به رشته برای نمایش بر روی السیدی کاراکتری در برنامه تعریف میکنیم.
حال برای نوشتن ادامه برنامه به حلقه اصلی میرویم. تابع ds18b20_temprature دارای یک ورودیِ آدرس است. از آنجایی که هدف ما در این بخش راهاندازی یک تک سنسور است، ورودی این تابع را مقدار صفر قرار میدهیم. در آخر برای انتقال خروجی این تابع، آن را برابر با متغیر Temp که پیشتر آن را تعریف کرده بودیم قرار میدهیم.
از تابع sprintf جهت تبدیل مقدار Float به رشته استفاده کرده و مقدار متغیر Temp را بهصورت دورقمی با دو رقم اعشار از طریق دستور 4.2f به متغیر رشتهای str تبدیل و منتقل میکنیم. اگر میخواهید مقادیر سهرقمی نیز قابل چاپ بر روی السیدی باشند، کافی است بهجای عبارت 4.2f از 5.2f در تابع sprint استفاده کنید.
درنهایت با دستور lcd_gotoxy(0,0) به ابتدای سطر اول السیدی میرویم و از طریق دستور lcd_puts(str) مقادیر دما را بر روی السیدی چاپ میکنیم. حال به محیط پروتئوس میرویم و با دو بار کلیک بر روی میکرو، برنامه را به میکرو لود کرده و همچنین فرکانس داخلی میکرو را بر روی 8Mhz داخلی تنظیم میکنیم.
شبیهسازی را در پروتئوس اجرا میکنیم. برای تغییر دما از دو کلیدِ قرمزرنگ و فلشمانند بر روی سنسور استفاده کنید.
برای بالاتر بردن دقت سنسورِ DS18B20 در پروتئوس و تولید مقادیر اعشاری کافی است بر روی سنسور DS18B20 کلیک راست، و سپس کلیک چپ کرده تا پنجره تنظیمات سنسور باز شود. با قرار دادن مقادیر ۰.۱ یا ۰.۰۱ در قسمتِ Granularity میتوان دقت اعمالِ دما بر روی سنسور را افزایش داد.
بخش دوم: راهاندازی سنسور DS18B20 بهصورت چندسنسوره (Multiple)
در این بخش به راهاندازیِ تعداد بیشتری سنسور دمای DS18B20 بهصورت همزمان بر روی یک پین میکرو خواهیم پرداخت. مطابق تصویر زیر مدار را در نرمافزار پروتئوس میبندیم.
در این مدار یک کلید به پایه PB1 اضافه کردیم تا با هر بار فشردن آن، دمای نمایشدادهشده بر روی السیدی که مرتبط با هر سنسور است بهصورت چرخشی عوض شود. به صورت پیشفرض دمای سنسور اول بر روی نمایشگر نشان داده خواهد شد. سپس با هر بار فشردن کلید، دمای سنسور دوم و به همین ترتیب تا سنسور هشتم نمایش داده میشوند.
مطابق بخش قبلی، پیکربندیهای مربوط به انتخاب چیپ و السیدی را در کدویزارد انجام میدهیم و به بخش مربوط به تنظیمات One Wire میرویم. تنظیمات را مانند دفعه قبل انجام میدهیم، با این تفاوت که این بار گزینه Multiple Devices را نیز فعال میکنیم. در آخر، پروژه را Generate کرده و Save میکنیم.
مانند تصویر زیر مجدداً در فایل main.c کتابخانهها را اضافه میکنیم. همچنین حرف B را نیز در کتابخانه ds1820 اضافه میکنیم. کدویژن بهصورت پیشفرض یک تعریف #define MAX_DS1820 8 ایجاد میکند که ماکزیمم تعداد سنسورهای DS18B20 را که به میکرو میتوانیم متصل کنیم نشان میدهد.
در حال حاضر این تعریف برای ۸ سنسور تنظیم شده است. اگر تعداد سنسورهایی که به میکرو متصل کردهاید کمتر باشد، میتوانید عدد متناظر با تعداد سنسورهای مدنظر خود را بهجای عدد ۸ قرار دهید. در قسمت بعدیِ کد، یک متغیر به نام ds1820_devices بهصورت پیشفرض تعریف شده است که آدرس سنسورهای DS18B20 در آن قرار میگیرد.
کمی پایینتر یک آرایه به نام ds1820_rom_codes[MAX_DS1820][9] بهصورت پیشفرض توسط کدویژن ایجاد شده است که تمامی آدرسهای مربوط به سنسورها در این آرایه ذخیره میشوند. در تصویر زیر، یک آرایه به نام Temp با ۸ خانه جهت ذخیرهسازی مقادیر دمای سنسورها تعریف کردهایم. همچنین یک متغیر از نوع i بهعنوان شمارنده جهت گزینش سنسورها توسط کلید تعریف شده است.
از طریق دستور ds1820_devices=w1_search(0xf0,ds1820_rom_codes) که بهصورت پیشفرض توسط کدویژن در فایل .c ایجاد شده است، عملیات جستجوی آدرسهای سنسورهای DS18B20 انجام شده و در آرایه ds1820_rom_codes ذخیره میشود.
حال مجدداً با استفاده از تابع ds18B20_temprature میتوانیم مقادیر سنسورها را بخوانیم، با این تفاوت که برای ورودی این تابع بهجای عدد صفر، آرایه ds18B20_rom_codes را که حاویِ آدرسهای سنسورهاست قرار میدهیم.
برنامه را Build کرده و در محیط پروتئوس با دو بار کلیک روی میکرو، برنامه را لود میکنیم. در محیط پروتئوس بر روی سنسورهای دما یک بار کلیک راست و سپس کلیک چپ میکنیم تا پنجره تنظیمات سنسور باز شود. منوی Automatic Serialization را باز کرده و آن را بر روی Yes قرار میدهیم. این تنظیم را باید برای تمامی سنسورها اعمال کرد.
حال با نگه داشتن کلید در پروتئوس، دمای سنسورها بهترتیب بر روی السیدی نمایش داده خواهد شد.
میتوانید از طریق لینک راهاندازی سنسور DS18B20 بهصورت تکسنسوره و چندسنسوره، پروژه را به همراه فایل شبیهسازی پروتئوس دانلود کنید.
جمعبندی
در این مطلب ویژگیهای سنسور دمای DS18B20 را که یکی از پرکاربردترین سنسورهای دما در پروژههای الکترونیکی و صنعتی است، معرفی میشود و نحوه راهاندازی این سنسور با میکروکنترلر AVR و کامپایلر کدویژن بهصورت تکسنسوره و چندسنسوره در محیط پروتئوس شرح داده خواهد شد.
نویسنده : دکتر آرش فتاحی
مجتمع فنی تهران : دوره آموزش برنامه نویسی و راه اندازی میکرو کنترلرAVRرا در دو سطح مقدماتی و پیشرفته به صورت تخصصی و عملی آموزش می دهد.
تلفن مشاوره : ۲۲۰۶۰۵۸۶-۰۲۱