در این آموزش، نحوه اتصال و راه اندازی چند سنسور دما DS18B20 با آردوینو و خواندن دما از هر کدام از آنها را به شما نشان خواهیم داد.
یکی از مزایای بزرگ سنسور دما DS18B20 این است که در یک ارتباط تک سیمه میتوان از چندین سنسور DS18B20 (ماکزیمم 8 سنسور) استفاده کرد و تنها از طریق یک پایه دیجیتال آنها را کنترل نمود. از آنجاییکه هر سنسور DS18B20 دارای یک کد سریال 64 بیتی مجزا است که در کارخانه به آن اختصاص داده شده است، تشخیص آنها از هم بسیار آسان میباشد. این ویژگی این امکان را به شما میدهد تا سنسورهای مختلفی را در نقاط مختلف یک فضای بزرگ کنترل کنید.
قبل از اینکه بیشتر در مورد این موضوع صحبت کنیم، حتما باید با مبانی سنسور دما DS18B20 آشنا باشید. به همین خاطر بهتر است ابتدا مقاله زیر را مطالعه کنید.
اتصال سنسور دما دیجیتال DS18B20 به آردوینو
بهتر است بیشتر از این وقت را هدر ندهیم و اتصال چند سنسور DS18B20 را به آردوینو شروع کنیم.
سیمکشی – راه اندازی چند سنسور دما DS18B20 با آردوینو
قطعاتی که برای راه اندازی چند سنسور دما DS18B20 نیاز دارید، به شرح زیر است:
اتصالات نسبتاً ساده هستند.
ابتدا با اتصال همه DS18B20ها بهصورت موازی کار را شروع کنید. به عبارتی، همه پایههای مشابه یعنی پایههای VDD، پایههای GND و پایههای سیگنال را بههم متصل نمایید. سپس، VDD را به خروجی 5 ولت آردوینو، GND را به زمین آردوینو و پایه سیگنال را به پایه دیجیتال 2 آردوینو وصل کنید. در مرحله بعد، برای پایدار ماندن انتقال داده باید پایه داده سنسور DS18B20 از طریق یک مقاومت 4.7 کیلو اهمی pull-up شود ( مقاومت pull-up داخلی آردوینو برای این کار مناسب نیست).
با توجه به تصویر زیر اتصالات را انجام دهید:
نصب کتابخانه برای سنسور DS18B20
پروتکل تک سیم دالاس تا حدودی پیچیده است و برای ارتباط دو طرفه با سنسور به کدهای زیادی نیاز است. برای راحت شدن کار، توابع کتابخانههای Dallas Temperature.h را نصب کنید تا بتوانید برای خواندن دما از سنسور، از دستورهای ساده استفاده کنید.
برای نصب کتابخانه، مسیر Sketch>Include Library>Manage Libraries را طی کنید. سپس، کمی صبر کنید تا Library Manager، فهرست کتابخانهها را دانلود کند و لیست کتابخانههای نصب شده را بهروزرسانی نماید.
سپس، کلمه DS18b20 را تایپ کنید تا نتایج جستجو شما فیلتر شود. پس از این کار چند نتیجه به شما نشان داده خواهد شد. از بین آنها، Dallas Temperature by Miles Burton را پیدا کنید. آن را انتخاب کرده و سپس، بر روی گزینه نصب کلیک کنید.
کتابخانه Dallas Temperature یک کتابخانه سخت افزاری است که توابع سطح پایین را مدیریت میکند. این کتابخانه برای اینکه بتواند علاوه بر سنسور DS18B20، با هر دستگاه تک سیم که از پروتکل تک سیم استفاده میکند، ارتباط برقرار کند، باید به همراه کتابخانه 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 شروع میشود.
در بخش 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 را با آدرسهای سنسورهای خودتان که در کد قبلی بهدست آوردهاید، جایگزین کنید.
#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");
}
خروجی کد بالا در سریال مانیتور مانند شکل زیر خواهد بود:
توضیح کد:
در این قسمت، میخواهیم کد بالا را بهطور کامل برای شما توضیح دهیم.
مطابق معمول کد با فراخوانی کتابخانهها و پینی که پایه دیتای سنسورها به آن متصل است و ایجاد شیء کتابخانه 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 تغییر اعمال نمیشه و سرعت زمان نمایش خروجی کم یا زیاد نمیشه
ممنون میشم راهنمایی بفرمایید
سلام مجتبی عزیز،
اگر از روش اول استفاده میکنی و ابتدای شروع به کار آردوینو، تعداد سنسورهای تشخیص دادهشده ۱ عدد هست، باید اتصالات رو بررسی کنی. مقاومت پول آپ فراموش نشه. همچنین کد مربوط به خوندن آدرسها رو هم امتحان کن و ببین سنسورها تشخیص داده میشن و آدرسها متفاوت است یا نه.
سلام. ممنون از مطلب مفیدتون. من میخوام یه سیستم برای تشخیص دمای نقاط مختلف آبگرمکن راه اندازی کنم. میخوام پس از هر زمان مشخصی دما رو نشون بده و در نهایت گراف هر کدوم از سنسورها رو بهم بده که بر حسب زمان باشه. ممنون میشم راهنمایی کنید.
سلام وفای عزیز، خواهش میکنم،
خواندن دما از چندین سنسور دما رو در این مقاله بررسی کردیم. برای نمایش این اطلاعات به صورت گراف، میتونی از ابزار رسم گراف خود آردوینو استفاده کنی که توی این مقاله ازش استفاده کردیم:
https://roboeq.ir/blog/%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D8%B3%D9%86%D8%B3%D9%88%D8%B1-%D8%B6%D8%B1%D8%A8%D8%A7%D9%86-%D9%82%D9%84%D8%A8/
یا اینکه حرفهایتر کار کنی و اطلاعات رو به لب ویو یا متلب بفرستی و با استفاده از اونها گراف رسم کنی.
سلام وقت بخیر . میشه همین کار رو برای سنسور رطوبت خاک خازنی هم انجام داد؟
سلام امید عزیز، ممنونیم از شما
خیر، ماژول سنسور رطوبت سنج خاک خازنی دارای خروجی آنالوگ هست که با این سنسور متفاوته.
آیا باید قبل از استفاده ی این سنسور ها ….سنسور را کانفیگ کرد ؟ زیرا هیچ دمایی نمایش داده نمیشود
سلام شهاب عزیز
سنسورها نیاز به کانفیگ خاصی ندارند. اتصالاتتان رو بررسی کنید و اگر نتیجه نگرفتید می توانید مورد رو با جزئیات بیشتر مطرح کنید تا راهنمایی کنیم.