شاید نیاز باشد در یک مکان، دما را در شرایط مختلف محیطی اندازهگیری کنیم و طبق یک زمان بندی خاص اطلاعات را ارسال کنیم، و در نهایت طبق اطلاعات بدست آمده، دستورات موردنظر را اجرا کنیم. فرض کنید که میخواهید دمای یک محیط آزمایشگاهی را اندازه گیری و کنترل کنید، به احتمال زیاد در وهلهی اول سوالات زیر برایتان به وجود بیاید.
- از چه سنسوری باید استفاده کنم؟
- چطور میتوانم این اندازهگیری را انجام بدهم؟
- از چه سخت افزاری باید استفاده کنم؟
در این مقاله از سری پروژه های آردوینو میخواهیم به این سوالات پاسخ دهیم و در نهایت این سنسور را توسط برد آردوینو Nano راهاندازی کنیم و جواب را در سریال مانیتور نرمافزار آردوینو مشاهده کنیم.
خب اولین سوالی که ممکن است به ذهن برسد،این است که برای انجام این پروژه باید از چه سنسوری استفاده کنیم؟ برای پاسخ به این سوال باید یک شناخت کلی از سنسورها به همراه عملکرد آنها داشته باشیم. به طور مثال برای پروژه ای که تعریف کردیم فقط به اندازه گیری دما نیاز داریم. پس سنسورهایی که فقط دما را اندازهگیری میکنند باید پیدا کنیم که با یک جستجو ساده بدست میآید. برای این پروژه از سنسور DS18b20 به دلیل دقت بالای اندازهگیری آن استفاده میکنیم که اگر کمی هم جستجو کرده باشید از سنسور DS18b20 در پروژه های مختلف استفاده شده است.
حال سوال بعدی که ممکن است به ذهن برسد، این است که چطور این سنسور را باید راه اندازی کنیم؟ در پاسخ به این سوال لازم است که کمی دیتاشیت این سنسور را مورد برسی قرار دهیم. در این قسمت میخواهیم به صورت مختصر دیتاشیت سنسور DS18b20 را باهم بررسی کنیم.
ویژگیهای این سنسور به صورت کلی شامل موارد زیر میباشد:
استفاده از پروتکل ONE_WIRE جهت راه اندازی
تغییر رزولوشن از 9 تا 12 بیت
تغذیه بین 3 تا 5.5 ولت
اندازهگیری دما از 55- تا 125 درجه سانتیگراد (دقت کنید که مقدار دمایی که در پروژه مدنظر شما است در این رنج است یا خیر که در این پروژه این بازه دمایی مدنظر ما میباشد.)
توصیه میکنیم برای اطلاعات بیشتر “ راهاندازی سنسور دما DS18b20 با AVR” را مطالعه کنید.
پروتکل ONE_WIRE چیست؟ و نحوه عملکرد این پروتکل به چه صورتی است؟
این پروتکل برای انتقال دیتا فقط از یک پین استفاده میکند، به همین جهت به آن ONE WIRE میگویند. درواقع یکی از پرچالشترین پروتکلها، همین پروتکل است به این دلیل که زمانبندی در این پروژه از اهمیت بالایی برخوردار است. همچنین نحوه عملکرد آن هم کاملا بستگی به زمانبندی دارد. فرض کنید که برای روشن کردن سنسور DS18b20 باید هر 480 میکرو ثانیه کد “0XA0” را ارسال کنید، در صورتیکه طبق این زمانبندی ارسال دستور صورت نگیرد سنسور فعال نخواهد شد و در نهایت عمل نخواهد کرد. از اینرو زمانبندی در این پروتکل، اهمیت بسیار زیادی را دارد.
بلوک دیاگرام سنسور DS18b20 هم به صورت شکل زیر است.
برای اطلاعات بیشتر توصیه میکنیم که حتما دیتاشیت این سنسور را مطالعه کنید.
پس از اینکه اطلاعات کافی در مورد سنسور DS18b20 را بدست آوردیم. باید بستر مناسب برای پیاده سازی سنسور DS18b20 را انتخاب کنیم.
انتخاب بستر مناسب برای پروژه، یکی از مشکلات مهندسین الکترونیک است که عدم شناخت به ادوات الکترونیکی باعث بروز این مشکل شده است. انتخاب بستر مناسب برای پروژه به مواردی مثل مدت زمان تعیین شده برای انجام پروژه و سختی پروژه و رابط گرافیکی و … بستگی دارد که باید حتما تک تک این موارد مورد برسی قرار گیرند و در نهایت چیپ موردنظر انتخاب شود.
جهت راهاندازی این سنسور باید دو مرحله را رعایت کنیم، یکی ترسیم شماتیک برد و دیگری بخش کدنویسی که در نرمافزار آردوینو انجام میگیرد.
کدنویسی سنسور DS1820 –DS18b20
ابتدا باید کتابخانه موردنظر را طبق تصاویر زیر نصب کنیم.
سپس کد زیر را در محیط IDE آردوینو مینویسیم.
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 | // First we include the libraries #include <OneWire.h> فراخوانی کتابخانه مربوط به سنسور DS18b20 #include <DallasTemperature.h> فراخوانی کتابخانه ای که برای راهاندازی سنسور DS18b20 نوشته شده به همراه تمامی تنظیمات رجیستری و زمانبندیها /********************************************************************/ // Data wire is plugged into pin 2 on the Arduino #define ONE_WIRE_BUS 2 تعیین پایه ای که باید به میکروکنترلر متصل شود /********************************************************************/ // Setup a oneWire instance to communicate with any OneWire devices // (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); /********************************************************************/ // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); /********************************************************************/ void setup(void) { // start serial port Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // Start up the library sensors.begin(); ارسال تنظیمات اولیه سنسور } void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus /********************************************************************/ Serial.print(" Requesting temperatures..."); sensors.requestTemperatures(); // Send the command to get temperature readings دستور ارسال ادرس جهت برقراری ارتباط با سنسور در صورتیکه ارتباط به درستی انجام گرفته باشد در سریال مانیتور DONE را مینویسد. Serial.println("DONE"); /********************************************************************/ Serial.print("Temperature is: "); Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"? اگر DONE رادریافت کرده بودیم در خط بالا حال توسط این خط از برنامه قادر خواهیم بود دما را از سنسور دریافت کنیم. // You can have more than one DS18B20 on the same bus. // 0 refers to the first IC on the wire delay(1000); } |
اگر تمامی موارد به درستی انجام گرفته باشد، باید خروجی را به صورت زیر در سریال مانیتور مشاهد کنیم.
امیدواریم که آموزش برای شما مفید واقع شده باشد.
سلام برای پروژه تب سنج با همین سنسور برنامه باید چی بنویسیم؟
خوب خیلی بستگی پیدا میکنه به این که از چه میکروکنترلر میخواید استفاده کنید
فکر کنم ساده ترین راه ممکن استفاده از آردوینو است
سلام برای پروژه تب سنج دانشگاه برنامه شمارو وارد کردم
با این متن روبرو شدم درسته همه چیز ؟
Sketch uses 5618 bytes (17%) of program storage space. Maximum is 32256 bytes.
Global variables use 335 bytes (16%) of dynamic memory, leaving 1713 bytes for local variables. Maximum is 2048 bytes.
سلام
بله به نظر میآد برنامه به شکل درست کامپایل شده و آماده است که پروگرامش کنید
پس از verify این متن میاد؟
عملکرد درسته؟
Sketch uses 5618 bytes (17%) of program storage space. Maximum is 32256 bytes.
Global variables use 335 bytes (16%) of dynamic memory, leaving 1713 bytes for local variables. Maximum is 2048 bytes.
بله درسته
سلام من از سنسور دمای DS18B20 استفاده میکنم اگه بخوام سریال رو تو نمایشگر OLED نمایش بدم باید چیکار کنم
سلام من میخوام همین سریال رو تو نمایشگر OLED نمایش بدم باید چیکار کنم؟لطفا راهنماییم کنید
سلام، مطلب جالبی نوشته اید. من در یک برنامه که در آن از ساعت ds3231 و آل سی دی کاراکتری هم استفاده شده این سنسور را اضافه کردم. سرعت عکس العمل سیستم بسیار کند شد. اردواینو استفاده شده uno است. علت کند شدن سیستم میدونید چیه؟
سلام باید دید منظور از کند شدن دقیقا چی و چقدر هست و چطور شما دارید برای خواندن و صحت سنجی دما عمل میکنید
سلام،
وقت شما بخیر ،
منظور از کند شدن سیستم اینست که، عکس العمل دکمه های تاچ بسیار کند شده است. وبرای تغییر وضعیت زمان زیادی طول می کشد. این در حالیست که فقط سنسور دما اضافه شده و دیلی ها همانست که بوده. البته اعداد بیانگر دما بصورت دهم اعشار ظاهر میشود. شاید کند شدن سیستم به همین دلیل باشد. برای کم کردن دقت چه دستوری را وبه چه صورت می توان تغییر داد؟
پروتکل وان وایر اگر بحث چک کردن مطرح باشه میتونه بابت این تاخیر باشه. یا دما خوندن را مدیریت کنید چون نیازی نیست با سرعت بالا دما خونده بشه
یکی از راه حل ها اینه که دکمه ها را بصورت اینتراپتی بخونید و عملیات ها را انجام بدید
شماتیک تغغذیه سنسور ds18b20 برعکس نمایش داده شده
نزدیک بود سنسور رو بسوزونم زود فهمیدم 🙂
لطفا اصلاح کنین
ممنون
سلام
متشکرم برای دقت و تذکری که دادید
مطلب اصلاح شد 🙂
سلام. من برنامه رو اجرا کردم اما دمای محیط 16 درجه هست و دمای سنسور نشون میده 22 درجه
سلام – تا اونجا که من میدونم این سنسور دیجیتال هست
و دقت به پسوند و میانوند باید داشته باشید -مثلا سنسورهایی با کد s ممکنه با سنسور هایی با کد b همخوانی نداشته باشن و همین مشکل ساز شده باشه
نکته دیگه ای هم که هست میزان دقت تنظیم شده سنسور هست که میتونه بین ۹ تا ۱۲ بیت متغییر باشه – فکر میکنم برنامه بر اساس دقت پیش فرض نوشته شده و اگر به هر دلیلی دقت سنسور تغییر کرده باشه مقدار های خوانده شده درست نخواهند بود.
تغییر رزولوشن از 9 تا 12 بیت?
سلام دوست عزیز
منظور از 9 تا 12 همان دقت یا اصطلاحا رزولوشن هست که در این دماسنج قابلیت تغییر این دقت رو دارید که معمولا روی 12 تنظیم میکنند.
زمانیکه روی ماکزیمم رزولوشن یعنی 12 بیت تنظیم شود، سرعت تبدیل 750 میلی ثانیه خواهد بود.
و این تنظیم کاملا به صورت دلخواه کاربر میباشد، همانطور که گفتم به صورت پیشفرض این مقدار را روی 12 تنظیم میکنند
و این نکته رو هم در نظر داشته باشید هر چه رزولوشن بیشتر، دقت بالاتر و سرعت تبدیل کمتر خواهد بود.
طبق این نکته در پروژه های متفاوت نحوه تنظیم این رزولوشن ها تغییر خواهد کرد مسلما اگر نیاز به سرعت بیشتر داشته باشید با دقت کمتر
پیشنهادی که است رزولوشن را پایین تر در نظر بگیرید و اگر عکس این قضیه بود مطمئنا باید رزولوشن را بالاتر در نظر بگیرید.
امیدوارم که جواب موردنظرتون رو دریافت کرده باشید دوست عزیز.
موفق باشید.
سلام دوست عزیز
این پروتکل همونطوری که در مقاله هم توضیح دادیم به زمانبندی بسیار حساس هست و اگر به طور مثال از 3 سنسور با ادرس های مختلف استفاده کنید مقاومت خط تغییر چندانی نخواهد کرد و سنسور ها بدون تداخل جواب خواهند داد حال اگر این تعداد بیشتر شود احتمال جواب نگرفتن بسیار بالاست به دلیل وجود تداخلی که ممکن است در ارسال دیتا صورت بگیرد و این دقیقا همان چیزی است که باعث میشود شما به صورت تصادفی از سنسور ها پاسخ بگیرید. راه حل محاسبه مقاومت خط است.
پیشنهادی که بنده دارم ترجیحا مقاومت 1.9K را جای 4.7K امتحان کنید و عملکرد را دوباره چک کنید.(برای فاصله نزدیک کمتر از 3 متر)
البته به فاصله سنسور ها هم دقت کنید چون اگر این فاصله زیاد باشد به احتمال زیاد مشکل شما محاسبه امپدانس خط است که توصیه میکنم لینکی که در ادامه میزارم رو مطالعه کنید
https://www.maximintegrated.com/en/app-notes/index.mvp/id/148
امیدواریم که هر چه زودتر به جواب برسید.
موفق باشید.
سلام. وقتی تعداد سنسورها یک یا دوتا باشه کار میکنه
من از ۱۵ سنسور استفاده کردم. مشکلی که پیش میاد اینه که بصورت تصادفی سنسورها پاسخ نمیدن.