آموزش راه اندازی چند سنسور دما DS18B20 با آردوینو

آموزش راه اندازی چند سنسور دما DS18B20 با آردوینو

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

یکی از مزایای بزرگ سنسور دما DS18B20 این است که در یک ارتباط تک سیمه می‌توان از چندین سنسور DS18B20  (ماکزیمم 8 سنسور) استفاده کرد و تنها از طریق یک پایه دیجیتال آن‌ها را کنترل نمود. از آنجایی‌که هر سنسور  DS18B20 دارای یک کد سریال 64 بیتی مجزا است که در کارخانه به آن اختصاص داده شده است، تشخیص آن‌ها از هم بسیار آسان می‌باشد. این ویژگی این امکان را به شما می‌دهد تا سنسورهای مختلفی را در نقاط مختلف یک فضای بزرگ کنترل کنید.  

قبل از اینکه بیشتر در مورد این موضوع صحبت کنیم، حتما باید با مبانی سنسور دما DS18B20 آشنا باشید. به همین خاطر بهتر است ابتدا مقاله زیر را مطالعه کنید.

راه اندازی سنسور دما دیجیتال DS18B20 با آردوینو

اتصال سنسور دما دیجیتال DS18B20 به آردوینو

بهتر است بیشتر از این وقت را هدر ندهیم و اتصال چند سنسور DS18B20 را به آردوینو شروع کنیم.

سیم‌­کشی – راه اندازی چند سنسور دما DS18B20 با آردوینو

قطعاتی که برای راه اندازی چند سنسور دما DS18B20 نیاز دارید، به شرح زیر است:

اتصالات نسبتاً ساده هستند.

ابتدا با اتصال همه DS18B20ها به‌صورت موازی کار را شروع کنید. به عبارتی، همه پایه‌های مشابه یعنی پایه­‌های VDD، پایه‌­های GND و پایه‌­های سیگنال را به‌هم متصل نمایید. سپس، VDD را به خروجی 5 ولت آردوینو، GND را به زمین آردوینو و پایه سیگنال را به پایه دیجیتال 2 آردوینو وصل کنید. در مرحله بعد، برای پایدار ماندن انتقال داده باید پایه داده سنسور DS18B20 از طریق یک مقاومت 4.7 کیلو اهمی pull-up شود ( مقاومت pull-up داخلی آردوینو برای این کار مناسب نیست).

با توجه به تصویر زیر اتصالات را انجام دهید:

نحوه اتصال چند سنسور دما DS18B20 به آردوینو
نحوه سیم‌کشی سنسورهای دما DS18B20 به آردوینو

نصب کتابخانه برای سنسور DS18B20

پروتکل تک سیم دالاس تا حدودی پیچیده است و برای ارتباط دو طرفه با سنسور به کد‌های زیادی نیاز است. برای راحت شدن کار، توابع کتابخانه­‌های Dallas Temperature.h را نصب کنید تا بتوانید برای خواندن دما از سنسور، از دستورهای ساده استفاده کنید.

برای نصب کتابخانه، مسیر Sketch>Include Library>Manage Libraries را طی کنید. سپس، کمی صبر کنید تا Library Manager، فهرست کتابخانه‌ها را دانلود کند و لیست کتابخانه‌‌های نصب­ شده را به‌روزرسانی نماید.

مسیر دست‌یابی به Manage Libraries برای نصب کتابخانه Dallas Temperature

سپس، کلمه DS18b20 را تایپ کنید تا نتایج جستجو شما فیلتر شود. پس از این کار چند نتیجه به شما نشان داده خواهد شد. از بین آن‌ها، Dallas Temperature by Miles Burton را پیدا کنید. آن را انتخاب کرده و سپس، بر روی گزینه نصب کلیک کنید.

جستجو کلمه DS18b20 و نصب کتابخانه Dallas Temperature by Miles Burton

کتابخانه Dallas Temperature یک کتابخانه سخت افزاری است که توابع سطح پایین را مدیریت می­‌کند. این کتابخانه برای اینکه بتواند علاوه بر سنسور DS18B20، با هر دستگاه تک ‌سیم که از پروتکل تک ‌سیم استفاده می‌کند، ارتباط برقرار کند، باید به همراه کتابخانه One Wire باشد. به همین دلیل، این کتابخانه را نیز نصب کنید.

جستجو  One Wire در Library Manager و نصب کتابخانه One Wire

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

روش 1: خواندن سنسور دما DS18B20 براساس نمایه

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

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);	

// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);

int deviceCount = 0;
float tempC;

void setup(void)
{
  sensors.begin();	// Start up the library
  Serial.begin(9600);
  
  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  deviceCount = sensors.getDeviceCount();
  Serial.print(deviceCount, DEC);
  Serial.println(" devices.");
  Serial.println("");
}

void loop(void)
{ 
  // Send command to all the sensors for temperature conversion
  sensors.requestTemperatures(); 
  
  // Display temperature from each sensor
  for (int i = 0;  i < deviceCount;  i++)
  {
    Serial.print("Sensor ");
    Serial.print(i+1);
    Serial.print(" : ");
    tempC = sensors.getTempCByIndex(i);
    Serial.print(tempC);
    Serial.print((char)176);//shows degrees character
    Serial.print("C  |  ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
    Serial.print((char)176);//shows degrees character
    Serial.println("F");
  }
  
  Serial.println("");
  delay(1000);
}

خروجی کد بالا بر روی سریال مانیتور به شکل زیر خواهد بود:

خروجی کتابخانه DallasTemperature بر روی سریال مانیتور

توضیح کد:

در اینجا دستورات بالا را بررسی می‌کنیم.

کد بالا با فراخوان کتابخانه‌­ها و پینی که پایه‌ی دیتای سنسور به آن متصل شده است و ایجاد شیء از کتابخانه DallasTemperature شروع می­‌شود.

در بخش setup کد، ابتدا تابع ()begin را فراخوانی می­‌کنیم. این تابع، باس را راه­ اندازی کرده و تمام سنسورهای DS18B20 موجود روی آن را شناسایی می‌کند. سپس، به هر سنسور یک نمایه اختصاص داده می‌شود و دقت آن روی 12 بیت تنظیم خواهد شد.

در مرحله بعد، ما با فراخوانی تابع ()getDeviceCount، تعداد دستگاه­‌های موجود روی باس را به‌دست می‌آوریم.

در حلقه‌­ کد، با استفاده از تابع ()requestTemperatures، دستور تبدیل دما به تمامی سنسورها را ارسال می­‌کنیم. حال با استفاده از یک حلقه ساده (++int i = 0; i < deviceCount; i)، می‌توانیم آرایه­‌ای از سنسورها را تکرار کرده و دمای سنسور DS18B20 با نمایه i را به وسیله فراخوانی دستور getTempCByIndex(i) بخوانیم.

روش 2: خواندن سنسور دما DS18B20 با استفاده از آدرس

حتما می‌دانید که هر سنسور DS18B20 دارای یک آدرس 64 بیتی منحصر به فرد است که برای تمایز آن‌ها از یک‌دیگر، به آن اختصاص داده شده است. در این روش، ما با پیدا کردن این آدرس، از آن برای برچسب‌گذاری هر سنسور استفاده می­‌کنیم. از این آدرس می‌توانید برای خواندن هر سنسور به‌صورت جداگانه استفاده کنید.

پیدا کردن آدرس سنسورهای DS18B20 روی باس

کد زیر همه سنسورهای DS18B20 موجود در باس را تشخیص داده و آدرس آن‌ها را بر روی سریال مانیتور چاپ می­‌کند.

شما می‌­توانید هر بار تنها یک سنسور را وصل کرده و آدرس آن را بیابید ( یا به‌صورت پی در پی یک سنسور جدید را اضافه کنید) تا بتوانید هر سنسور را با استفاده از آدرس آن شناسایی و برچسب‌گذاری کنید.

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// variable to hold device addresses
DeviceAddress Thermometer;

int deviceCount = 0;

void setup(void)
{
  // start serial port
  Serial.begin(9600);

  // Start up the library
  sensors.begin();

  // locate devices on the bus
  Serial.println("Locating devices...");
  Serial.print("Found ");
  deviceCount = sensors.getDeviceCount();
  Serial.print(deviceCount, DEC);
  Serial.println(" devices.");
  Serial.println("");
  
  Serial.println("Printing addresses...");
  for (int i = 0;  i < deviceCount;  i++)
  {
    Serial.print("Sensor ");
    Serial.print(i+1);
    Serial.print(" : ");
    sensors.getAddress(Thermometer, i);
    printAddress(Thermometer);
  }
}

void loop(void)
{}

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

اکنون، سریال مانیتور را باز کنید. خروجی شما باید مشابه شکل زیر باشد:

خروجی نمونه کد تشخیص آدرس چند سنسور DS18B20 بر روی باس، در سریال مانیتور

همه آدرس­‌ها را یادداشت کنید، زیرا در مرحله بعدی به آن نیاز پیدا خواهید کرد.

خواندن سنسورهای DS18B20 با آدرس

کد زیر دمای سنسورهای DS18B20 را همراه با آدرس آن‌ها می­‌خواند اما پیش از اینکه آن را بارگذاری کنید، لازم است که آدرس سنسورهای DS18B20 را با آدرس­‌های سنسورهای خودتان که در کد قبلی به‌دست آورده‌­اید، جایگزین کنید.

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// Addresses of 3 DS18B20s
uint8_t sensor1[8] = { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC };
uint8_t sensor2[8] = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 };
uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };

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

void loop(void)
{
  sensors.requestTemperatures();
  
  Serial.print("Sensor 1: ");
  printTemperature(sensor1);
  
  Serial.print("Sensor 2: ");
  printTemperature(sensor2);
  
  Serial.print("Sensor 3: ");
  printTemperature(sensor3);
  
  Serial.println();
  delay(1000);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print(tempC);
  Serial.print((char)176);
  Serial.print("C  |  ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
  Serial.print((char)176);
  Serial.println("F");
}

خروجی کد بالا در سریال مانیتور مانند شکل زیر خواهد بود:

خروجی نمونه کد خواندن چند سنسور DS18B20 با آدرس، بر روی سریال مانیتور

توضیح کد:

در این قسمت، می‌خواهیم کد بالا را به‌طور کامل برای شما توضیح دهیم.

مطابق معمول کد با فراخوانی کتابخانه­‌ها و پینی که پایه دیتای سنسورها به آن متصل است و ایجاد شیء کتابخانه DallasTemperature شروع می‌­شود. در مرحله بعد، آدرس­‌هایی را که برای هر یک از سنسورهای دما به‌دست آمده است، وارد می‌کنیم. در این مورد، آدرس­‌ها به شکل زیر بوده است:

uint8_t sensor1[8] = { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC };
uint8_t sensor2[8] = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 };
uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };

در بخش setup، با استفاده از تابع ()begin کتابخانه را فراخوانی کرده و ارتباط سریال با کامپیوتر را راه­ اندازی می­‌کنیم.

در بخش loop، به‌سادگی با استفاده از تابع ()requestTemperatures، فرمان تبدیل دما را به تمام سنسورها ارسال می­‌کنیم. سپس، برای پرینت دمای سنسوری که آدرس آن به‌عنوان پارامتر فراخوان شده است، از تابع سفارشی  printTemperature(DeviceAddress deviceAddress)  استفاده می‌کنیم.

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print(tempC);
  Serial.print((char)176);
  Serial.print("C  |  ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
  Serial.print((char)176);
  Serial.println("F");
}

تابع بالا صرفاً تابع getTempC(deviceAddress) را برای نمایش دما بر حسب درجه سانتی‌گراد و تابع DallasTemperature::toFarenheit را برای نمایش دما بر حسب فارنهایت فراخوانی می‌­کند.

کلام آخر

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

مقالات مشابه

۸ دیدگاه. Leave new

  • سلام و خسته نباشید
    اکر قرار باشد دو عدد سنسور برای دو منظور متفاوت استفاده کنیم چه تضمین هست که با تعویض یک یا هر دو سنسور همان اندیس گذاری متناسب با محل نصب شده قبلی انجام شود
    اگر برای پرهیز از این احتمال به هم خوردن ترتیب ها از دو پایه مجزا استفاده کنیم با توجه به یکی بودن دستورات چگونه میتوان اینکار را انجام داد .
    با تشکر

    پاسخ
    • سلام مسعود عزیز، تشکر
      بله مشکل جابجا شدن اندیس‌ها با تعویض سنسور ممکنه رخ بده. برای استفاده از دوپایه مجزا کافیه به ابتدای کدها دقت کنید.
      ابتدا پایه Data رو مشخص کردیم (پایه ۲)، بعد با ذکر نام این پایه یک شی OneWire ایجاد کردیم (به نام oneWire) و در نهایت یک شی DallasTemperature به نام sensors ساختیم.
      شما می‌تونید همین کار رو برای یک پایه دیگه مثلا پایه ۳) هم انجام بدی و در ادامه کد، خواندن دما رو با دو شی مختلف انجام بدی.

      پاسخ
  • با سلام , احترام
    طبق نقشه چند سنسور نصب شده اما هنگام مانیتورینگ با اینکه همه کدهای بالا ثبت و فراخوانی شده تنها دمای یک سنسور را نمایش می دهد که هنگامی که تنها یک سنسور را وصل می گذاریم از سنسور باقیمانده داده نمایش می دهد و نمی تونم از همه سنسورها خروجی بگیریم چرا همه سنسورها رو نمایش نمیده
    با تغییر زمان تاخیر delay تغییر اعمال نمیشه و سرعت زمان نمایش خروجی کم یا زیاد نمیشه
    ممنون میشم راهنمایی بفرمایید

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

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

      پاسخ
  • سلام وقت بخیر . میشه همین کار رو برای سنسور رطوبت خاک خازنی هم انجام داد؟

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

      پاسخ

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.
You need to agree with the terms to proceed

پر بازدید ترین مقالات