یکی از سادهترین و ارزانترین راهها برای اندازه گیری کمیت دما توسط میکروکنترلر در پروژه ها ، استفاده از سنسور دمای یک سیم DS18B20 است. این سنسورها نسبتاً دقیق هستند و برای عملکرد به اجزای خارجی نیاز ندارند. بنابراین، تنها با چند اتصال و مقداری کد نویسی ، قادر خواهید بود در کمترین زمان دما را اندازه گیری کنید.
من چند سنسور دما را در گذشته راه اندازی کرده ام و آموزش و کد راه اندازی آن را در سایت قرار داده ام ، مانند SHT1x SHT2x , SHT3x، DHT11 ، DHT22 . امروز در این آموزش نحوه اتصال سنسور دمای DS18B20 را خواهیم دید.
موضوعاتی که در این مقاله به آنها پرداخته خواهد شد :
سنسور دمای DS18B20 با پروتکل 1wire یا یک سیمه
DS18B20 یک سنسور دما واسط 1 سیمه است که توسط شرکت Dallas Semiconductor Corp تولید شده است. رابط 1-Wire® منحصر به فرد برای برقراری ارتباط دو طرفه با میکروکنترلر فقط به یک پایه دیجیتالی احتیاج دارد.
سنسور دمای ds18b20 معمولاً در دو شکل در بازار وجود دارد. یکی به شکل پکیج TO-92 دقیقاً شبیه یک ترانزیستور معمولی است. یکی دیگر از آنها درون یک قلاف ضد آب است که در صورت نیاز به اندازه گیری چیزهایی زیر آب یا زیر زمین می تواند مفیدتر باشد.
سنسور دمای DS18B20 نسبتاً دقیق است و برای کار کردن به هیچگونه اجزای خارجی احتیاج ندارد. این می تواند دما را از -55 درجه سانتیگراد تا 125+ درجه سانتی گراد با دقت ± 0.5 درجه سانتیگراد اندازه گیری کند.
وضوح سنسور دما با تنظیمات 9 ، 10 ، 11 یا 12 بیت توسط کاربر قابل تنظیم است. با این حال ، وضوح پیش فرض در هنگام روشن شدن 12 بیت است (یعنی دقت 0.0625 درجه سانتیگراد).
دارای عملکرد هشدار یا آلارم با نقاط حد بالایی TH و پایینی TL غیرفرار قابل برنامه ریزی توسط کاربر است.
سنسور را می توان با منبع تغذیه 3.3 ولت تا 5 ولت تغذیه کرد و در هنگام تبدیل دما فقط 1 میلی آمپر مصرف می کند.
در اینجا مشخصات کامل وجود دارد:
منبع تغذیه | 3.3 ولت تا 5 ولت |
مصرف جریان | 1 میلی آمپر |
محدوده دما | -55 تا 125 درجه سانتی گراد |
دقت | ± 0.5 درجه سانتیگراد |
وضوح | 9 تا 12 بیت (قابل انتخاب) |
زمان تبدیل | <750 میلیثانیه |
پایه های سنسور دمای ds18b20
- GND پین زمین است.
- DQ یک گذرگاه داده 1 سیمی است که باید به یک پین دیجیتال روی میکروکنترلر متصل شود. همچنین باید مقاومت کششی یا پول آپ 4.7k را بین سیگنال و پین تغذیه اضافه کنید تا انتقال داده پایدار باشد. (به پول آپ داخلی میکروکنترلر اکتفا نکنید)
- VDD تغذیه سنسور را تامین می کند که می تواند از 3.3 تا 5 ولت باشد.
راه اندازی چند سنسور دمای ds18b20 توسط پروتکل 1wire
یکی از بزرگترین مزایای DS18B20 این است که چندین DS18B20 می توانند در همان گذرگاه 1 سیم وجود داشته باشند. از آنجا که هر DS18B20 کد سریال 64 بیتی یونیک و منحصر به فردی دارد که در کارخانه بر روی حافظه سنسور نوشته شده است ، تمایز آنها از یکدیگر آسان است.
این ویژگی می تواند یک مزیت بزرگ باشد وقتی شما می خواهید تعداد زیادی از DS18B20 های توزیع شده در یک محیط بزرگ را کنترل کنید.
بررسی ROM 64 Bit سنسور ds18b20
اگر بایت اول 0x10 باشد برای DS18S20 ، اگر 0x22 باشد برای DS1822 و اگر مقدار 0x28 باشد برای DS18B20 خواهد بود و چون در این مثال ما از سنسور ds18b20 استفاده کرده ایم بنابراین بایت اول ROM سنسور ما باید مقدار 0x28 هگز باشد .
تعداد 6 بایت یا 48 بیت بعدی یک شماره سریال منحصر به فرد است .
DS18B20 دارای یک CRC 8 بیتی است که در آخرین بایت یا بایت MSB رام 64 بیتی ذخیره شده است. در DS18B20 برای تعیین اینکه آیا داده های ROM بدون خطا توسط میکروکنترلر دریافت شده است یا خیر ، میکروکنترلر می تواند یک مقدار CRC را از 56 بیت اول ROM 64 بیتی محاسبه کرده و آن را با مقدار ذخیره شده در بایت آخر ROM مقایسه کند.
حافظه scratchpad سنسور ds18b20
اسکراچ پد حافظه ای است که در آن تمام اطلاعات، داده ها و تنظیمات در سنسور ذخیره می شود.
حافظه Scratchpad حاوی 9 بایت است:
بایت 0 و بایت 1 اسکرچ پد به ترتیب حاوی LSB و MSB ثبت دما هستند که خروجی دیجیتال مقدار دما را ذخیره می کنند. این بایت ها فقط خواندنی هستند.
بایت های 2 و 3 دسترسی به رجیسترهای هشدار دهنده دمای بالا و پایین TH و TL را فراهم می کنند.
بایت 4 حافظه اسکرچ پد حاوی رجیستر پیکربندی یا Configuration Register است که مطابق شکل زیر سازماندهی شده است. کاربر می تواند وضوح تبدیل DS18B20 را با استفاده از بیت های R0 و R1 در این ثبات همانطور که در جدول نشان داده شده است تنظیم کند. پیش فرض این بیت ها R0 = 1 و R1 = 1 (رزولوشن 12 بیت) است.
توجه داشته باشید که یک معادله زمانی مستقیم بین وضوح تبدیل و زمان تبدیل وجود دارد که در جدول مشاهده می کند مثلا حداقل مدت زمان لازم برای عملیات تبدیل دما برای وضوح 12 بیتی برابر 750ms میلی ثانیه می باشد . بیت 7 و بیت های 0 تا 4 در رجیستر پیکربندی برای استفاده داخلی توسط دستگاه محفوظ است و نمی توان آنها را رونویسی کرد. بنابراین واضح است که بیت های 0، 1، 2، 3، 4، 7 استفاده نمی شوند، فقط از دو بیت، 5 و 6 برای تنظیم وضوح تبدیل یا وضوح اندازه گیری دما استفاده می شود.
بایت های 5، 6 و 7 برای استفاده داخلی توسط دستگاه رزرو شده اند و نمی توان آنها را رونویسی کرد.
بایت 8 اسکرچ پد فقط خواندنی است و حاوی کد CRC برای بایت های 0 تا 7 اسکرچ پد است.
رجیسترهای TH، TL و Configuration Register که قابلیت نوشتن بر روی آنها وجود دارد ، دارای یک حافظه غیرفرار EEPROM نیز می باشند ، برای مواقعی که دستگاه خاموش می شود ، دادهها را حفظ کنند.
روشهای خواندن چند سنسور DS18B20 بر روی یک گذرگاه
دو روش برای خواندن چندین DS18B20 متصل به یک باس وجود دارد.
- توسط Index : در این روش، از یک شاخص (که توسط کتابخانه اختصاص داده شده است) برای تعیین دقیق هر سنسور و خواندن دمای آن استفاده می کنیم.
- توسط Address : در این روش، با بهره گیری از این واقعیت که هر سنسور دارای آدرس 64 بیتی منحصربه فرد خود (از پیش برنامه ریزی شده) است، هر سنسور را جداگانه می خوانیم.
روش خواندن DS18B20 با Index
در این روش هنگامی که برنامه ، سنسور دما را مقداردهی اولیه می کند ، گذرگاه را برای همه سنسورهایی که در یک گذرگاه هستند اسکن می کند. کل گذرگاه را آرایه ای از حسگرها در نظر می گیرد و به هر کدام یک شاخص یا index اختصاص می دهد.
به این ترتیب اولین سنسوری که بر روی گذرگاه شناسایی می شود 64 بیت آدرس یونیک آن خوانده می شود و در اولین آرایه ذخیره می شود و index آن 1 در نظر گرفته می شود و به همین ترتیب سنسور بعدی که شناسایی می شود ، آدرس آن در آرایه بعدی ذخیره می شود و یک index به آن اختصاص داده می شود . در نتیجه، میتوانیم هر سنسور را با index آن شناسایی کنیم و دمای آن را بخوانیم.
در این روش ممکن است بعد از هر بار ریست شدن مدار یا قطع و وصل تغذیه یا تعویض سنسور معیوب با سنسور جدید ، ترتیب شناسایی شدن سنسورها و index آنها عوض شود . اما مزیت این روش این است اگر سنسوری معیوب شود و با سنسور جدید جایگزین شود بدون نیاز به تغییرات در برنامه نویسی ، مقدار سنسور خوانده می شود .
روش خواندن DS18B20 با Address
هر DS18B20 با یک آدرس 64 بیتی منحصر به فرد ، در زمان ساخت توسط کارخانه سازنده برنامه ریزی شده است که به آنها اجازه می دهد از یکدیگر متمایز شوند . بنابراین ما ابتدا از یک برنامه برای یافتن و ثبت آدرس 64 بیتی منحصر به فرد هر سنسور استفاده می کنیم و آدرس بدست آمده را یادداشت می کنیم . و سپس آدرسهایی که یادداشت کردیم را در برنامه دیگری که برای خواندن هر سنسور به صورت جداگانه نوشتیم ، استفاده خواهیم کرد .
برای اینکار ما برنامه ای نوشتیم که ابتدا تمام DS18B20 ها را در گذرگاه شناسایی می کند و آدرس های آنها را به صورت یک آرایه در پورت سریال چاپ میکند در مرحله بعد ما باید آدرس های منحصر به فرد هر سنسور را کپی کنیم و از آنها در برنامه استفاده کنیم.
در این مثال ما از چهار سنسور دمای ds18b20 بر روی یک گذرگاه استفاده کرده ایم و در تصویر مشاهده می کنید که آدرس هر چهار تا سنسور به صورت یک آرایه قابل استفاده در برنامه در پورت سریال چاپ شده است . توصیه می شود هر بار فقط یک سنسور را به مدار متصل کنید تا بتوانید آدرس هر سنسور را پیدا کرده و نامی برای آن اختصاص دهید و همان نام را هم بر روی سنسور علامت بزنید .
راه اندازی ds18b20 با bascom
این پروژه شامل راه اندازی 4 عدد سنسور دمای ds18b20 می باشد که بر روی یک سیم و توسط پروتکل 1wire انجام شده است . مقادیر خوانده شده از سنسورها بر روی نمایشگر lcd کاراکتری نمایش داده می شود . مقادیر قرائت شده از سنسورها توسط الگوریتم CRC8 چک می شود اگر خطا وجود داشته باشد ، عبارت ERROR بر روی lcd کاراکتری نمایش داده می شود .
راه اندازی ds18b20 با codevision
در این پروژه همانطور که در شکل زیر مشخص شده است ابتدا هدرفایل های کتابخانه با پسوند .h را به برنامه include می کنیم . فایلهای کتابخانه درون پوشه ای با نام LIB کنار پروژه قرار دارند . سپس فایل های کتابخانه با پسوند .c را از منوی Configure Project/Files و گزینه Add به پروژه اضافه می کنیم .
سپس آدرس پورت و شماره پایه ای که سنسورها به آن وصل می شوند را به صورت کد اسمبلی نوشته شده است را وارد می کنیم .
برای مشخص کردن تعداد سنسورها ، وارد فایل ds18b20.h شوید و توسط دستور زیر تعداد سنسور را وارد نمایید . در این پروژه از 4 سنسور استفاده شده است .
#define _DS18B20_MAX_SENSORS 4
در این پروژه مقادیر دمای خوانده شده از 4 سنسور بر روی نمایشگر lcd کاراکتری نمایش داده می شود . مقدار دما توسط الگوریتم CRC8 چک می شود اگر خطا وجود داشته باشد ، عبارت ERROR بر روی lcd کاراکتری نمایش داده می شود .
توجه داشته باشید که آدرس پورتها در هر میکروکنترلر ممکن است متفاوت باشد . برای بدست آوردن آدرس پورت به شکل زیر عمل میکنیم ، ابتدا یک بار برنامه خود را کامپایل کنید تا هدر میکروکنترلر به بخش Code Navigator کدویژن اضافه شود ، سپس هدر میکروکنترلر را باز کنید در این پروژه mega328p.h می باشد و آدرس پورتهای میکروکنترلر را مشاهده کنید .
راه اندازی ds18b20 با stm32
پروژه قرائت دما و نمایش 4 عدد سنسور ds18b20 بر روی lcd کاراکتری توسط بورد bluepill با میکروکنترلر stm32f103c8t6 انجام شده است ، این کتابخانه را می توانید بدون نیاز به تغییرات با میکروکنترلر دلخواه خودتان نیز راه اندازی کنید .
برای اجرای پروتکل یک سیمه نیاز به اندازه گیری زمان با دقت بالا و در حد میکرو ثانیه می باشد به همین دلیل ما یکی از تایمرهای میکروکنترلر را به دلخواه فعال می کنیم و آن را همانند شکل زیر به کتابخانه در فایل ds18b20.h معرفی می کنیم . در این پروژه ما از تایمر 4 استفاده کردیم .
پورت و پایه ای که سنسورها را به آن متصل میکنیم و همچنین تعداد سنسور مورد استفاده را نیز به شکل زیر به کتابخانه معرفی می کنیم .
توابع کتابخانه ds18b20 برای codevision , stm32 به شرح زیر می باشد :
/* * ds18b20.h */ #ifndef _DS18B20_H #define _DS18B20_H #include "onewire.h" #define _DS18B20_MAX_SENSORS 4 #define _DS18B20_USE_CRC // // Sensor structure // typedef struct { uint8_t Address[8]; float Temperature; uint8_t ValidDataFlag; } Ds18b20Sensor_t; // //'DALLAS DS18B20 ROM and scratchpad commands''''''''''''''''''''''''''1wwrite.... //'0x33 read rom - single sensor //'0x55 match rom, followed by 64 bits //'0xCC skip rom //'0xEC alarm search - ongoining alarm >TH <TL //'0xBE read scratchpad //'0x44 convert T // // DEFINES // #define DS18B20_FAMILY_CODE 0x28 #define DS18B20_CMD_ALARMSEARCH 0xEC #define DS18B20_CMD_CONVERTTEMP 0x44 #define DS18B20_STEP_12BIT 0.0625 #define DS18B20_STEP_11BIT 0.125 #define DS18B20_STEP_10BIT 0.25 #define DS18B20_STEP_9BIT 0.5 #define DS18B20_RESOLUTION_R1 6 // Resolution bit R1 #define DS18B20_RESOLUTION_R0 5 // Resolution bit R0 #ifdef _DS18B20_USE_CRC #define DS18B20_DATA_LEN 9 #else #define DS18B20_DATA_LEN 5 #endif typedef enum { DS18B20_Resolution_9bits = 9, //Time convert/8 = 93.75 ms DS18B20_Resolution_10bits = 10, //Time convert/4 = 187.5 ms DS18B20_Resolution_11bits = 11, //Time convert/2 = 375 ms DS18B20_Resolution_12bits = 12 //Time convert = 750 ms } DS18B20_Resolution_t; typedef enum { TIMEconvert_9bits = 94, //~93.75ms TIMEconvert_10bits = 188, //~187.5ms TIMEconvert_11bits = 375, TIMEconvert_12bits = 750 } DS18B20_TIME_Convert; // // FUNCTIONS // // Init void DS18B20_Init(void); // Settings uint8_t DS18B20_GetResolution(uint8_t* ROM); // Get the sensor resolution uint8_t DS18B20_SetResolution(uint8_t* ROM, DS18B20_Resolution_t resolution); // Set the sensor resolution // Control uint8_t DS18B20_Start(uint8_t number); // Start conversion of one sensor void DS18B20_StartAll(void); // Start conversion for all sensors uint8_t DS18B20_Read(uint8_t* ROM, float *destination); // Read one sensor void DS18B20_ReadAll(void); // Read all connected sensors uint8_t DS18B20_Is(uint8_t* ROM); // Check if ROM address is DS18B20 family uint8_t DS18B20_AllDone(void); // Check if all sensor's conversion is done // ROMs void DS18B20_GetROM(uint8_t number, uint8_t* ROM); // Get sensor's ROM from 'number' position void DS18B20_WriteROM(uint8_t number, uint8_t* ROM); // Write a ROM to 'number' position in sensors table // Return functions uint8_t DS18B20_Quantity(void); // Returns quantity of connected sensors uint8_t DS18B20_GetTemperature(uint8_t number, float* destination); // Returns 0 if read data is invalid //Alarm uint8_t DS18B20_SetAlarmHighTemperature( uint8_t* ROM, int8_t temp); uint8_t DS18B20_SetAlarmLowTemperature( uint8_t* ROM, int8_t temp); uint8_t DS18B20_DisableAlarmTemperature( uint8_t* ROM); uint8_t DS18B20_AlarmSearch(void); #endif
این پروژه برای bascom , codevision , stm32 شامل سه سورس کد می باشد :
1. کد راه اندازی سنسور دمای ds18b20 به روش Index
2. کد قرائت 64 بیت ROM داخلی منحصر به فرد هر سنسور و نمایش آن بر روی پورت سریال یا LCD کاراکتری
3. کد راه اندازی سنسور دمای ds18b20 به روش Address توسط ROM منحصربه فرد هر سنسور
در تصویر زیر عملکرد پروژه را مشاهده می کنید .