راه اندازی سنسور DS18B20 توسط AVR و اتمل استودیو

راه اندازی سنسور DS18B20 توسط AVR و کامپایلر اتمل استودیو:
سنسور دمای DS18B20 چیست و چگونه کار می کند:
سنسور دمای DS18B20 یک سنسور دمای بسیار دقیق دیجیتال می باشد که در پیکج های مختلف در بازار ارائه می شود. این سنسور هم به صورت پیکج ضد آب و هم به صورت یک قطعه با پیکج TO-92 عرضه می شود. دقت اندازه گیری دما در این سنسور 0.5 درجه سانتی گراد و بازه اندازه گیری دما در این سنسور بین -55 تا +125 درجه سانتی گراد می باشد. سنسور DS18B20 برای استفاده در مصارف تجاری و صنعتی یک گزینه بسیار مناسب می باشد.
در شکل زیر Pinout این سنسور نشان داده شده است.
مزایا و ویژگی های سنسور دمای DS18B20:
-
استفاده از پروتکل ویژه یک سیمه (1-Wire) شرکت دالاس و تنها نیاز به یک پین از پورت برای ارتباط
-
کاهش قطعات مورد نیاز با مجتمع سازی سنسور و استفاده از حافظه EEPROM
-
اندازه گیری دما از -55 درجه سانتی گراد تا +125 درجه سانتی گراد
-
دقت ±0.5 درجه سانتی گراد از -10 درجه سانتی گراد تا +85 درجه سانتی گراد
-
رزولیشن قابل برنامه ریزی بین 9 بیت تا 12 بیت
-
بدون نیاز به قطعات جانبی
-
عملکرد در حالت تغذیه پارازیتی تنها با استفاده از دو پین (DQ وGND )
-
ساده سازی کاربردهای اندازه گیری دمای توزیع شده توسط قابلیت Multidrop
-
هر سنسور یک کد سریال خاص 64 بیتی دارد که در رام خود سنسور قرار گرفته است
-
قابلیت تنظیم زنگ هشدار برای محدوده دمایی خاص که توسط کاربر تعریف می شود و با قطع تغذیه از بین نمی رود
کابرد های سنسور دمای DS18B20 و راه اندازی سنسور دمای DS18B20:
-
کنترل های دمایی
-
سیستم های دماسنج صنعتی
-
سیستم های حساس به حرارت با دقت بالا
-
استفاده به عنوان دماسنج
-
استفاده در انواع سیستم های گلخانه ای
نکته:
برای ارتباط با سنسور دمای DS18B20 یک پین از میکروکنترلر را اختصاص می دهیم. این پین با یک مقاومت 4.7 کیلو اهم باید بالا کش (Pull Up) شود (باید به تغذیه 5 ولت متصل گردد).
در شکل زیر شماتیک یا فایل شبیه سازی راه اندازی سنسور دمای DS18B20 با میکروکنترلر Atmega16 را مشاهده می کنید.
سخت افزار مورد نیاز برای راه اندازی این سنسور چیست؟
سنسور دمای DS18B20 با سخت افزار یا پروتکل تک سیمه یا One Wire یا 1-Wire براحتی قابل راه اندازی می باشد. در پروتکل وان وایر یا تک سیمه ارسال و دریافت اطلاعات و کلاک پالس مورد نیاز، بین دو واحد سخت افزاری ( به طور مثال میکروکنترلر و سنسور دما) تنها با استفاده از یک پین صورت می گیرد. پروتکل یک سیمه یا 1-Wire توسط شرکت دالاس (Dallas) طراحی و ارائه شده است.
واسط ارتباطی تک سیمه یا 1-Wire شرکت دالاس برای راه اندازی سنسور دمای DS18B20:
پروتکل 1-Wire یک واسط ارتباطی طراحی شده توسط شرکت دالاس می باشد. که سرعت انتقال دیتای در آن پایین و سیگنال و تغذیه تنها توسط یک پین صورت می گیرد. ایده 1-Wire تقریبا شبیه به پروتکی I2C می باشد، اما فرق آن مسافت ارتباطی زیادتر و سرعت انتقال دیتای پایین می باشد. این پروتکل برای ارتباط با قطعات ارزان قیمت کوچک مانند سنسور های دیجیتال قابل استفاده می باشد. مدار عمومی از یک Master مانند میکروکنترلر که انتقال دیتا را راه اندازی اولیه می کند و یک یا چند عدد Slave مانند سنسور DS18B20 تشکیل شده است.
به صورت فیزیکی مانند I2C، باس 1-Wire مانند یک مدار Open-Collector به صورت پسیو در منطق بالای لاجیکی با یک مقاومت نگه داشته می شود. طبق استاندارد، پروتکل زمانی فعال می شود که، میکروکنترلر خط دیتا را در سطح منطقی صفر قرار دهد. برای ارتباط با سنسور در زیر یک پین از میکروکنترلر در نظر گرفته شده است.
1 2 3 4 5 6 7 |
#define SENSOR_PORT PORTA #define SENSOR_DDR DDRA #define SENSOR_PIN PINA #define SENSOR_BIT PA0 |
برای شروع انتقال دیتا ، میکروکنترلر باس انتقال دیتا را باید، به مدت 480 میکرو ثانیه در منطق صفر قرار دهد. سپس میکروکنترلر باید به مدت 60 میکروثانیه صبر کند تا سنسور خط دیتا را برابر صفر کند تا نشان دهد که آماده به کار شده است. در واقع این توالی هر کدام از Slave هایی که در باس قرار دارند را ریست خواهد کرد و هر کدام با صفر کردن خط باس ، سیگنال حضور خود را اعلام می کند.
دستورالعمل برای عملیات ریست به صورت زیر می باشد:
- خط خروجی دیتا به صورت خروجی تنظیم می شود و در منطق صفر قرار داده می شود
- 480 میکرو ثانیه باید منتظر ماند
- خط دیتا آزاد می شود
- 60 میکرو ثانیه باید منتظر ماند
- برای دریافت پاسخ Slave های موجود ، مقدار منطقی خط را قرائت می کنیم
- برای دریافت پاسخ مابقی Slave ها منتظر می مانیم
تنها قسمت مهم در این بخش تاخیر میکرو ثانیه می باشد که باید دقیق باشد. در کامپایلر اتمل استودیو در هدر util/delay.h انواع تاخیر دقیق آماده استفاده می باشد. که در از آن برای ایجاد تاخیر مورد نیاز استفاده خواهیم کرد. فرکانس کاری استفاده شده برای میکروکنترلر در این آموزش برابر 8 مگا هرتز می باشد. کد قسمت ریست کردن سنسور در زیر آورده شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
byte ds18b20_reset() { byte i; THERM_OUTPUT(); // set pin as output THERM_LOW(); // pull pin low for 480uS _delay_us(480); THERM_INPUT(); // set pin as input _delay_us(60); // wait for 60uS i = THERM_READ(); // get pin value _delay_us(420); // wait for rest of 480uS period return i; } |
نوشتن یک بیت در Slave نیز توسط یک پروتکل زمانی خاص صورت می گیرد.هر قالب زمانی دارای 60 میکرو ثانیه طول دارد و زمانی شروع می شود، که Master خط دیتا را به مدت 1 میکرو ثانیه برابر صفر قرار دهد. برای نوشتن یک منطقی روی خط دیتا، میکروکنترلر کافی است که خط دیتا را به صورت Float قرار دهد. در این حالت (به دلیل وجود مقاومت 4.7 کیلو اهم بالاکش) اتوماتیک یک منطقی روی خط قرار می گیرد. برای نوشتن صفر منطقی روی خط میکروکنترلر یا Master خروجی خود را برابر صفر قرار می دهد. در زیر قالب نوشتن یک بیت روی سنسور آورده شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void ds18b20_writeBit(byte bit) { THERM_OUTPUT(); // set pin as output THERM_LOW(); // pull pin low for 1uS _delay_us(1); if (bit) { THERM_INPUT(); // to write 1, float pin } _delay_us(60); THERM_INPUT(); // wait 60uS & release pin } |
خواندن یک بیت از روی خط نیز یک قالب زمانی 60 میکرو ثانیه دارد. مجددا مستر خط دیتا را به مدت 1 میکرو ثانیه برابر صفر قرار می دهد. سپس مستر 14 میکروثانیه دیگر، قبل از خواندن دیتا از روی خط منتظر می ماند.
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 |
byte ds18b20_readBit() { byte bit=0; THERM_OUTPUT(); // set pin as output THERM_LOW(); // pull pin low for 1uS _delay_us(1); THERM_INPUT(); // release pin & wait 14 uS _delay_us(14); if (THERM_READ()) { bit=1; // read pin value } _delay_us(45); // wait rest of 60uS period return bit; } |
خواندن و نوشتن یک بایت، معادل با 8 بار عملیات بیتی می باشد.
یکی از بزرگترین مزیت های این پروتکل سخت افزاری نسبت به ارتباط سریال (UART ) و یا SPI افزایش طول سیم ارتباطی تا ماکزیمم 30 متر می باشد. این سخت افزار در عمده میکروکنترلر ها به صورت پیشفرض وجود دارد. در برخی مواقع که سخت افزار One Wire میکروکنترلر برای راه اندازی یک قطعه یا سنسور دیگر استفاده شده باشد ، براحتی می توانیم پروتکل One Wire را به صورت نرم افزاری ایجاد کنیم. که در بالا توضیح داده شد.
در این پروتکل برای شناسایی و مجزا کردن سخت افزار های موجود در یک سیستم به هر سخت افزار یک ID با ماکزیمم طول 8 بایت یا 64 بیت به عنوان آدرس اختصاص داده می شود.
در این آموزش برای راه اندازی سنسور دمای DS18B20 یک درایور نوشته شده است که پروتکل 1-Wire را به صورت نرم افزاری پیاده سازی می کند. از مزیت های این درایور، انتخاب هر پین به صورت دلخواه برای ارتباط با سنسور می باشد. در واقع شما با هر پین از میکروکنترلر که در دسترس باشد، براحتی می توانید با این سنسور ارتباط برقرار کنید و مقدار دمای محیط را توسط این سنسور بدست بیاورید.
در زیر برنامه نوشته شده در حلقه اصلی برنامه (main.c) راه اندازی سنسور دمای DS18B20 توضیح داده شده است.
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 |
//---------------------------------------- // Main Initialization //---------------------------------------- // Initialize Hardwares hardwares_Init(); //در این قسمت سخت افزار های داخلی میکروکنترلر تماما غیر فعال می گردند. // Initialize IO io_Init(); //در این قسمت ورودی-خروجی های میکروکنترلر تنظیم اولیه می شوند. // Initialize liquid crystal lcd_Init(LCD_DISP_ON); // نمایشگر ال سی دی راه اندازی اولیه شده و ورودی خروجی های آن تنظیم می شود lcd_Clear(); // تمامی کارکتر های نمایش داده شده روی صفحه نمایش پاک می شوند lcd_GoHome(); // نمایشگر خط نوشتن یا کرسر وارد اولین خانه می شود lcd_PutSF("Welcome..."); // کلمه خوش آمد گویی روی نمایشگر نوشته می شود _delay_ms(1000); // برای نمایش صحیص یک ثانیه تاخیر اضافه می گردد // Start conversion (without ROM matching) ds18b20_convert( &SENSOR_PORT, &SENSOR_DDR, &SENSOR_PIN, (1<<SENSOR_BIT), NULL ); // Delay (sensor needs time to perform conversion) _delay_ms( 100 ); // Read temperature (without ROM matching) ds18b20_read( &SENSOR_PORT, &SENSOR_DDR, &SENSOR_PIN, (1<<SENSOR_BIT), NULL, &temparature ); // Blink heart beat to indicate alive HB_LED_On(); //در این قسمت دیود نورانی متصل شده به میکروکنترلر یک چشمک یا بلینک می کند _delay_ms(50); HB_LED_Off(); _delay_ms(50); //---------------------------------------- |
در زیر برنامه نوشته شده در حلقه بی نهایت (Loop اصلی) برنامه توضیح داده شده است.
در حلقه اصلی مقدار دمای سنسورهای یک و دو هر 200 میلی ثانیه یک بار خوانده می شوند و روی نمایشگر نشان داده می شوند.
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 |
//---------------------------------------- // Infinity loop process //---------------------------------------- while(1) { //--------------------------------------------------------------------------------------------- // Show loop counter in lcd lcd_Clear(); lcd_GoHome(); lcd_PutSF("Loop Counter:"); itoa(loopCntr , tempStr , 10); lcd_PutS(tempStr); lcd_Gotoxy(0,1); //----------------------------------------------------------------------------------------------- // Read sensor 1 value // Start conversion (without ROM matching) ds18b20_convert( &SENSOR1_PORT, &SENSOR1_DDR, &SENSOR1_PIN, (1<<SENSOR1_BIT), NULL ); // Delay (sensor needs time to perform conversion) _delay_ms( 100 ); // Read temperature (without ROM matching) ds18b20_read( &SENSOR1_PORT, &SENSOR1_DDR, &SENSOR1_PIN, (1<<SENSOR1_BIT), NULL, &temparature1 ); //----------------------------------------------------------------------------------------------- // Read sensor 2 value // Start conversion (without ROM matching) ds18b20_convert( &SENSOR2_PORT, &SENSOR2_DDR, &SENSOR2_PIN, (1<<SENSOR2_BIT), NULL ); // Delay (sensor needs time to perform conversion) _delay_ms( 100 ); // Read temperature (without ROM matching) ds18b20_read( &SENSOR2_PORT, &SENSOR2_DDR, &SENSOR2_PIN, (1<<SENSOR2_BIT), NULL, &temparature2 ); //-------------------------------------------------------------- // Show sensor 1 value sprintf(tempStr , "S1:%d'C , " , (temparature1/16)); lcd_PutS(tempStr); str_null(tempStr , MAX_STRING_SIZE); //-------------------------------------------------------------- // Show sensor 2 value sprintf(tempStr , "S2:%d'C" , (temparature2/16)); lcd_PutS(tempStr); str_null(tempStr , MAX_STRING_SIZE); //--------------------------------------------------------------------------------------------- //------------------------------------------ if (loopCntr > 1000) { loopCntr = 0; } else { loopCntr++; } //------------------------------------------ //------------------------------------------ // Blink heart beat to indicate alive HB_LED_Tgl(); _delay_ms( 200 ); //------------------------------------------ } |
برای دانلود فایل سورس کد و فایل شبیه سازی راه اندازی سنسور DS18B20 توسط AVR و اتمل استادیو روی لینک زیر کلیک کنید.
دانلود فایل سورس کد و فایل شبیه سازی راه اندازی سنسور DS18B20 توسط AVR و اتمل استادیو
بسیار ممنون از آموزش های مفیدتون.
ممنون از انرژی مثبت شما.
با این سورس کد میشه مقدار دمای شش تا سنسور رو دریافت کرد؟؟؟؟
با سلام خدمت شما.
توی برنامه توضیح داده شده کافیه به تعداد سنسور های دما پین توی میکروکنترلر تعریف بشه و طبق الگوی برنامه مقادیر سنسور قرائت بشه.