Телефонуйте » (+38) 096 227 41 41

В попередньому уроці ми розглянули, як підключити датчик температури DS18B20 до Arduino та вивести показання на дисплей. Розглянемо детальніше, як змінити точність вимірювання та підключити кілька датчиків.

Основні параметри датчика DS18B20:

  1. Унікальний інтерфейс 1-Wire: вимагає тільки один контакт для зв’язку
  2. Кожний пристрій має унікальну 64-бітову серійну адресу пристрою, яка зберігається в ROM
  3. Живлення датчика в діапазоні від 3 В до 5,5 В
  4. Діапазон вимірюваних температур від -55 °C до +125 °C
  5. Доступний в трьох варіантах корпусів 8-pin SO (150 mils), 8-pin µSOP і 3-pin TO-92

 

Схема датчика DS18B20

Датчик температури DS18B20 працює з Arduino через протокол передачі даних 1-Wire і дозволяє підключити кілька датчиків на одну шину.
Датчики підключаються до Arduino двома способами:

  • ·    Зовнішнє підключення (через три проводи)
  • ·    Паразитне підключення (через два проводи)

Ми розглянемо зовнішнє підключення. в якому обмін даними здійснюється через середній вивід датчика DQ. Між виводами DQ і VDD треба підключити резистор номіналом 4,7 кОм. Живлення підключається до виводів VDD і GND, тобто, VDD підключаємо к + живлення 5 вольт, а GND - до мінусу живлення (земля). DQ підключаємо до цифрового виводу 2 на Arduino UNO.
Якщо треба підключити більше датчиків, то додаємо додаткові датчики за схемою:

Кожний датчик  температури має унікальну 64-бітову адресу пристрою, за якою у нас є можливість опитати визначений датчик і прочитати з нього значення температури.
Для роботи з датчиком рекомендується бібліотека DallasTemperature, як більш зручна та практична. Як встановити бібліотеку ми розглядали на попередніх уроках.
Після успішного завантаження бібліотеки і встановлення, запускаємо Arduino IDE, переходимо до прикладів роботи с датчиком, і вибираємо приклад Multiple:

Звертаємо увагу на рядок #define ONE_WIRE_BUS 2, де 2 - це номер цифрового виводу Arduino, до якого підключений датчик (якщо ми вибрали інший вивід. То змінюємо значення 2 на інше) і заливаємо скетч в нашу плату Arduino.
Відкриваємо монітор послідовного порту (Tools -> Serial Monitor):

Відкриваємо монітор порту, знімаємо позначку з “Автопрокрутка” і переміщуємося в самий верх вікна монітору порту:

Бачимо  рядки:

  • ·    Locating devices…Found 2 devices    –    кількість підключених датчиків 2 штуки
  • ·    Parasite power is: OFF  –   паразитне підключення відключене (у нас датчики підключені зовнішнім підключенням)
  • ·    Device 0 Address: 280054B604000092   –   адреса першого підключеного  датчика
  • ·    Device 1 Address: 289E95B504000057   –   адреса другого підключеного датчика
  • ·    Device 0 Resolution: 9  –  режим вимірювання першого датчика
  • ·    Device 1 Resolution: 9  –  режим вимірювання другого датчика

Далі рядки:

  • ·    Requesting temperatures…DONE  –  запит отримання температури з датчиків
  • ·    Device Address: 280054B604000092 Temp C: 7.00 Temp F: 44.60  –  адреса датчика, температура в градусах Цельсія і температура по Фаренгейту
  • ·    Device Address: 289E95B504000057 Temp C: 27.50 Temp F: 81.50  –  адреса датчика, температура в градусах Цельсія і температура по Фаренгейту

Датчики, як бачимо, працюють і ми отримуємо температуру.
Для зручного відображення температури і зчитування даних з одного датчика без використання бібліотеки, можна використати простіший код, Додамо в код кілька рядків, які дозволять задавати точність АЦП датчика, а також вкажемо рекомендовану затримку перетворення, яку треба збільшувати з ростом точності перетворення:
 
#include <OneWire.h>
OneWire ds(2);
 
void setup()
{
   Serial.begin(9600);
   // встановлюємо розрядність АЦП 9 біт, для прикладу, бо така розрядність за замовчуванням
   sensors.setResolution(insideThermometer, 9);
   Serial.print("Device 0 Resolution: ");
   Serial.print(sensors.getResolution(insideThermometer), DEC);
   Serial.println();
}

void loop()
{
   byte data[2];
   ds.reset();
   ds.write(0xCC);
   ds.write(0x44);
   delay(750); // Для розрядності 10 – не менше 200 мс, для 11 – 400 мс, а   для 12 – не менше 750 мс
   ds.reset();
   ds.write(0xCC);
   ds.write(0xBE);
   data[0] = ds.read();
   data[1] = ds.read();
   int Temp = (data[1]<< 8)+data[0];
   Temp = Temp>>4;
   Serial.println(Temp);
}

Підключення кількох датчиків

Для відображення температури з двох і більше датчиків рекомендується використати наведений нижче код:

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Thermometer1 = {
  0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x92 };  // адреса датчика DS18B20 280054B604000092
DeviceAddress Thermometer2 = {
  0x28, 0x9E, 0x95, 0xB5, 0x04, 0x00, 0x00, 0x57 };

void setup()
{
  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
  sensors.setResolution(Thermometer2, 10);

  Serial.begin(9600);

  // встановлюємо розрядність АЦП 9 біт
  sensors.setResolution(insideThermometer, 9);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC);
  Serial.println();
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop()
{
  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);

  Serial.print("Sensor2  ");
  printTemperature(Thermometer2);
  delay(100);
}


В рядку #define ONE_WIRE_BUS 2 вказуємо номер використаного виводу 2, завантажуємо код, відкриваємо монітор порту:
6
Де у нас Sensor1  7.50 температура в градусах Цельсія на датчику 1, який доступний за адресою  0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x92, а  Sensor2   27.75 - температура другого датчика, доступного за адресою 0x28, 0x9E, 0x95, 0xB5, 0x04, 0x00, 0x00, 0x57.
Якщо ж треба підключити три і більше датчиків, то ми змінюємо код. Для початку нам треба запустити тестовий скетч Multiple, потім записати адреси всіх датчиків (наприклад, 280054B604000086, яку потім переводимо в формат адреси 0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x86).
Після цього в скетчі вище, після рядка
 
DeviceAddress Thermometer2 = {
   0x28, 0x9E, 0x95, 0xB5, 0x04, 0x00, 0x00, 0x57 };


додаємо рядок з адресою нашого третього датчика:

DeviceAddress Thermometer3 = {
   0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x86 };


потім в void setup() додаємо рядок:

sensors.setResolution(Thermometer3, 10);

і переходимо до циклу  void loop(), в який додаємо рядки, які відповідають за відображення температури з третього датчика:

Serial.print("Sensor3  ");
  printTemperature(Thermometer3);


Для відображення, наприклад, п’яти датчиків, просто дописуємо код, як це робили вище.

За матеріалами: arduino-project.net

Новини

  • SDR в IoT

    iotSDR пропонує платформу розробок для IoT-радіо та мережевих доменів. На платі два передавачі Microchip AT86RF215, для вводу-виводу модему на Xilinx ZYNQ SoC, приймач GNSS MAX2769 для GPS, Galileo, BieDou та Glonass. Плата сумісна з ПЗ GNURadio SDR. Дозволяє розробити протоколи фізичного рівня LoRa, SigFox, WightLess, Bluetooth, BLE, 802.15.4, ZigBee тощо для IoT, або шлюз IoT через TheThingsNetwork, LPWAN або Google Thread. Пам'ять EEPROM: 1x AT24MAC602 , flash-пам'ять: 1x QSPI 128 Мб, RAM: 256 MБ DDR3,слот для Micro SD карти, входи/виходи: 2x 8-бітних інтерфейси PL, інтерфейс 8-бітного PS, Gigabit Ethernet, USB 2.0 (USB3310), USB 2.0 (CP2104), 2x SMA RF-роз'єми для приймача діапазонів IoT, 2x SMA RF-роз'єми для приймача 2,4 ГГц , RF-роз'єм приймач GNSS, FPGA-роз'єм JTAG для програмування. Розміри плати: 76,2 мм x 101,6 мм.

     

    in Новини

Записатися на курс