Цифровой термометр от −55 до +125 °C с точностью ±0,5 °C. Один сигнальный провод, у каждого датчика свой адрес, поэтому на одной линии можно держать десяток термометров.
DS18B20 общается по шине 1-Wire: один провод данных (DQ) с подтяжкой к питанию резистором 4,7 кОм. Каждый датчик имеет уникальный 64-битный адрес, поэтому на одну линию можно повесить много термометров и читать их по адресам. Температура измеряется с разрешением до 12 бит (шаг 0,0625 °C), преобразование занимает до 750 мс.
В скетче используются библиотеки OneWire и DallasTemperature: requestTemperatures() запускает измерение, getTempCByIndex(0) читает первый датчик. Значение -127 (DEVICE_DISCONNECTED_C) означает, что датчик не отвечает.
#include <OneWire.h>
#include <DallasTemperature.h>
// Данные DS18B20 — на GPIO4. На настоящей плате между этим выводом и 3V3
// ставят резистор 4,7 кОм; в симуляторе подтяжка на линии есть всегда.
#define ONE_WIRE_PIN 4
OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(115200);
sensors.begin();
Serial.printf("датчиков на шине: %d\n", sensors.getDeviceCount());
}
void loop() {
sensors.requestTemperatures(); // запустить измерение и дождаться его
float t = sensors.getTempCByIndex(0); // первый датчик на шине
if (t == DEVICE_DISCONNECTED_C) {
Serial.println("датчик не отвечает");
} else {
Serial.printf("%.2f °C\n", t);
}
delay(1000);
}
В железе
У платы-модуля подтяжка 4,7 кОм обычно уже распаяна, а у корпуса TO-92 и водонепроницаемого зонда её ставят самостоятельно между DQ и VDD. Провода зонда: красный — питание, чёрный — земля, жёлтый или белый — данные.
Частые ошибки
Нет подтяжки 4,7 кОм на линии данных: библиотека возвращает -127 вместо температуры.
Перепутаны выводы корпуса TO-92: при обратной полярности датчик за секунды нагревается и выходит из строя.
Показание 85,0 °C: это значение датчика до первого измерения. Вызывайте requestTemperatures() и дождитесь окончания преобразования.
Отключить ожидание (setWaitForConversion(false)) и читать значение сразу: преобразование занимает до 750 мс, и возвращается старое показание.