Датчик DS18B20 від компанії DALLAS, один з найпопулярніших цифрових датчиків температури, з діапазоном вимірювання від -55 до +125 °C.
Особливістю даних датчиків є не тільки широкий діапазон вимірювання, а й висока точність, абсолютна похибка менше 0.5 °C в діапазоні від -10 до +85 °C. Роздільна здатність АЦП може бути змінена програмно користувачем від 9 до 12 bit.
Роздільна здатність
bit | °C |
---|---|
9 | 0.5 |
10 | 0.25 |
11 | 0.125 |
12 | 0.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 |
Схема підключення
Ще одна особливість датчика 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);
}