Библиотека OneWire и DallasTemperature
Термометры 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() — и цикл свободен.