این آموزش به نحوه تنظیم سنسور دما DS18b20 و سایر اطلاعاتی که به آن احتیاج دارید پرداخته است. اگر اتاق خاصی مدنظر دارید برای تنظیم دمای آن یا تنظیم کردن دیتا لاگر و یا هر چیز دیگری، این پروژه بسیار مناسب است. همچنین شما می توانید با ترکیب کردن این آموزش (پروژه) با سایر آموزش ها یک سنسور هوشمند با قابلیت های فراوان بسازید.
به عنوان مثال اگر دما یک محوطه یا جسمی بیشتر از محدوده (خارج از محدوده) مورد نظر باشد با استفاده از یک زنگ پیزو (آلارم) می توانید متوجه آن شوید (یا به شما هشدار آن را می دهد.)
در این بخش از آموزش سعی کردیم مبانی اتصال سنسور دما DS18B20 به آردوینو را به طور مفصل شرح دهیم. همچنین در این پروژه برای نشان دادن میزان دما و نحوه عملکرد مدار از چند لامپ LED استفاده شده است.
لیست قطعات مورد نیاز
برد آردوینو Arduino UNO R3 مدل DIP | 1 عدد |
سنسور دمای DS18B20 دیجیتال-اورجینال | 1 عدد |
مقاومت 4.7 کیلو اهم با توان 0.25 وات و تلرانس 1 درصد | 1 عدد |
مقاومت 100 اهم با توان 0.25 وات و تلرانس 1 درصد | 3 عدد |
لامپ LED قرمز سایز 5mm میلی متر مدل مات | 1 عدد |
لامپ LED سبز سایز 5mm میلی متر مدل مات | 1 عدد |
لامپ LED زرد سایز 5mm میلی متر مدل مات | 1 عدد |
برد بورد (پروجکت برد) مدل GL | 1 عدد |
سیم جامپر برد بوردی مدل دو سر نری (سری 40تایی) | 1 عدد |
سنسور دما DS18B20
راه اندازی سنسور دما DS18B20 با آردوینو و تجهیزات به کار رفته در این پروژه بسیار ساده هستند و واقعا نیاز به توضیح ندارند اما در این قسمت سعی شده سنسور دما را به صورت کلی توصیف کنیم.
DS18B20 یک سنسور دمای دیجیتال، که قابلیت خواندن دما با دقت 0.05 درجه سانتی گراد را دارد. که در این آموزش از مدل ضد آب آن استفاده کردیم. همچنین DS18B20 از پروتکل ارتباطی one wire support یا همان ارتباط تک سیمه (1WIRE) جهت ارتباط با دیگر دستگاه های خارجی پشتیبانی می کند،
نقشه شماتیک پروژه
1. ابتدا پین 3v3 آردوینو رو به ریل مثبت و پین زمین (منفی) رو به ریل زمین (منفی) برد برد اتصال دهید.
2. در این مرحله سنسور DS18B20 را بر روی بردبرد قرار دهید.
3. یک مقاومت 4.7 کیلواهم بین پایه مثبت (سیم قرمز) و پایه خروجی(سیم سفید) سنسور DS18B20 قرار دهید.
4. در مرحله بعد یک سیم از پایه مثبت (سیم قرمز) به ریل 3v3 مثبت وصل کنید.
5. یک سیم از خروجی (سیم سفید سنسور) به پایه دیجیتال شماره 5 آردوینو متصل نمائید. در ادامه یک سیم از پین زمین سنسور (سیم مشکی) به ریل منفی (زمین) بردبرد وصل کنید.
6. سیمی را از ریل منفی بردبرد به سمت دیگر بردبرد اتصال دهید.
7. سه تا LEDهای قرمز، زرد و سبز را بر روی بردبرد قرار دهید.
8. یک مقاومت 100اهم، به هر یک از LEDها متصل کنید و سمت دیگر مقاومت را به ریل زمین (منفی) اتصال دهید.
9. در این مرحله هر یک از LEDها را به آردوینو متصل می کنیم، به این ترتیب که LED سبز رنگ را به پین 2، LED زرد را به پین 3 و در نهایت LED قرمز رنگ را به پین 4 آردوینو متصل می کنیم.
10. در این قسمت تمامی اتصالات مدار به اتمام رسیده است و آماده می شویم برای کدنویسی، در صورتی که با نحوه اتصالات مشکل دارید با توجه به نقشه شماتیک زیر می توانید ایرادات خود را برطرف نمایید.
نصب کردن کتابخانه one wire support
لازم به ذکر است که نرم افزار برنامه نویسی آردوینو به صورت پیش فرض توانایی پشتیبانی از پروتکل 1WIRE را ندارد بنابراین ما باید library (کتابخانه یا برنامه) مورد نیاز را بر روی آن نصب کنیم. این فرآیند بسیار ساده و راحت است که در زیر نحوه استفاده از آن را توضیح داده ایم.
1. در مرحله اول ابتدا آخرین (جدیدترین) نسخه کتابخانه وان وایر (one Wire) را از اینجا دانلود کنید.
2. پس از دانلود فایل، نرم افزار آردوینو را باز کنید.
3. مسیر زیر را دنبال کنید و در پنجره باز شده فایل کتابخانه one Wire را که قبلا دانلود کرده اید را انتخاب کنید:
Sketch > Include Library > Add .ZIP Library…
نصب کردن کتابخانه Dallas Temperature Library
برای ایجاد یا خلق ایده های جدیدتر، پیشنهاد میکنیم یک library که حاوی اطلاعاتی از سنسور مورد نظر ما باشد را نصب کنید، چرا که این libraryها راهنمای قویی خواهند بود و قطعا بسیار راحت تر از نوشتن کدهای برنامه نویسی و پردازش توسط هر شخصی می باشد. اگر تمایل به استفاده از آن را دارید طبق توضیحات زیر آن را به library های خود اضافه کنید.
1. در مرحله اول ابتدا Dallas Temperature sensor Library (کتابخانه سنسور دمای دالاس) را از اینجا دانلود کنید.
2. پس از دانلود فایل، نرم افزار آردوینو را باز کنید.
3. مسیر زیر را دنبال کنید و در پنجره باز شده فایل کتابخانه DallasTemperature را که قبلا دانلود کرده اید را انتخاب کنید:
Sketch > Include Library > Add .ZIP Library…
برنامه نویسی سنسور دما DS18B20 در نرم افزار آردوینو
برای شروع ما باید هر دو کتابخانه های one wire و Dallas Temperature را داشته باشیم تا بتوانیم از کدهای برنامه نویسی استفاده کنیم و اگر هم قبلا این کار را انجام دادید دیگر نیازی به نصب آن ندارید.
1 2 |
#include <OneWire.h> #include <DallasTemperature.h> |
در ابتدا تمام متغیرهایی که باید از آنها استفاده شود را تعریف میکنیم. از آنجایی که دما متغییر است ابتدا دما را ذخیره می کنیم (مقدار آن را مشخص میکنیم).
متغیرهای lowerLimit و upperLimit نشانگر حداقل و حداکثر (حد آستانه) دمای ما هستند. به این ترتیب که اگر دما کمتر از حدپایین باشد LED زرد رنگ روشن می شود و اگر دما بیشتر از حدبالا باشد LED قرمز رنگ روشن می شود و اگر دما بین دو مقدار تعیین شده باشد LED سبز رنگ روشن می شود.
1 2 3 4 5 6 7 |
int greenLedPin = 2; int yellowLedPin = 3; int redLedPin = 4; int temp_sensor = 5; float temperature = 0; int lowerLimit = 15; int higherLimit = 35; |
سپس یک آبجکت از کتابخانه one wire و Dallas Temperature با نام دلخواه ایجاد می کنیم.
1 2 3 |
OneWire oneWirePin(temp_sensor); DallasTemperature sensors(&oneWirePin); |
1 2 |
sensors.begin(); |
خواندن مقدار دما سنسور DS18B20
در این بخش از پروژه با استفاده از دستور (sensors.getTempCByIndex(0 می توانیم مقدار دما اندازه گیری شده توسط سنسور دما DS18B20 را در برنامه برگردانیم و اگر بخواهیم دما را برحسب فارنهایت داشته باشیم به راحتی به جای حرف C از حرف F استفاده می کنیم. به عنوان مثال عبارت فوق را به صورت (sensors.getTempFByIndex(0 ذخیره می کنیم. لازم به گفتن است که عدد 0 نشان دهنده شماره سنسوری است که ما نیاز به اطلاعات آن سنسور داریم. بنابراین اگر یک سنسور داشته باشیم عدد 0 می گذاریم و اگر تعداد سنسور 2 بود برای فراخوانی سنسور شماره 2، از عدد 1 استفاده می کنیم و اگر تعداد سنسور 3 بود برای فراخوانی سنسور شماره 3، از عدد 2 استفاده می کنیم.
1 2 3 4 5 6 7 |
void loop(){ Serial.print("Requesting Temperatures from sensors: "); sensors.requestTemperatures(); Serial.println("DONE"); temperature = sensors.getTempCByIndex(0); |
تا زمانی که بخش بعدی برنامه را اجرا نکردیم همه LEDها را خاموش می کنیم تا LED صحیح عملکرد درست خود را نشان دهد. در ادامه دو خط خیلی ساده تایپ می کنیم به این معنی که دما برابر با این مقدار است و در خط بعدی مقدار دما را نمایش می دهیم.
1 2 3 4 5 6 7 |
digitalWrite(redLedPin, LOW); digitalWrite(greenLedPin, LOW); digitalWrite(yellowLedPin, LOW); Serial.print("Temperature is "); Serial.print(temperature); |
در بخش آخر مقدار دما را با مقادیری که قبلا تعیین شده مقایسه می کنیم و با توجه به حد آستانه، LED مورد نظر را روشن می کنیم. به عنوان مثال کلمه IF در خط اول بیانگر این است که اگر مقدار دما کمتر یا برابر با حدپایین باشد، عملکرد به چه صورت است، به عنوان مثال اگر دما از مقدار تعیین شده کمتر باشد LED زرد روشن شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//Setup the LEDS to act as outputs if (temperature <= lowerLimit) { Serial.println(", Yellow LED is Activated"); digitalWrite(yellowLedPin, HIGH); } else if (temperature > lowerLimit && temperature < higherLimit) { Serial.println(", Green LED is Activated"); digitalWrite(greenLedPin, HIGH); } else if (temperature >= higherLimit) { Serial.println(", Red LED is Activated"); digitalWrite(redLedPin, HIGH); } delay(500); } |
برنامه پروژه در نرم افزار آردوینو
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 |
#include <OneWire.h> #include <DallasTemperature.h> int greenLedPin = 2; int yellowLedPin = 3; int redLedPin = 4; int temp_sensor = 5; float temperature = 0; int lowerLimit = 15; int higherLimit = 35; OneWire oneWirePin(temp_sensor); DallasTemperature sensors(&oneWirePin); void setup(void) { Serial.begin(9600); //Setup the LEDS to act as outputs pinMode(redLedPin, OUTPUT); pinMode(greenLedPin, OUTPUT); pinMode(yellowLedPin, OUTPUT); sensors.begin(); } void loop() { Serial.print("Requesting Temperatures from sensors: "); sensors.requestTemperatures(); Serial.println("DONE"); temperature = sensors.getTempCByIndex(0); digitalWrite(redLedPin, LOW); digitalWrite(greenLedPin, LOW); digitalWrite(yellowLedPin, LOW); Serial.print("Temperature is "); Serial.print(temperature); //Setup the LEDS to act as outputs if (temperature <= lowerLimit) { Serial.println(", Yellow LED is Activated"); digitalWrite(yellowLedPin, HIGH); } else if (temperature > lowerLimit && temperature < higherLimit) { Serial.println(", Green LED is Activated"); digitalWrite(greenLedPin, HIGH); } else if (temperature >= higherLimit) { Serial.println(", Red LED is Activated"); digitalWrite(redLedPin, HIGH); } delay(500); } |
عیب یابی:
بعد از اتمام مراحل فوق ممکن است به مشکلاتی برخورد کنید، ما سعی کردیم تعدادی از این مسائل را در زیر فهرست کنیم.
1. در صورتی که سنسور همواره دمایی پایدار (یکسان) را نشان دهد؛ ممکن است اتصالات به درستی وصل نشده باشد، قبل از استفاده مجدد آردوینو، مطمئن شوید که اتصالات به درستی انجام گرفته است.
2. در صورتی که بعد از راه اندازی، نتایج نادرست از سنسور دمای DS18B20 حاصل شود، ممکن است سنسور توانایی کافی در پردازش اطلاعات را نداشته باشد و یا سرعت درخواست اطلاعات توسط شما بیش از حد سریع باشد. برای حل این مشکل می توانید زمان Delay در برنامه را که به صورت پیش فرض 500 میلی ثانیه تعریف شده است را افزایش دهید.
لازم به ذکر است این قبیل از مشکلات نباید در پروژه آموزشی اتفاق بیافتد، اما ممکن است بعضی از کدها و مراحل برنامه نویسی را تغییر داده باشید.
سلام من این پروژه رو روی پروتئوس بستم.
اول “127-“نشون میده.
بهد “85”نشون میده.
بعد دما رو درست نشون میده.ولی بعد از سومین دمایی که نشون داد بقیه رو “127-“نشون میده .
من کد رو از روی سایت کپی کردم . پروژه رو هم مثل سایت بستم.
اگر میشه راهنمایی کنید .
ممنون
سلام دوست عزیز
در این پروژه از کتابخانه Dallas استفاده شده است که یک کتابخانه بسیار دقیق و صحیح برای اندازه گیری دما با سنسور DS18B20 می باشد، در صورت بستن مدار به صورت عملی هیچ مشکلی در پروژه وجود ندارد، در نرم افزار پروتئوس معمولا با تنظیم نبودن کلاک میکروکنترلر اینگونه مشکلات به وجود خواهد آمد. به احتمال زیاد با افزایش مقدار زمان تاخیر در خط 51 برنامه از 500 میلی ثانیه به 2000 میلی ثانیه این مشکل برطرف شود.
سلام خسته نباشید
ببخشید من داخل دستگاهم یک سنسور dht11 گذاشتم
اما این سنسور دمای بین 36.6 تا 40 درجه را اصلا نشون نمیده
یعنی وقتی که دما میشه 36.7 . 40 درجه نشون میده.
ولی بقیه دما ها را دقیق نشون میده
اگر میشه راهنماییم کنید که چجوری این مشکلو بر طرف کنم