Підключення датчика температури DS18B20 до Arduino та ESP

Датчик DS18B20 від компанії DALLAS, один з найпопулярніших цифрових датчиків температури, з діапазоном вимірювання від -55 до +125 °C.

ds18b20 waterproof
ds18b20
ds18b20 g1

Особливістю даних датчиків є не тільки широкий діапазон вимірювання, а й висока точність, абсолютна похибка менше 0.5 °C в діапазоні від -10 до +85 °C. Роздільна здатність АЦП може бути змінена програмно користувачем від 9 до 12 bit.

Роздільна здатність

bit°C
90.5
100.25
110.125
120.0625

Підключення

Для підключення використовується шина 1-Wire Bus System. Перевагою цієї шини є можливість підключення теоретично необмежену кількість пристроїв на одну лінію. Сам датчик має унікальний 64 розрядний ідентифікатор що в теорії дає можливість під’єднати на одну лінію 264 = 18 446 744 073 709 551 616 датчиків DS18B20.

  • Напруга живлення від 3 до 5.5 V
  • Струм в очікуванні 750 nА
  • Струм в роботі 1 мА
  • Похибка в діапазоні від -10 до +85 ±0.5 °C
  • Похибка в діапазоні від -55 до +125 ±2 °C

Час відповіді при різній роздільній здатності

bitмілісекунди
9до 100
10до 200
11до 400
12до 750
ds18b29 pinout
Схема підключення

Ще одна особливість датчика DS18B20 – це можливість працювати по дводротовій лінії, на паразитному живленні.

Довжина лінії 1-Wire для датчика DS18B20 10 і навіть 50 метрів. Залежить від якості провідників, від зовнішніх наведень також від екранування провідників.

Вита пара (мідна не китайська) не екранована, деревоподібне підключення, трьох провідне 12 датчиків, до най віддаленішого 34 метри. Підтяжка 2.2кОм працює вже декілька років без нарікань. Єдина проблема яка виникала, якщо опитувати всі датчики одночасно сильно просідає напруга і дані від датчиків не приходили. Для розв’язання даної проблеми потрібно опитувати датчики почергово.

Код програми

Для Arduino та ESP код однаковий

Додайте наступні бібліотеки у файл platformio.ini

lib_deps = 
  paulstoffregen/OneWire @ ^2.3.6
  milesburton/DallasTemperature @ ^3.9.1

Приклад для одного датчика

#include "OneWire.h"
#include "DallasTemperature.h"
#define DS_PIN 5

OneWire oneWire(DS_PIN);
DallasTemperature ds(&oneWire);

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

void loop()
{
    ds.requestTemperatures();
    Serial.print(ds.getTempCByIndex(0));
    Serial.println(" C");
}

Приклад знаходить всі датчики та відображає інформацію про них

#include "OneWire.h"
#include "DallasTemperature.h"
#define DS_PIN 5

OneWire oneWire(DS_PIN);
DallasTemperature ds(&oneWire);

DeviceAddress sensorAddres;

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

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

void loop()
{
    int num = ds.getDeviceCount();
    Serial.print("Number: ");
    Serial.println(num);

    if (num < 1)
    {
        Serial.println("Sensor not found");
    }
    else
    {
        for (int i = 0; i < num; i++)
        {
            Serial.print("Sensor ");
            Serial.print(i);
            Serial.print(": ");
            ds.requestTemperatures();
            Serial.print(ds.getTempCByIndex(i));
            Serial.println(" C");
            Serial.print("Parasite power is: ");
            if (ds.isParasitePowerMode())
            {
                Serial.println("ON");
            }
            else
            {
                Serial.println("OFF");
            }
            if (!ds.getAddress(sensorAddres, 0))
                Serial.print("Unable to find address for Device: ");
            Serial.println(i);

            Serial.print("Device ");
            Serial.print(i);
            Serial.print(" Address: ");
            printAddress(sensorAddres);
            Serial.println();

            Serial.print("Device ");
            Serial.print(i);
            Serial.print(" resolution: ");
            int resolution = ds.getResolution(sensorAddres);
            Serial.println(resolution);
            if (resolution != 9)
            {
                ds.setResolution(sensorAddres, 9);
                Serial.print("Device ");
                Serial.print(i);
                Serial.println(" set resolution: 9");
            }
        }
    }
    delay(3000);
}

Підключення датчика температури волошості та тиску BME280

Вимірювання температури за допомогою терморезистора

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *