ELECTRONICS

Библиотека OneWire и DallasTemperature

менеджер: OneWire, DallasTemperaturePaul Stoffregen; Miles Burtonверсия OneWire 2.3.8, DallasTemperature 4.0.6

Термометры DS18B20: несколько датчиков на одном проводе, у каждого свой адрес.

DS18B20 говорит по шине 1-Wire: один провод данных, и на нём может висеть хоть десяток датчиков, каждый со своим 64-битным адресом. OneWire реализует саму шину, DallasTemperature — команды термометра поверх неё. Ставятся обе, включаются обе.

Измерение занимает до 750 мс при полном разрешении. По умолчанию requestTemperatures() ждёт это время сам; для отзывчивого скетча ожидание отключают и читают результат позже.

Установка и подключение

В менеджере библиотек ищите OneWire, DallasTemperature автора Paul Stoffregen; Miles Burton. Если менеджер предложит поставить зависимости — соглашайтесь. Как открыть менеджер и что делать, если библиотека не находится, — в общей статье про библиотеки.

#include <OneWire.h>
#include <DallasTemperature.h>

Создание объекта — обычно до setup():

OneWire oneWire(2);                       // провод данных на D2
DallasTemperature sensors(&oneWire);
sensors.begin();                          // в setup()

Методы

Только то, что нужно в обычном скетче. Сигнатуры сверены с версией OneWire 2.3.8, DallasTemperature 4.0.6.

begin()
Найти датчики на шине.
getDeviceCount()
Сколько датчиков найдено.
requestTemperatures()
Запустить измерение на всех датчиках. Ждёт окончания, если ожидание не отключено.
getTempCByIndex(uint8_t i)
Температура i-го датчика по порядку обнаружения, °C. −127 — датчик не ответил.
getTempC(const uint8_t* address)
Температура по адресу — надёжнее индекса, если датчиков несколько.
getAddress(uint8_t* address, uint8_t i)
Узнать адрес i-го датчика, чтобы потом обращаться по нему.
setResolution(uint8_t bits)
Разрешение 9–12 бит: 9 — шаг 0,5° за 94 мс, 12 — шаг 0,0625° за 750 мс.
setWaitForConversion(bool wait)
false — requestTemperatures() возвращается сразу, результат читают позже.
isConversionComplete()
Готово ли измерение — для варианта без ожидания.
DEVICE_DISCONNECTED_C
Константа −127: столько возвращается, если датчика нет.

Пример

#include <OneWire.h>
#include <DallasTemperature.h>

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

void setup() {
  Serial.begin(9600);
  sensors.begin();
  Serial.print("Датчиков: ");
  Serial.println(sensors.getDeviceCount());
}

void loop() {
  sensors.requestTemperatures();
  float t = sensors.getTempCByIndex(0);
  if (t == DEVICE_DISCONNECTED_C) {
    Serial.println("Датчик не найден");
  } else {
    Serial.print(t, 2);
    Serial.println(" C");
  }
  delay(1000);
}

Резистор 4,7 кОм между данными и питанием обязателен. Без него датчик «находится», но отвечает −127 или 85.

На чём попадаются

Показывает 85,00

Значение по умолчанию после включения: измерение не прошло. Обычно паразитное питание или слишком короткая пауза. Проверьте резистор 4,7 кОм и питание.

Показывает −127

Датчик не отвечает: нет резистора, перепутаны выводы или обрыв. Выводы у DS18B20: плоской стороной к себе — GND, DATA, VDD.

Датчики меняются местами

Индекс зависит от порядка обнаружения. Для нескольких датчиков используйте адреса, полученные через getAddress().

Loop тормозит на 750 мс

requestTemperatures() ждёт измерение. setWaitForConversion(false) плюс проверка isConversionComplete() — и цикл свободен.

Где используется на сайте

Что дальше