DS18B20 и Arduino: схема подключения, паразитное питание, библиотека и скетч
DS18B20 — цифровой датчик температуры в корпусе размером с транзистор. Точность полградуса, диапазон от минус пятидесяти пяти до плюс ста двадцати пяти, а показания приходят уже готовым числом: пересчитывать напряжение в градусы, как с термистором, не нужно.
Главная его особенность — шина 1-Wire. У каждого датчика есть уникальный заводской номер, поэтому на один провод можно повесить хоть десяток датчиков, и плата будет обращаться к каждому по адресу. Для тёплого пола, теплицы или аквариума это решающее преимущество.
Обычное подключение: три провода
Паразитное питание: два провода вместо трёх
У DS18B20 есть режим, в котором питание он берёт прямо с линии данных. Вывод VDD при этом сажают на землю, а внутренний конденсатор датчика заряжается в те моменты, когда на шине высокий уровень, и питает микросхему во время измерения.
Зачем это нужно: до датчика идёт не три жилы, а две. Когда датчик закопан в грядке, залит в бетон или тянется по трубе на двадцать метров, экономия одной жилы — это реальная экономия кабеля и одного места пайки.
Плата за удобство: во время преобразования температуры датчик потребляет заметно больше, чем может дать обычная подтяжка. Поэтому на время измерения линию данных приходится жёстко подтягивать к питанию — это делает библиотека, если сказать ей, что режим паразитный. И длинные линии в этом режиме работают заметно капризнее.
Схема паразитного питания
Распиновка
| Провод | Куда и зачем |
|---|---|
| GND | Земля. Первый вывод, если смотреть на плоскую грань с маркировкой. В герметичном исполнении — чёрный провод. |
| DQ | Линия данных 1-Wire. Средний вывод, в герметичном исполнении жёлтый провод. |
| VDD | Питание 3,3–5 В, красный провод. В паразитном режиме сажается на землю. |
Характеристики
- Диапазон
- −55…+125 °C
- Точность
- ±0,5 °C в диапазоне −10…+85 °C
- Разрешение
- настраиваемое, 9–12 бит
- Время преобразования
- до 750 мс при 12 битах
- Интерфейс
- 1-Wire, у каждого датчика свой адрес
- Питание
- 3,0–5,5 В или паразитное
Несколько датчиков на одном проводе
Это главное, чем DS18B20 выигрывает у DHT и термистора. У каждого экземпляра есть уникальный шестидесятичетырёхбитный адрес, прошитый на заводе. Все датчики вешаются на одну и ту же линию данных, и плата обращается к каждому по адресу.
Подтягивающий резистор при этом нужен один на всю шину, а не по одному на датчик. Практический предел — около десяти датчиков на линии длиной в несколько метров; дальше начинают мешать ёмкость провода и наводки.
Адреса узнают один раз: загружают скетч, который печатает найденные на шине устройства, и записывают их. Дальше в программе к каждому обращаются по его адресу — так вы точно знаете, какой датчик в подвале, а какой на чердаке.
Библиотека
OneWire + DallasTemperature— Ставятся через менеджер библиотек. Первая отвечает за протокол шины, вторая переводит сырые данные в градусы. Нужны обе.
Готовый скетч
#include <OneWire.h>
#include <DallasTemperature.h>
const int PIN_ONEWIRE = 2;
OneWire oneWire(PIN_ONEWIRE);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
sensors.begin();
int count = sensors.getDeviceCount();
Serial.print("Найдено датчиков: ");
Serial.println(count);
if (sensors.isParasitePowerMode()) {
Serial.println("Режим питания: паразитный");
}
}
void loop() {
sensors.requestTemperatures(); // команда всем датчикам на шине
for (int i = 0; i < sensors.getDeviceCount(); i++) {
float t = sensors.getTempCByIndex(i);
// -127 означает, что датчик не ответил
if (t == DEVICE_DISCONNECTED_C) {
Serial.print("Датчик ");
Serial.print(i);
Serial.println(": нет связи");
continue;
}
Serial.print("Датчик ");
Serial.print(i);
Serial.print(": ");
Serial.print(t);
Serial.println(" C");
}
delay(2000);
}Скетч собирается arduino-cli под Arduino UNO
Библиотека сама определяет, сколько датчиков на шине и в каком режиме они питаются. Значение минус сто двадцать семь — это не температура, а признак того, что датчик не ответил: почти всегда виноват забытый подтягивающий резистор.
Частые ошибки
Датчик показывает −127 градусов
Это код ошибки, а не температура. Причина номер один — нет подтягивающего резистора на 4,7 кОм между линией данных и питанием. Причина номер два — обрыв или плохой контакт.
Показывает 85 градусов
Тоже служебное значение: так датчик отвечает, если его опросили раньше, чем он закончил преобразование. Дайте ему время — при двенадцати битах это до трёх четвертей секунды.
Перепутаны выводы
У DS18B20 порядок GND, DQ, VDD — питание крайнее, а не среднее. В герметичном исполнении цвета проводов у разных партий отличаются, поэтому лучше прозвонить, а не доверять цвету.
В паразитном режиме датчик работает через раз
Обычной подтяжки не хватает на время преобразования. Нужна либо жёсткая подтяжка транзистором, которую умеет библиотека, либо переход на обычное питание в три провода.
На длинной линии показания пропадают
Шина 1-Wire чувствительна к ёмкости кабеля. На расстояниях больше десяти метров берут витую пару, землю пускают в паре с данными и уменьшают сопротивление подтяжки.
Что понадобится
- Датчик DS18B20 в корпусе TO-92 или в герметичной гильзе
- Резистор 4,7 кОм
- Arduino UNO
- Провода «папа-мама»