التواصل بين أجهزة استشعار درجة الحرارة الرقمية DS18B20 متعددة مع الاردوينو اكتب تعليقُا

تم نشر هذا المشروع لجميع الأشخاص المهتمين في مجال تصنيع وابتكار المشاريع الإلكترونية والبرمجية، و نود التنويه أن موقع انا الكتروني يخلي مسؤوليته التامة في حال لم يعمل المشروع لدى العميل أو في حال الاستخدام الخاطئ للمكونات الإلكترونية والكهربائية التي قد تؤدي لحدوث الحرائق أو غيرها لا سمح الله.

ـ

واحدة من أكبر مزايا DS18B20 هو أن DS18B20متعددة يمكن أن تتعايش على نفس الناقل أو سلك واحد . نظرًا لأن كل DS18B20 يحتوي على رمز تسلسلي فريد من نوعه 64 بت يتم حرقه في المصنع ، فمن الأسهل التمييز بينها عن بعضها البعض .

يوضح المشروع التالي كيفية التعامل مع DS18B20 متعددة في ناقل واحدة والحصول على قراءات درجة الحرارة من كل منهم . يمكن أن تكون هذه الميزة ميزة كبيرة عندما تريد التحكم في العديد من DS18B20s الموزعة على مساحة كبيرة .
قد يبدو الأمر مخيفًا ، لكن يجب أن تكون على دراية بأساسيات مستشعر درجة حرارة سلك واحد DS18B20 ، قبل الدخول في هذا المشروع .

أذا كانت تسمع بهذا الحساس للتو , فطالع المشروع التالي :

الأسلاك - ربط عدة مستشعرات حرارة DS18B20 مع الاردوينو

الاتصالات بسيطة إلى حد ما .

ابدأ بتوصيل جميع DS18B20s بالتوازي ، أي جميع دبابيس VDD ودبابيس GND ودبابيس الإشارة . ثم قم بتوصيل VDD إلى 5V ومن ثم أربط GND إلى الاردوينو وتوصيل دبوس الإشارة إلى رقم 2 على اردوينو .

بعد ذلك ، ستحتاج إلى إضافة مقاوم سحب بسعة 4.7k للحافلة بأكملها بين الإشارة ودبوس الطاقة للحفاظ على استقرار نقل البيانات . (عمليات السحب الداخلية على اردوينو لا تعمل)

Wiring-Multiple-DS18B20-Temperature-Sensors-With-Arduino
Finding-One-Wire-Address-Of-All-DS18B20-On-the-Bus

لأخذ القراءة من الحساس هنالك عدة طرق 

Method 1: Reading DS18B20 By Index

في هذه الطريقة ، عند تهيئة مكتبة Dallas Temperature ، فإنها تكتشف جميع المستشعرات التي تشترك في نفس الناقل . يعامل الناقل الاجهزة بأكملها كصفيف من أجهزة الاستشعار ويعين لهم فهرس أو عناوين . حتى نتمكن من تحديد كل مستشعر بفهرس وقراءة درجة الحرارة .

لتحميل الكود البرمجي اضغط هنا
#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);
}

إخراج الكود أعلاه يبدو وكأنه ..

Output-of-Multiple-DS18B20-By-Index-Method

Method 2: Reading DS18B20 By Address

نحن نعلم أن كل DS18B20 لديها عنوان 64 بت فريد مخصص لها , لتمييزها عن بعضها البعض . في هذه الطريقة ، سنجد هذا العنوان لتسمية كل مستشعر وفقًا لذلك . يمكن بعد ذلك استخدام العنوان لقراءة كل جهاز استشعار على حدة .

تنبيه : في حال لم تكن متأكد من قدرتك على تنفيذ خطوات المشروع يرجى استشارة شخص متخصص في هذا المجال.

العثور على عناوين DS18B20s على الناقل

يكتشف الكود التالي جميع DS18B20s الموجودة على الناقل ويطبع عنوانه المكون من سلك واحد على الشاشة التسلسلية .

يمكنك توصيل مستشعر واحد فقط في كل مرة للعثور على عنوانه (أو إضافة مستشعر جديد على التوالي) حتى تتمكن من تحديد كل مستشعر بواسطة عنوانه . ثم ، يمكنك تسمية كل جهاز استشعار .

لتحميل الكود البرمجي اضغط هنا
#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("");
}

الآن ، افتح الشاشة التسلسلية . يجب أن تحصل على شيء على النحو التالي

انسخ جميع العناوين كما نحتاج إليها في الكود البرمجي التالي .

قراءة DS18B20s حسب العنوان

الكود التالي يقرأ درجة الحرارة من DS18B20s بواسطة عناوينهم . قبل أن تتوجه لتحميل الكود ، تحتاج إلى تغيير عناوين DS18B20s مع العنوان الذي عثرت عليه في الكود السابق .

لتحميل الكود البرمجي اضغط هنا
#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");
}

إخراج الكود أعلاه يبدو وكأنه

Output-of-Multiple-DS18B20-By-Address-Method

أنتهت !!!

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *