در این مقاله آموزشی سعی داریم، نحوه استفاده از سنسور دما DS18B20 با برد Arduino uno را آموزش دهیم.در این پست شما نحوه اتصال سنسور DS18B20 به برد آردوینو، نصب کتابخانه های مورد نیاز و دریافت مقدار عددی دما از سنسور های DS18B20 به صورت تکی یا چندگانه، را آموزش خواهید دید.
![سنسور DS18B20 با برد Arduino](https://ewink.ir/wiki/wp-content/uploads/2020/12/DS18B20-arduino-guide.jpg)
آموزش استفاده از دیگر سنسورهای DS18B20 را در لینک های زیر می توانید مطالعه کنید :
- راهنمای استفاده از سنسور دما ESP32 DS18B20 با Arduino IDE
- راهنمای استفاده از سنسور دما ESP8266 DS18B20 با Arduino IDE
- راهنمای استفاده از سنسور دما ESP32/ESP8266 DS18B20 با MicroPython
- راهنمای استفاده از ESP32 با DS18B20 سنسورهای دما چندگانه
معرفی سنسور دما DS18B20
سنسور دما DS18B20 یک سنسور دما، دیجیتال تک وایر است. تک وایر بودن بدین معنی است که تنها به یک مسیر داده ( و زمین ) برای اتصال به برد آردوینو نیاز دارد.
برای منبع تغدیه این سنسور DS18B20 می توان از یک منبع تغذیه خارجی استفاده کنید یا از طریق یک مسیر دیتا که پارازیت مود (“parasite mode”) نامیده می شود، بدون استفاده از سنسور دما را شارژ کنید.
![سنسور دما DS18B20](https://ewink.ir/wiki/wp-content/uploads/2020/12/DS18B20-tempeature-sensor-pinout-1.jpg)
در جدول زیر نحوه اتصال سنسور DS18B20 به برد Arduino :
سنسور DS18B20 | برد Arduino |
پین GND | GND |
پین DQ | هر پین دیجیتال ( مقاومت pull-up با 4.7 اُهم ) |
پین VDD | به 5 ولت برای حالت نرمال / به زمین برای parasite mode |
هر سنسور دما DS18B20 داری کد سریال 64 بیتی است. این ویژگی امکان اتصال به سنسورهای چندگانه را با همان دیتا قبلی ایجاد می کند. بنابراین شما با استفاده از فقط یک پین دیجیتال آردونیو می توانید دما را از سنسورهای چندگانه دریافت کنید.
این سنسور دما DS18B20، دارای ورژن ضد آب نیز می باشد.
![](https://ewink.ir/wiki/wp-content/uploads/2020/12/ds18b20-waterproof.jpg)
خلاصه ای از مهم ترین خصوصیات سنسور دما DS18B20 عبارتند از :
- سنسور دما DS18B20، یک سنسور دیجیتال تک سیمه می باشد. به این معنا که برای انتقال اطلاعات به برد آردوینو یا هر میکروکنترلر دیگری تنها به یک سیم( به اضافه سیم زمین GND) نیاز دارد.
- ولتاژ مناسب برای تغذیه این سنسور دما، 3.0 ولت تا 5.5 ولت است.
- سنسور DS18B20 قابلیت اندازه گیری بازه دمایی از 55- درجه سلسیوس تا 125+ درجه سلسیوس را دارد.
- دقت اندازه گیری آن در بازه 0.5+/- درجه سلسیوس ( بازه 10- تا 85 درجه سلسیوس) می باشد.
جهت کسب اطلاعات بیشتر، می تواند دیتاشیت سنسور دما DS18B20 را ملاحظه کنید.
قطعات مورد نیاز
جهت آشنایی بیشتر شما با نحوه عملکرد سنسور دما DS18B20 با برد آردوینو و چگونگی نمایش دما در مانیتور سریال آردوینو،یک مثال کاربردی و ساده را توضیح خواهیم داد. برای شروع این پروژه آموزشی به قطعات زیر نیاز دارید.
تمامی قطعات الکترونیکی مورد نیاز خود را می توانید در فروشگاه ایوینک تهیه کنید.
مدار شماتیک – سنسور دما DS18B20 به Arduino
سنسور DS18B20 در دو مدل می تواند اجرا شود :
مدل نرمال : با 3 سیم اتصال صورت می گیرد و منبع تغذیه پین VDD است.در شکل زیر نحوه اتصال مدل نرمال را مشاهده می کنید:
![مدار سنسور DS18B20 با برد آردوینو- نرمال](https://ewink.ir/wiki/wp-content/uploads/2020/12/ds18b20_arduino_single_normal.png)
مدل پارازیت: در این مدل تنها به دیتا و GND نیاز دارید. منبع تغذیه سنسور دما DS18B20 مسیر دیتا است. در شکل زیر نحوه اتصال مدل نرمال را مشاهده می کنید:
![مدار سنسور تک سیمه DS18B20 با برد آردوینو- پارازیت](https://ewink.ir/wiki/wp-content/uploads/2020/12/ds18b20_arduino_single_parasite-1.png)
آپلود کد/ سنسور تک سیمه دما DS18B20
برای راه اندازی سنسور دما DS18B20 کتابخانه های زیر را باید از سایت گیت هاب دانلود و نصب کنید. در ادامه آموزش نحوه نصب را به شما خواهیم آموخت :
نصب کتابخانه ها
وارد نرم افزار Arduino IDE شده و پس از به منو Sketch بروید پس از آن به زیر منوی Include Library سپس به Manage Libraries وارد شوید.
عبارت “OneWire” را سرچ کرده و OneWire library by Paul Stoffregen را نصب کنید.
![نصب کتابخانه سنسور تک سیمه DS18B20](https://ewink.ir/wiki/wp-content/uploads/2020/12/install-onewire-library.png)
پس از مراحل بالا، عبارت “Dallas” را سرچ کرده و کتابخانه Dallas Temperature library by Miles Burton را نصب کنید.
![نصب کتابخانه سنسور تک سیمه DS18B20](https://ewink.ir/wiki/wp-content/uploads/2020/12/install-dallas-temperature-1.png)
بعد از نصب کتابخانه های ضروری، کد زیر را در برد آردوینو خود آپلود کنید. این مثال آموزشی از مدل طرح شده در کتابخانه Dallas Temperature library است.
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 |
/********* Rui Santos Complete Project Details https://ewink.ir/wiki Based on the Dallas Temperature Library example *********/</p> <p style="text-align: right;">#include <OneWire.h> #include <DallasTemperature.h></p> <p style="text-align: right;">// Data wire is conntec to the Arduino digital pin 4 #define ONE_WIRE_BUS 4</p> <p style="text-align: right;">// Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(ONE_WIRE_BUS);</p> <p style="text-align: right;">// Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire);</p> <p style="text-align: right;">void setup(void) { // Start serial communication for debugging purposes Serial.begin(9600); // Start up the library sensors.begin(); }</p> <p style="text-align: right;">void loop(void){ // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus sensors.requestTemperatures();</p> <p style="text-align: right;">Serial.print("Celsius temperature: "); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire Serial.print(sensors.getTempCByIndex(0)); Serial.print(" - Fahrenheit temperature: "); Serial.println(sensors.getTempFByIndex(0)); delay(1000); } |
روش های متفاوتی برای دریافت دما از سنسورهای DS18B20 وجود دارد. اما اگر شما از سنسور تک سیمه DS18B20 استفاده می کنید، این روش ارائه شده یکی از ساده ترین راه هاست.
![سنسور دماDS18B20 -برد آردوینو](https://ewink.ir/wiki/wp-content/uploads/2020/12/arduino-ds18b20-single.jpg)
نحوه عملکرد کد
با اینکلود کردن کتابخانه های OneWire و DallasTemperature شروع به کار می کند :
1 2 |
#include <OneWire.h> #include <DallasTemperature.h> |
سنسور DS18B20 به Pin 4 متصل می شود. باید هر آنچه برای خواندن دما از سنسور نیاز است را ایجاد کنید :
1 2 3 4 5 6 |
// Data wire is conntec to the Arduino digital pin 4 const int oneWireBus = 4; // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(oneWireBus); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); |
()setup
در ستاپ، مانیتور سریال در بادریت 9600 شروع به کار می کند:
1 |
Serial.begin(9600); |
با دستور زیر سنسور دما DS18B20 فعال می شود :
1 |
sensors.begin(); |
()loop
در این مرحله شما دما را از سنسور مشاهده خواهید کرد. باید قبل از دریافت مقدار واقعی دما، متدی به نام ()requestTemperatures ایجاد کنید :
1 |
sensors.requestTemperatures(); |
برای دریافت دما بر حسب درجه سلسیوس، از متد ()getTempCByIndex استفاده کنید :
1 |
Serial.print(sensors.getTempCByIndex(0)); |
برای دریافت دما بر حسب درجه فارنهایت، از متد ()getTempFByIndex استفاده کنید:
1 |
Serial.println(sensors.getTempFByIndex(0)); |
به دلیل اینکه ما تنها از یک سنسور استفاده می کنیم index ما 0 است. اگر شما از بیش از یک سنسور می خواهید استفاده کنید، از index 0 برای سنسور اول و از index 1 برای سنسور دوم و به همین ترتیب تا آخرین سنسور ادامه دهید.
اگر می خواهید در هر ثانیه دمای جدید از را سنسور DS18B20 بخوانید:
1 |
delay(5000); |
نمایش
پس از اینکه کد را آپلود کردید. مانیتور سریال Arduino IDE را در بادریت 9600 باز کنید.
اکنون شما ( مطابق شکل زیر ) دما را در هر ثانیه بر حسب درجه سلسیوس و فارنهایت مشاهده خواهید کرد :
![مانتیور سریال- سنسور دما n DS18B20](https://ewink.ir/wiki/wp-content/uploads/2020/12/serial-monitor-1-1.png)
خواندن دما از سنسورهای چندگانه DS18B20
این سنسور تک سیمه برای اتصال به برد آردوینو تنها به یک پروتکل نیاز دارد و هر سنسور، یک کد سریال 64 بیتی منحصر به فرد دارد. بنابراین دما از سنسورهای چندگانه، تنها با یک پین دیجیتال برد آردوینو قابل خواندن است.
مدار
برای خواندن دما از سنسورهای چندگانه دما DS18B20، باید همه مسیرهای دیتا را به همدیگر متصل کنید. در شکل زیر این اتصال به صورت مداری شماتیک نشان داده شده است :
![اتصال سنسور چندگانه دما ds18b20- برد آردوینو](https://ewink.ir/wiki/wp-content/uploads/2020/12/ds18b20_arduino_multiple.png)
آپلود کد_ سنسور چندگانه DS18B20
شرح کامل کدنویسی، این سنسور به صورت زیر است.(در تمامی سیستم ها بر پین Pin 4 اسکن دما صورت می گیرد).
این مثال بر پایه مدل طرح شده در کتابخانه DallasTemperature library است :
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 63 64 65 66 67 68 |
/* * Rui Santos * Complete Project Details https://ewink.ir/wiki */</p> <p style="text-align: right;">#include <OneWire.h> #include <DallasTemperature.h></p> <p style="text-align: right;">// Data wire is plugged into port 4 on the Arduino #define ONE_WIRE_BUS 4 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS);</p> <p style="text-align: right;">// Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire);</p> <p style="text-align: right;">int numberOfDevices; // Number of temperature devices found</p> <p style="text-align: right;">DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address</p> <p style="text-align: right;">void setup(void) { // start serial port Serial.begin(9600);</p> <p style="text-align: right;">// Start up the library sensors.begin();</p> <p style="text-align: right;">// Grab a count of devices on the wire numberOfDevices = sensors.getDeviceCount();</p> <p style="text-align: right;">// locate devices on the bus Serial.print("Locating devices..."); Serial.print("Found "); Serial.print(numberOfDevices, DEC); Serial.println(" devices.");</p> <p style="text-align: right;">// Loop through each device, print out address for(int i=0;i<numberOfDevices; i++) { // Search the wire for address if(sensors.getAddress(tempDeviceAddress, i)) { Serial.print("Found device "); Serial.print(i, DEC); Serial.print(" with address: "); printAddress(tempDeviceAddress); Serial.println(); } else { Serial.print("Found ghost device at "); Serial.print(i, DEC); Serial.print(" but could not detect address. Check power and cabling"); } } }</p> <p style="text-align: right;">void loop(void) { sensors.requestTemperatures(); // Send the command to get temperatures</p> <p style="text-align: right;">// Loop through each device, print out temperature data for(int i=0;i<numberOfDevices; i++) { // Search the wire for address if(sensors.getAddress(tempDeviceAddress, i)){</p> <p style="text-align: right;">// Output the device ID Serial.print("Temperature for device: "); Serial.println(i,DEC);</p> <p style="text-align: right;">// Print the data float tempC = sensors.getTempC(tempDeviceAddress); Serial.print("Temp C: "); Serial.print(tempC); Serial.print(" Temp F: "); Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit } } delay(5000); }</p> <p style="text-align: right;">// function to print a device address void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } |
نحوه عملکرد کد
کد با استفاده از چندین متد کارآمد کنترل، سنسورهای چندگانه DS18B20 را در دست می گیرد :
از متد ()getDeviceCount، برای دریافت شماره سنسورهای DS18B20 بر مسیر دیتا,استفاده می شود :
1 |
numberOfDevices = sensors.getDeviceCount(); |
متد ()getAddress، آدرس سنسور ها را پیدا می کند :
1 |
if(sensors.getAddress(tempDeviceAddress, i)){ |
نکته ی قابل توجه اینکه آدرس هر سنسور منحصر به فرد است. بنابراین هر سنسور با توجه به آدرسی که دارد، تعریف می شود.
استفاده از متد()getTempC باعث می شود که آدرس دستگاه به عنوان یک آرگومان شناخته شود و دما را از هر سنسور خاص جداگانه دریافت کنید:
1 |
float tempC = sensors.getTempC(tempDeviceAddress); |
برای دریافت دما بر حسب درجه فارنهایت، از()getTemF و به همین ترتیب برای تبدیل دمای سلسیوس به فارنهایت از دستور زیر استفاده کنید :
1 |
DallasTemperature::toFahrenheit(tempC) |
جمع بندی مطالب فوق
سنسور دما DS18B20، یک سنسور دیجیتال تک سیمه می باشد. برای استفاده از این سنسور شما به یک سیم و کتابخانه های DallasTemperature libraries نیاز دارید. شما می توایند از سنسور دما DS18B20 یگانه یا چندگانه بر روی خط داده یکسان استفاده کنید. چون یکی از ویژگی های بارز این سنسور قابلیت تعریف هر سنسور توسط آدرس منحصر به فرد خود است.
آموزش صفر تا صد آردوینو را در لینک های زیر ببینید:
آردوینو چیست ؟ آشنایی با آردوینو
امیدواریم که این آموزش برای شما مفید واقع شده باشد.
برای آموزش های بیشتر و تکمیلی راجع به سنسورها، اینجا کلیک کنید.
- DHT11/DHT22 سنسور سنجش رطوبت و دما
- آموزش جامع سنسور(فشار،دما،رطوبت) BME280 با بردArduino
- BMP180 سنسور بارومتریک
در قسمت نظرات ایده ها و مطالب پیشنهادی خود را با ما به اشتراک بگذارید.