ELECTRONICS

DS18B20 и Arduino: схема подключения, паразитное питание, библиотека и скетч

Датчики температуры и влажностиСкетч проверен компиляцией

DS18B20 — цифровой датчик температуры в корпусе размером с транзистор. Точность полградуса, диапазон от минус пятидесяти пяти до плюс ста двадцати пяти, а показания приходят уже готовым числом: пересчитывать напряжение в градусы, как с термистором, не нужно.

Главная его особенность — шина 1-Wire. У каждого датчика есть уникальный заводской номер, поэтому на один провод можно повесить хоть десяток датчиков, и плата будет обращаться к каждому по адресу. Для тёплого пола, теплицы или аквариума это решающее преимущество.

Обычное подключение: три провода

DALLAS18B202034C4+817AB
Наведите курсор на провод — расскажу, зачем он нужен.

Паразитное питание: два провода вместо трёх

У DS18B20 есть режим, в котором питание он берёт прямо с линии данных. Вывод VDD при этом сажают на землю, а внутренний конденсатор датчика заряжается в те моменты, когда на шине высокий уровень, и питает микросхему во время измерения.

Зачем это нужно: до датчика идёт не три жилы, а две. Когда датчик закопан в грядке, залит в бетон или тянется по трубе на двадцать метров, экономия одной жилы — это реальная экономия кабеля и одного места пайки.

Плата за удобство: во время преобразования температуры датчик потребляет заметно больше, чем может дать обычная подтяжка. Поэтому на время измерения линию данных приходится жёстко подтягивать к питанию — это делает библиотека, если сказать ей, что режим паразитный. И длинные линии в этом режиме работают заметно капризнее.

Схема паразитного питания

DALLAS18B202034C4+817AB
Наведите курсор на провод — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
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 чувствительна к ёмкости кабеля. На расстояниях больше десяти метров берут витую пару, землю пускают в паре с данными и уменьшают сопротивление подтяжки.

Что понадобится