تحلیل کتابخانه

تحلیل و بررسی کتابخانه DallasTemperature.h

نوشته شده توسط معین صابری

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

 


نصب کتابخانه DallasTemperature.h


اولین قدم در استفاده از یک کتابخانه، نصب آن است. توجه داشته باشید که کتابخانه سنسور DS18B20 به طور پیشفرض بر روی آردوینو نصب است. جهت اطمینان از این موضوع، ابتدا در نرم افزار آردوینو بر روی گزینه Tools و سپس Manage Libraries را کلیک کنید.

 

پس از کلیک بر روی گزینه مدیریت کتابخانه ها، با تصویر زیر رو به می شوید. این منو کتابخانه های در دسترس را به شما نشان می دهد. شما نیز می توانید با جستجوی نام کتابخانه مورد نظر خود، آن را در مخازن آردوینو یافته و یا نصب کنید.

 

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

پس از طی این مرحله، نوبت به بررسی توابع کلیدی کتابخانه DallasTemperature.h می رسد. اما پیش از آن، بردها و ماژول های سازگار با این کتابخانه را ابتدا معرفی کرده و پس از آن به بررسی توابع می پردازیم.

 


سازگاری با کتابخانه DallasTemperature.h


کتابخانه DallasTemperature.h، یک کتابخانه گسترده به همراه امکانات جانبی بسیار زیادی است. افزون بر این، این کتابخانه علاوه بر سنسور DS18B20، از سایر سنسورهای دمای یک سیمه نیز پشتیبانی می نماید. لیست کامل این سنسورها عبارتند از:

  • DS18B20
  • DS18S20
  • DS1822
  • DS1820
  • MAX31820

کتابخانه DallasTemperature.h گستره وسیعی از بردها را در بر می گیرد. از این کتابخانه می توان در بردهای آردوینو نظیر UNO،MEGA، NANO و ماژول های ESP سری ESP8266 و ESP32 استفاده نمود. در قسمت بعدی، به بررسی توابع کلیدی و کاربردی این کتابخانه، می پردازیم.

 


توابع کلیدی کتابخانه DallasTemperature.h


در این قسمت به بررسی توابع کلیدی کتابخانه سنسور شتاب سنج می پردازیم. در رابطه با توابع، در نظر بگیرید که ورودی ها از سمت چپ به راست، به ترتیب شماره های یک، دو، سه و… را به خود اختصاص می دهند. به عبارت دیگر، منظور از ورودی اول سمت چپ ترین ورودی بوده و سایر رورودی ها از ۲ به بعد، به خود شماره اختصاص می دهند.

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

One wire

DallasTemperature(OneWire*)
ایجاد ارتباط در پورت یک سیمه بدون ورودی begin()
این تابع تعداد سنسورهایی که بر روی باس یک سیمه قرار گرفته اند را در خروجی قرار می دهد. خروجی از نوع بدون علامت ۸ بیتی است. بدون ورودی uint8_t getDeviceCount(void);
این تابع تعداد سنسورهایی که از خانواده DS18XX بر روی باس یک سیمه قرار دارند را اعلام می نماید. بدون ورودی uint8_t getDS18Count(void);
این تابع با دریافت شماره ادرس سنسور در ورودی، اعلام می نماید که آیا این آدرس معتبر است یا خیر، خروجی این سنسور به صورت بولین است. در صورت معتبر بودن آدرس، true و در غیر اینصورت خروجی false خواهد بود. ورودی از نوع بدون علامت ۸ بیتی bool validAddress(const uint8_t*);
این تابع با دریافت آدرس از ورودی، تعیین می کند که ایا این آدرس جزو خانواده سنسور DS هست یا خیر

خروجی این سنسور از نوع بولین است. در صورت معتبر بودن آدرس، true و در غیر اینصورت خروجی false خواهد بود.

ورودی از نوع بدون علامت bool validFamily(const uint8_t* deviceAddress);
این تابع دو ورودی، اولی آدرس و دومی شماره ایندکس می پذیرد. سپس بررسی می کند که آیا آدرس مورد نظر در شماره ایندکس تعیین شده  وجود دارد یا خیر.

در صورتیکه چنین بود، خروجی true و در غیر اینصورت خروجی false است.

ورودی اول آدرس از نوع بدون علامت ۸ بیتی

ورودی دوم ایندکس از نوع بدون علامت ۸ بیتی

bool getAddress(uint8_t* deviceAddress, uint8_t index)
این تابع در ورودی آدرس را دریافت می کند و سپس بررسی می کند که آیا سنسور با این آدرس به پورت متصل است یا خیر. در صورت اتصال خروجی true و در غیر اینصورت false خواهد بود. ورودی آدرس از نوع بدون علامت ۸ بیتی bool isConnected(const uint8_t* deviceAddress)
این تابع با دریافت ورودی آدرس، تعیین می کند که سنسور این آدرس، از کابل تغذیه و یا کابل دیتا تغذیه می کند. سنسورهای DS قابلیت تغذیه از طریق کابل را نیز دارند. در صورتیکه از کابل دیتا تغذیه شود خروجی true در غیر اینصورت false خواهد بود. ورودی اول آدرس از نوع بدون علامت ۸ بیتی

ورودی دوم ایندکس از نوع بدون علامت ۸ بیتی

ورودی آدرس از نوع بدون علامت ۸ بیتی

bool readPowerSupply(const uint8_t* deviceAddress)

 

به کمک این تابع می توانید دقت اندازه گیری تمام سنسورهای متصل را تعیین کنید. این دقت بین ۹ الی ۱۲ بیت است که برای تعیین آن، اعدادی بین ۹ الی ۱۲ می بایست در ورودی قرار گیرد.  مقدار پیشفرض ۹ است. ورودی از نوع بدون علامت برای تعیین دقت void setResolution(uint8_t newResolution)

 

این تابع دقت اندازه گیری سنسورها را به صورت کلی و عمومی اعلام کرده و در خروجی قرار می دهد. خروجی از نوع بدون علامت ۸ بیتی است. بدون ورودی      uint8_t getResolution()

 

این تابع رزولوشن را برای یک آدرس مشخص که در ورودی اول قرار گرفته، تنظیم می کند. مقدار رزولوشن مورد نظر در ورودی دوم قرار می گیرد.

در صورتیکه ورودی سوم را برابر با false قرار دهید، مقدار رزولوشن تعیین شده توسط شما با مقدار رزلوشن عمومی برای سنسورها مقایسه شده و چنانچه رزلوشن عمومی از رزلوشن تعیین شده کاربر بیشتر شود، مقدار رزلوشون عمومی جایگزین رزلووشن پیشفرض می گردد.

ورودی اول از نوع ۸ بیت بدون علامت برای تعیین آدرس

ورودی دوم از نوع ۸ بیت بدون علامت برای تعیین رزولوشون

ورودی سوم از نوع بولین برای تغییر/عدم تغییر رزولوشن کلی

bool setResolution(const uint8_t* deviceAddress, uint8_t newResolution, bool skipGlobalBitResolutionCalculation)
به کمک این تابع می توانید رزلوشن یک سنسور خاص را با آدرس آن، بدست آورید. برای این مورد، آدرس در ورودی قرار گرفته و در خروجی، رزلوشن آن آدرس در بازه ۹ الی ۱۲ قرار می گیرد. چنانچه آدرس یافت نشود، تابع عدد ۰ را بر می گرداند. ورودی از نوع بدون علامت ۸ بیتی جهت تعیین آدرس uint8_t getResolution(const uint8_t* deviceAddress)
با قرار دادن ورودی این تابع به صورت true، می توانید برنامه را تا زمان خواندن مقدار دما، متوقف کنید. بدین ترتیب زمانیکه درخواست خواندن دما دارید، برنامه تا دریافت جواب، متوقف خواهد شد. در صورتیکه ورودی این تابع false باشد، جواب درخواست میزان دما در تابع requestTemperature() بلافاصله در خروجی ظاهر شده که ممکن است جواب صحیح نباشد. ورودی از نوع بولین (true  و false) void setWaitForConversion(bool flag)
به کمک این تابع درخواست خواندن دما به کلیه سنسورهای روی باس(پورت) یک سیمه ارسال می شود. فراخوانی این تابع قبل از تابع خواندن دما ضروریست. اگر از آدرس سنسورها اطلاعی ندارید و یا یک سنسور دارید، این تابع مناسب کار شماست. بدون ورودی void requestTemperatures()
به کمک این تابع درخواست خواندن اطلاعات سنسور، به آدرس یک سنسور خاص ارسال می شود. درصورتیکه سنسور به باس متصل نباشد، خروجی false بوده، در غیر اینصورت true خواهد بود. ورودی از نوع بدون علامت ۸ بیتی برای ادرس bool requestTemperaturesByAddress(

const uint8_t* deviceAddress)

به کمک این تابع درخواست خواندن اطلاعات سنسور، به ایندکس(شماره) یک سنسور خاص ارسال می شود. ورودی از نوع بدون علامت ۸ بیتی برای ایندکس(شماره سنسور) bool requestTemperaturesByIndex(uint8_t deviceIndex)
این تابع دمای سنسوری که شماره ایندکس آن در ورودی قرار می گیرد را در خروجی به صورت اعشاری و بر حسب سانتی گراد قرار می دهد. ورودی از نوع بدون علامت ۸ بیتی برای ایندکس(شماره سنسور) float getTempCByIndex(uint8_t deviceIndex)
این تابع دمای سنسوری که شماره ایندکس آن در ورودی قرار می گیرد را در خروجی به صورت اعشاری و بر حسب فارنهایت قرار می دهد ورودی از نوع بدون علامت ۸ بیتی برای ایندکس(شماره سنسور) float getTempFByIndex(uint8_t deviceIndex)
این تابع دمای سنسوری که شماره آدرس آن در ورودی قرار می گیرد را در خروجی به صورت اعشاری و بر حسب سانتی گراد قرار می دهد ورودی از نوع بدون علامت ۸ بیتی برای آدرس سنسور float getTempC(const uint8_t* deviceAddress)
این تابع دمای سنسوری که شماره آدرس آن در ورودی قرار می گیرد را در خروجی به صورت اعشاری و بر حسب فارنهایت قرار می دهد ورودی از نوع بدون علامت ۸ بیتی برای آدرس سنسور float getTempF(const uint8_t* deviceAddress)
به کمک این تابع می توانید برای آدرس سنسور قرار گرفته در ورودی اول، به کمک ورودی دوم حد بالای یک آلارم را تعیین کنید. چنانچه دما از این حد بیشتر شود، سیگنال آلارم در باس ایجاد می شود. ورودی دوم بازه حد بالای آلارم را در مقدار ۵۵- الی ۱۲۵ درجه سانتی گراد تعیین می کند. ورودی اول از نوع بدون علامت ۸ بیتی برای آدرس سنسور

ورودی دوم از نوع علامت دار ۸ بیتی برای دما

void setHighAlarmTemp(const uint8_t* deviceAddress,

int8_t celsius)

به کمک این تابع می توانید برای آدرس سنسور قرار گرفته در ورودی اول، به کمک ورودی دوم حد پایین یک آلارم را تعیین کنید. چنانچه دما از این حد کمتر شود، سیگنال آلارم در باس ایجاد می شود. ورودی دوم بازه حد بالای آلارم را در مقدار ۵۵- الی ۱۲۵ درجه سانتی گراد تعیین می کند. ورودی اول از نوع بدون علامت ۸ بیتی برای آدرس سنسور

ورودی دوم از نوع علامت دار ۸ بیتی برای دما

void setLowAlarmTemp(const uint8_t* deviceAddress,

int8_t celsius)

در صورتیکه یک سنسور با آدرسی که در ورودی قرار گرفته آلارم تولید کند، خروجی این تابع true خواهد شد. ورودی از نوع بدون علامت ۸ بیتی برای آدرس سنسور

 

bool hasAlarm(const uint8_t* deviceAddress)
در صورتیکه هر یک از سنسورهای قرار گرفته بر روی باس آلارم تولید کند، خروجی true می شود. بدون ورودی bool hasAlarm(void)

پس از معرفی توابع کلیدی و کاربردی، نوبت به اجرای یک نمونه برنامه ساده می رسد. به همین منظور، قسمت بعدی به این موضوع اختصاص دارد.

 


اجرای نمونه برنامه های راه اندازی


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

#include <OneWire.h>   //فراخوانی کتاب خانه یک سیمه جهت ارتباط با سنسور
#include <DallasTemperature.h>    //فراخوانی کتابخانه سنسور DS18XX
//************************************************
#define ONE_WIRE_BUS 2 //انتخاب پایه شماره ۲ برد اردوینو برای خواندن اطلاعات سنسور
OneWire oneWire(ONE_WIRE_BUS);    //تعریف پایه ارتباط یک سیمه
DallasTemperature sensors(&oneWire);    //ایجاد یک نمونه شی از کلاس کتابخانه سنسور DS18XX
void setup () {
  Serial.begin(9600);
  sensors.begin();//آماده سازی سنسور
}
 
void loop() {
  //دریافت دما از سنسور ds18b20
  String tmp ="";
  sensors.requestTemperatures();//دراخواست داده از سنسور دما
  tmp = String(sensors.getTempCByIndex(0));     //خواندن دمای سنسور از شماره ایندکس صفر، از آنجاییکه یک سنسور بر روی باس داریم، بنابراین ایندکس ۰ خواهد بود
  Serial.println(tmp);
  Serial.flush();
}

 

در ادامه نمونه برنامه ها، برنامه زیر، به چاپ آدرس سنسورهای شناسایی شده در باس مشترک بر روی سریال مانیتور، می پردازد.

#include <OneWire.h>  //فراخوانی کتابخانه یک سیمه جهت ارتباط با سنسور DS18
#include <DallasTemperature.h>   //فراخوانی کتابخانه سنسور DS
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);  //تعیین باس ارتباطی برای اتصال سنسورها که در این جا پایه ۲ آردوینو تعیین شده
DallasTemperature sensors(&oneWire);
int numberOfDevices;   //متغیر جهت نمایش تعداد سنسورهای متصل به پایه آردوینو(باس)
DeviceAddress tempDeviceAddress;    //متغیر جهت ذخیره آدرس سنسورها
void setup(void)
{
  Serial.begin(9600); //باودریت سریال
  Serial.println("DS SENSOR IC");
  sensors.begin();   //راه اندازی سنسور
  numberOfDevices = sensors.getDeviceCount();  //ذخیهر کردن تعداد سنسورهای موجد بر روی باس
  Serial.print(" NUMBER OF DEVICES Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.print("Parasite power is: "); //در صورتیکه تغذیه سنسورها از طریق کابل دیتا تامین شده باشد(تغذیه انگلی)
  if (sensors.isParasitePowerMode())
    Serial.println("ON");
  else Serial.println("OFF");
  for (int i = 0; i < numberOfDevices; i++)          //بدست آموردن آدرس سنسورها
  {
    if (sensors.getAddress(tempDeviceAddress, i))    
    {
      Serial.print("Found device ");
      Serial.print(i, DEC);    //نمایش شماره ایندکس
      Serial.print(" with address: ");
      printAddress(tempDeviceAddress);   // tempDeviceAddress//نمایش آدرس(آدرس به صورت آرایه ای در متغیر  
      Serial.println();
  }
}
}

void loop(void)
{

}

void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

 


جمع بندی


در این آموزش به تحلیل و بررسی کتابخانه DallasTemperature.h پرداختیم. این کتابخانه راه اندازی و کار با سنسورهای یک سیمه سری DS18XX را فراهم می نماید. به کمک این کتابخانه می توانیم طیف وسیعی از سنورهای یک سیمه نظیر DS18B20، DS1820 و… را راه اندازی کنیم. از آنجاییکه این سری سنسورها قابلیت عملکرد همانند ترموستات را دارند، توابع مربوط به حد بالا و پایین دمایی در این کتابخانه نیز لحاظ شده است. از دیگر مزایای این نوع از سنسورها می توان به قابلیت راه اندازی تعداد زیادی از آن ها تنها با اشغال شدن یک پایه از برد و یا میکروکنترلر، اشاره نمود. در این نوشتار ضمن معرفی اولیه کتابخانه، به نکات فنی و سنسورهای مورد پشتیبانی آن  پرداختیم. در ادامه به معرفی توابع کلیدی و کاربردی کتابخانه پرداخته و در نهایت با ارائه مثالی، به بحث خاتمه دادیم.

 


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


  1. برد آردوینو UNO
  2. برد آردوینو مگا
  3. برد آردوینو مگا وای فای
  4. برد NODEMCU
  5. سنسور دمای DS18B20  با کابل ضد آب
  6. سنسور دمای DS18B20 سه پایه

 

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

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

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

۲ دیدگاه

  • سلام. برنامه نوشته شده در شبیه سازی پروتئوس همواره عدد -۱۲۷ نمایش میده. مشکل از کجاست به نظرتون ؟