آردوینو آموزش آردوینو

آموزش راه اندازی چند سنسور DS18B20 Dallas با آردوینو توسط یک پایه

connect-multi-ds18b20-sensor-to-one-wire-arduino-digispark
نوشته شده توسط پریسا پوربلورچیان

برای سنجش دما سنسورهای مختلفی وجود دارد. بر اساس ساختار سنسور و کاربری آن‌ها دسته بندی می‌شوند. سنسور DS18B20 از نوع OneWire است. به عبارتی توسط یک پایه می‌تواند با برد میکرو ارتباط برقرار کند. در این آموزش روش اتصال چند سنسور DS18B20 به یک پایه را آموزش خواهم داد. سنسور ضد آب DallasTemperature از سری سنسورهای دقیق جهت اندازه گیری دمای محیط است. از سری سنسورهای Dallas مدل DS18B20 دارای کابل با روکش PVC است که جهت استفاده شخصی و نیمه صنعتی نیاز بسیاری از کاربران را فراهم کرده است. در ادامه این آموزش راه اندازی سنسور DS18B20 با آردوینو با مرجع تخصصی آردوینو  به زبان فارسی، دیجی اسپارک همراه باشید.

 


معرفی سنسور DS18B20 Dallas


سنسور DS18B20 از نوع سیم دار و غلاف ضد آب با روکش PVC است. در زمانی که نیاز به اندازه گیری دما در محیط های مرطوب و یا در فاصله را دارید، قابل استفاده است. دمای کاری سنسور طبق اطلاعات گفته شده در دیتاشیت تا ۱۲۵ درجه سانتی گراد است اما پیشنهاد می‌شود در دمای ۱۰۰ درجه از سنسور نگهداری شود. با توجه به اینکه سنسور دیجیتال است حتی در فاصله دور تخریب سیگنال در انتقال دیتا مشاهده نشده است. سنسور دمای ۱-Wire دیجیتال با دقت اندازه گیری در حدود +-۰٫۵ درجه است. با انواع میکروکنترلرها قابلیت تست و راه اندازی داشته و حتی میتوانید چندین پین را به یک پین متصل کنید.  تمامی سنسورهای دما DS18b20 دارای ۶۴ بیت سریال کد هستند و این امکان را به شما میدهد تا چندین پایه سنسور به یک پایه دیتای مشابه متصل کنید. به این ترتیب میتوانید دیتای دمای چندین سنسور را با یک پین دیجیتال آردوینو دریافت کنید.  اتصال سنسور به میکرو به صورت زیر است.

این سنسور از پروتکل ارتباطی ۱-Wire پشتیبانی کرده و ولتاژ راه اندازی آن ۳ تا ۵٫۵ ولت DC است. رنج دمای کاری سنسور – ۵۵ تا + ۱۲۵ درجه سانتی گراد است و با دقت +- ۰٫۵ درجه در بازه ی – ۱۰ تا + ۸۵ درجه سانتی گراد دما را اندازه گیری می‌کند.

 


کتابخانه Dallas Temperature


برای راه اندازی سنسور DS18B20 با آردوینو نیازمند کتابخانه مربوطه هستیم. کتابخانه Dallas Temperature جهت استفاده از سنسور DS18B20 توسط miles burton و … توسعه یافته است. با نصب کتابخانه از مسیر زیر شروع ارتباط با سنسور آغار می‌شود.

Arduino/ Tools / Manage Libraries

سپس کلید واژه Dallas Temperature را فیلتر کنید.

پیشنهاد می‌شود در هر زمان جدیدترین ورژن را نصب کنید.

 


کد آردوینو سنسور DS18B20


پس از نصب کتابخانه، نوع برد مورد نظر را انتخاب کنید. در صورتیکه از بردهای آردوینو Arduino، استفاده می‌کنید، آن را انتخاب کنید. تفاوتی در نوع برد استفاده شده وجود ندارد و در صورت استفاده از بردهای سری ESP8266 تنها نوع پایه GPIO را مشخص کنید. کد را کپی و به نرم افزار آردوینو انتقال دهید. چنانچه روش استفاده از کدها را نمی‌دانید به آموزش کار با برد آردوینو Arduino و نصب نرم افزار Arduino IDE مراجعه کنید.

 

#include <OneWire.h> //فراخوانی کتابخانه
#include <DallasTemperature.h> // فراخوانی کتابخانه


#define ONE_WIRE_BUS 2 //انتخاب پایه دیجیتال


OneWire oneWire(ONE_WIRE_BUS); // تعریف سنسور


DallasTemperature sensors(&oneWire);



void setup(void)
{
 
  Serial.begin(9600); // تنظیم بادریت
  Serial.println("Dallas Temperature IC Control Library Demo"); // پیغام پیش نمایش قبل از فعال شدن سنسور

 
  sensors.begin(); // فرمان به شروع دریافت دیتا
}


void loop(void)
{ 
 
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();
  Serial.println("DONE");
  float tempC = sensors.getTempCByIndex(0); // تعریف سنسور با float و دریافت عدد اعشاری

  
  if(tempC != DEVICE_DISCONNECTED_C) 
  {
    Serial.print("Temperature for the device 1 (index 0) is: ");
    Serial.println(tempC);
  } 
  else
  {
    Serial.println("Error: Could not read temperature data");
  }
}

 

 


تحلیل کد آردوینو Arduino


برای راه اندازی سنسور DS18B20 با آردوینو، کدهای نوشته شده در این آموزش را روی برد آپلود کردیم. سپس بخش مهم بعدی تحلیل کدهای آردوینو است. شروع برنامه با فراخوانی کتابخانه های Wire, Dallas Temperature می‌باشد:

#include <OneWire.h> //فراخوانی کتابخانه
#include <DallasTemperature.h> // فراخوانی کتابخانه

سپس در مرحله بعد یک متغیر برای سنسور تعریف کرده و یک پایه را به آن نسبت میدهیم:

#define ONE_WIRE_BUS 2 //انتخاب پایه دیجیتال


OneWire oneWire(ONE_WIRE_BUS); // تعریف سنسور


DallasTemperature sensors(&oneWire);

 

 


اتصال چند سنسور DS18B20 به یک پایه آردوینو


سنسور DS18B20 با توجه به اینکه قابلیت آدرس دهی دارد، هر سنسور یک آی دی منحصر به فرد دارد. از این رو میتوانید چند سنسور DS18B20 را فقط به یک پایه دیجیتال بردهای میکروکنترلر اتصال دهید. به عنوان مثال دو فضای مختلف داریم، فضای داخل inside و فضای خارج outside. سنسوری که در فضای داخل است یک آی دی یونیک داشته و دیتا را خوانده و مجزا برای ما نشان میدهد. سنسور دوم هم که در فضای بیرون outside قرار دارد، آی دی یونیک داشته و دیتا را نشان میدهد. پس به این ترتیب هر سنسور توسط آی دی قابل تفکیک است و فقط یک پایه از برد میکرو شما را درگیر خواهد کرد.

 

هر سنسور دارای سه پایه است، پایه دیتا، پایه VCC و پایه GND. برای انجام اتصالات از یک بردبورد میتوانید استفاده کنید. کافیست پایه های یکسان هر دو سنسور را در یک ردیف از برد بورد قرار داده و اشتراک بگیرید تا سیم کشی کاهش یابد.

 


کد آردوینو دریافت آی دی ۱۶ رقمی سنسور


هر سنسور DS18B20 دارای کد ۱۶ رقمی منحصر به فرد است و در صورتیکه بخواهیم چندین سنسور را به یک پایه از برد میکروکنترلر متصل کنیم، بایستی ID آن را داشته باشیم. برای اینکار از کد آردوینو زیر استفاده می‌کنیم.

#include <OneWire.h>

OneWire  ds(2);  

void setup(void) {
  Serial.begin(9600);
  discoverOneWireDevices();
}

void discoverOneWireDevices(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  Serial.print("Looking for 1-Wire devices...\n\r");
  while(ds.search(addr)) {
    Serial.print("\n\rFound \'1-Wire\' device with address:\n\r");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.print("CRC is not valid!\n");
        return;
    }
  }
  Serial.print("\n\r\n\rThat's it.\r\n");
  ds.reset_search();
  return;
}

void loop(void) {
  // nothing to see here
}

 

کد را کپی و به نرم افزار آردوینو انتقال دهید. سپس برنامه را Verify و Upload کنید. پس از آپلود کد ۱۶ رقمی هر سنسور به صورت جداگانه در سریال مانیتور نمایش داده می‌شود. مانند:

حال بایستی کدهای دریافتی را کپی کرده و سپس کد را تعمیم دهیم. جهت نمایش دمای اندازه گیری توسط هر سنسور مرحله بعد را اجرا می‌کنیم.

 


کد آردوینو اتصال چند سنسور DS18B20


در این کد از دو سنسور DS18B20 استفاده شده است. کد هر سنسور به صورت مجزا در کد برنامه تعریف شده است. دقت داشته باشید کد هر سنسور یونیک است و قبل از اجرای این کد بایستی کد سنسور را از کد قبل برداشت و سپس در این کد جایگزین کنید:

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

DeviceAddress sensor1 = { 0x28, 0xFF, 0xE6, 0x61, 0x04, 0x17, 0x03, 0xEF };
DeviceAddress sensor2 = {0x28, 0xFF, 0xCE, 0x55, 0x20, 0x17, 0x03, 0x65 };
//DeviceAddress sensor3= { 0x28, 0xFF, 0xA0, 0x12, 0x34, 0x17, 0x8, 0x69 };

void setup(void){
  Serial.begin(115200);
  sensors.begin();
}

void loop(void){ 
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); 
  Serial.println("DONE");
  
  Serial.print("Sensor 1(*C): ");
  Serial.print(sensors.getTempC(sensor1)); 
  Serial.print(" Sensor 1(*F): ");
  Serial.println(sensors.getTempF(sensor1)); 
 
  Serial.print("Sensor 2(*C): ");
  Serial.print(sensors.getTempC(sensor2)); 
  Serial.print(" Sensor 2(*F): ");
  Serial.println(sensors.getTempF(sensor2)); 
  
  //Serial.print("Sensor 3(*C): ");
 // Serial.print(sensors.getTempC(sensor3)); 
 // Serial.print(" Sensor 3(*F): ");
  //Serial.println(sensors.getTempF(sensor3)); 
  
  delay(2000);
}

کد را آپلود Upload کرده و سپس سریال مانیتور را باز کنید:

به همین ترتیب دو دما از دو سنسور قابل مشاهده است. در این کد به دلخواه از نام سنسور ۱ و سنسور ۲ استفاده شده است. دمای سنسور ۱ در ساعت ۱۲:۵۲ دقیقه به صورت زیر است:

۱۲:۵۲:۱۸٫۵۳۴ -> Sensor 1(*C): 27.50 Sensor 1(*F): 81.50

 

دمای سنسور ۲ در ساعت ۱۲:۵۲ به صورت زیر است:

۱۲:۵۲:۰۱٫۴۹۲ -> Sensor 2(*C): 27.00 Sensor 2(*F): 80.60

 

به همین ترتیب در هر لحظه دما قابل مشاهده است و میتوانید بر اساس آن یک ترموستات طراحی کنید. فراخوانی هر سنسور درکدها به صورت زیر است:

DeviceAddress sensor1 = { 0x28, 0xFF, 0xE6, 0x61, 0x04, 0x17, 0x03, 0xEF };
DeviceAddress sensor2 = {0x28, 0xFF, 0xCE, 0x55, 0x20, 0x17, 0x03, 0x65 };
//DeviceAddress sensor3= { 0x28, 0xFF, 0xA0, 0x12, 0x34, 0x17, 0x8, 0x69 };

 

ارسال کامند برای دریافت دیتا از سنسورها به صورت زیر در برنامه تعریف شده است:

 sensors.requestTemperatures();

 

سپس در مرحله بعد میتوانید بر اساس شماره سنسور دما را بر حسب سانتی گراد و فارنهایت تعریف کنید:

sensors.getTempC(sensor1)

sensors.getTempF(sensor1

sensors.getTempC(sensor2

sensors.getTempF(sensor2

 

 


جمع بندی لیدی پای


اتصال چندین سنسور به یک پایه علاوه بر سهولت در کدنویسی، سبب کاهش اتصالات شده است و از این رو یکی از نقاط قوت سنسور DS می‌باشد. هر تعداد سنسور که مد نظرتان است، یک به یک به آردوینو و یا سری بردهای ESP8266 متصل کنید و سپس توسط کد دریافت آی دی، کد یونیک ۱۶ رقمی را دریافت و در کد آردوینو وارد کنید. اتصالات سنسور بسیار ساده است اما پیشنهاد می‌شود از یک پین هدر جهت سهولت و عدم ایجاد خطا در راه اندازی استفاده کنید. این کد با تمامی بردهای سری ESP8266 و دیگر بردهای خانواده آردوینو قابل اجرا است.

 


وسایل مورد نیاز


سنسور DS18B20 به تعداد دلخواه

آردوینو UNO

کابل فلت

برد بورد

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

درباره نویسنده

پریسا پوربلورچیان

تولید کننده محتوا / کارشناس IOT

زندگی یعنی پژوهش و فهمیدن چیزی جدید

تلاشم بر این است تجربیاتم در زمینه IOT‌ را به بهترین شکل با شما در میان بگذارم.

تبادل نظر و رفع عیب با ثبت دیدگاه

۲۲ دیدگاه

  • سلام
    با توجه به توضیحات یعنی اول باید کد i12c داشته باشم و بعد برای هر سنسور جدا جدا تعریف کنم؟ خیلی سخته که بیشتر توضیح بدید لطفا

    • با سلام
      بله برای هر سنسور بایستی کد I2C را دریافت کنید که در متن آموزش به آن اشاره شده است.
      به عنوان مثال در این آموزش کد I2C سنسورهای مورد استفاده من به صورت زیر است:

      DeviceAddress sensor1 = { 0x28, 0xFF, 0xE6, 0x61, 0x04, 0x17, 0x03, 0xEF };
      DeviceAddress sensor2 = {0x28, 0xFF, 0xCE, 0x55, 0x20, 0x17, 0x03, 0x65 };

  • سلام
    یک مشکل با خود محیط اردوینو وجود داره که برد genericSTM32F103C رو اصلا نمی شناسه وقتی که برنامه رو بدون برد حتی کامپایل می کنم خطای زیر رو ضاهر می کنه. به نظر شما باید چکار کنم؟
    Board genericSTM32F103C (platform STM32F1, package stm32duino) is unknown

    Error compiling for board Generic STM32F103C series.

    وقتی بردم رو به PC وصل می کنم شناسایی می شه ولی اصلا نمی تونم پروگرام کنم.
    راستی توی این محیط چطور می شه عکس اپلود کرد؟
    با تشکر

  • با سلام
    ببخشید استفده از دو عدد سنسور dht11 با پایه های جداگانه رو میشه آموزش بدید

    با تشکر

    • با سلام
      در این خصوص از آموزش زیر استفاده کنید. در خصوص تعریف دو سنسور روش کار بسیار ساده است و برای هر سنسور بایستی یک متغیر جداگانه و یک پایه ی دیتای جداگانه در کد برنامه تعریف کنید.
      راه اندازی سنسور dht

  • سلام، کد مربوط به یک سنسور را امتحان کردم و مشکلی نبود.برای اتصال چند سنسور با همین روش که شما توضیح دادید پیش رفتم و از همین کد آردوینو که ارائه دادید برای پیدا کردن آیدی هر سنسور استفاده کردم ولی در سریال مانیتور هیچ کد مربوط به سنسور نمایش داده نمیشه کلا صفحه سفیده
    ممنون میشم اگر راهنماییم کنید که ممکنه ایراد از چی باشه

    • با سلام
      پس از اتصال تک تک سنسورها به آردوینو بایستی کد یونیک i2c هر کدام را جداگانه دریافت و در کد برنامه آردوینو جایگزین کنید.
      به عنوان مثال در این برنامه بنده از دو سنسور استفاده کرده ام که در کد آردوینو به صورت زیر تعریف شده است.
      DeviceAddress sensor1 = { 0x28, 0xFF, 0xE6, 0x61, 0x04, 0x17, 0x03, 0xEF };
      DeviceAddress sensor2 = {0x28, 0xFF, 0xCE, 0x55, 0x20, 0x17, 0x03, 0x65 };

    • با سلام
      پس از اتصال تک تک سنسورها به آردوینو بایستی کد یونیک i2c هر کدام را جداگانه دریافت و در کد برنامه آردوینو جایگزین کنید.
      به عنوان مثال در این برنامه بنده از دو سنسور استفاده کرده ام که در کد آردوینو به صورت زیر تعریف شده است.
      DeviceAddress sensor1 = { 0x28, 0xFF, 0xE6, 0x61, 0x04, 0x17, 0x03, 0xEF };
      DeviceAddress sensor2 = {0x28, 0xFF, 0xCE, 0x55, 0x20, 0x17, 0x03, 0x65 };

  • سلام چه سنسورهای دیگری به جز ds18b20 از one wire استفاده می کنند؟
    سرچ میکنم فقط همین سنسور میاد

  • سلام. ضمن عرض تشکر از توضیحات شما
    اتصال یک سنسور به برد uno را انجام دادم
    چند سوال داشتم
    اول اینکه دما رو -۱۲۷ نشون میده. با مقاومت ۴٫۷ کیلو هم اتصال اضافه بین vcc و سیم زرد برقرار کردم ولی همچنان دما رو -۱۲۷ نشون میده. مشکل از کجاست؟
    دوم اینکه چطور میشه اعداد بعد از اعشار رو کمتر کرد؟ الان ۱۰ رقم صفر بعد از ممیز نشون میده. می خوام حداکثر یک رقم بشه

    • با سلام
      عدد ۱۲۷ یعنی ارتباط قطع است. مقاومت ۴٫۷ کیلو بین پایه vcc , data قرار میگیرید. در خصوص رقم بعد از اعشار این مورد به رزولوشن وابسته است و راهکارهای مختلفی وجود دارد. از کلاس رزولوشن استفاده کنید و یا از int temp_01 = 0; در کد برنامه برای دریافت عدد صحیح استفاده کنید.

  • سلام خسته نباشید. من برای پروژه دانشگاه باید دمای ۲۱ قسمت از دستگاه رو داشته باشم میخواستم بدونم اول اینکه تمام ۲۱ نقطه رو میشه به همین روش وصل کرد؟
    و اینکه اگه بخواهم بین این ۲۱ دما سوییچ کنم از شیلد نمایشگر ۱۶۰۲ میشه استفاده کرد ؟

    • بله، می توانید برای اندازه گیری دمای ۲۱ نقطه از دستگاه خود از سنسور DS18B20 استفاده کنید.
      اتصال ۲۱ سنسور DS18B20:

      هر سنسور DS18B20 دارای یک آدرس منحصر به فرد است که به شما امکان می دهد تا آنها را به صورت جداگانه شناسایی کنید.
      می توانید سنسورها را به صورت موازی به یک پین داده مشترک در میکروکنترلر خود متصل کنید.
      برای جلوگیری از تداخل، باید از مقاومت pull-up 4.7 کیلو اهم بین پین داده و Vcc استفاده کنید.
      کتابخانه های مختلفی برای ساده سازی خواندن داده ها از سنسورهای DS18B20 در دسترس هستند.
      استفاده از شیلد نمایشگر ۱۶۰۲:

      شیلد نمایشگر ۱۶۰۲ می تواند برای نمایش دمای هر ۲۱ نقطه به صورت چرخشی استفاده شود.
      می توانید از کتابخانه LiquidCrystal برای نوشتن متن و اعداد بر روی صفحه نمایش استفاده کنید.
      برای پیمایش بین دماها، می توانید از دکمه های موجود در شیلد نمایشگر یا از طریق برنامه خود استفاده کنید.