Датчик температуры DS18B20: полное руководство для начинающих
DS18B20 — пожалуй, самый популярный цифровой датчик температуры среди энтузиастов Arduino, ESP8266 и других микроконтроллеров. Он сочетает простоту подключения, высокую точность и уникальную возможность: на одном проводе данных можно «повесить» десятки таких датчиков! В этой статье разберём его характеристики, способы подключения и пример кода.

Что такое DS18B20 и зачем он нужен
DS18B20 — это цифровой температурный сенсор, разработанный компанией Dallas Semiconductor (ныне часть Analog Devices) . Он пришёл на смену более старой модели DS1820 и быстро завоевал популярность благодаря своему интерфейсу 1-Wire. Вам не нужен АЦП — датчик сам преобразует температуру в цифровой сигнал и передаёт его по одному проводу.
Области применения:
- Мониторинг температуры в помещениях, теплицах, аквариумах ;
- Контроль теплоносителя в системах отопления и «тёплого пола» ;
- Защита электронных устройств от перегрева;
- Уличные метеостанции, холодильное оборудование .
Технические характеристики
Важная деталь: высокая точность (±0.5°C) гарантируется именно в бытовом диапазоне -10…+85°C. При экстремальных температурах погрешность может увеличиваться до ±2°C .
Главные преимущества DS18B20
1. Цифровой интерфейс 1-Wire
Датчик передаёт уже готовое числовое значение температуры. Длина проводов практически не влияет на показания — это не аналоговый сигнал, который может искажаться .
2. Уникальный 64-битный ID
Каждый DS18B20 имеет «серийный номер», записанный заводом-изготовителем . Благодаря этому вы можете подключать множество датчиков параллельно на одну линию данных, а микроконтроллер будет различать их по уникальному коду. На один порт можно повесить до 30 сенсоров .
3. Два способа питания
- Внешнее питание (по трём проводам) — стабильно и надёжно.
- Паразитное питание (по двум проводам) — датчик получает энергию от линии данных. Экономит провод, но требует более аккуратного подхода .
4. Встроенная сигнализация
Можно установить верхний и нижний пороги температуры. Датчик сам умеет сигнализировать о выходе за пределы .
Варианты исполнения
DS18B20 выпускается в нескольких форм-факторах :
- В корпусе TO-92 — классический «транзисторный» вид для монтажа на плату.
- Герметичный водонепроницаемый датчик — сенсор помещён в металлическую гильзу (обычно 6×35 мм) и залит компаундом, от него идёт трёхжильный кабель длиной 0.9–3 м . Идеально для аквариумов, уличных метеостанций и систем полива.
- На модуле — готовая плата с разъёмом и обвязкой (подтягивающий резистор, фильтр по питанию) .
Подключение к ESP8266 или Arduino
Распиновка
У датчика три вывода (цвета проводов могут отличаться, уточняйте по документации) :
| Сигнал | Модель 1 | Модель 2 | Модель 3 |
|---|---|---|---|
| Vdd (питание) | Красный | Красный | Красный |
| GND (земля) | Чёрный | Чёрный | Жёлтый |
| Data (данные) | Синий | Жёлтый | Зелёный |
Схема подключения (внешнее питание)
- Vdd → 3.3V или 5V (на ESP8266 лучше 3.3V).
- GND → GND.
- Data → любой цифровой пин (например, D1 или GPIO5).
Между Data и Vdd обязательно установить подтягивающий резистор номиналом 4.7 кОм. Без него датчик работать не будет . На многих модулях этот резистор уже впаян.
Подключение нескольких датчиков
Все выводы Data объединяются, точно так же объединяются питание и земля. Микроконтроллер будет опрашивать датчики по их уникальным адресам.
Программирование: пример кода для Arduino/ESP8266
Для работы с DS18B20 вам понадобятся две библиотеки (обе доступны в менеджере библиотек Arduino IDE):
- OneWire — отвечает за низкоуровневый протокол.
- DallasTemperature — высокоуровневая обёртка, упрощающая чтение температуры.
Установите их через менеджер библиотек. В некоторых источниках рекомендуют использовать именно библиотеку от milesburton .
Базовый скетч (чтение одного датчика)
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS D1 // Пин, к которому подключён датчик
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(115200);
sensors.begin(); // Инициализация датчиков
}
float getTemperature() {
float temp;
do {
sensors.requestTemperatures(); // Запрос измерения
temp = sensors.getTempCByIndex(0); // Чтение температуры от первого датчика
delay(100);
} while (temp == 85.0 || temp == (-127.0)); // 85°C — начальное значение, -127 — ошибка
return temp;
}
void loop() {
float temperature = getTemperature();
Serial.print("Температура: ");
Serial.print(temperature);
Serial.println(" °C");
delay(2000);
}
Поиск датчиков (если их несколько)
void printAddress(DeviceAddress deviceAddress) {
for (uint8_t i = 0; i < 8; i++) {
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
void setup() {
// ...
sensors.begin();
Serial.print("Найдено датчиков: ");
Serial.println(sensors.getDeviceCount());
DeviceAddress addr;
for (int i = 0; i < sensors.getDeviceCount(); i++) {
if (sensors.getAddress(addr, i)) {
Serial.print("Датчик ");
Serial.print(i);
Serial.print(": ");
printAddress(addr);
Serial.println();
}
}
}
Возможные проблемы и их решение
1. Не компилируется — «D1 was not declared in this scope»
Если используете NodeMCU или Wemos, убедитесь, что в Arduino IDE выбрана правильная плата (NodeMCU 1.0, а не Generic ESP8266) . Вместо D1 можно использовать номер пина GPIO5.
2. Датчик показывает 85°C
Это начальное значение после включения. Обычно достаточно подождать 750 мс, либо добавить в код проверку, как в примере выше .
3. Нет ответа от датчика
Проверьте подтягивающий резистор 4.7 кОм между Data и Vdd. Для ESP8266 убедитесь, что питание подаётся именно 3.3 В.
4. При паразитном питании датчик «зависает»
Для режима преобразования (команды 0x44 и 0x48) требуется мощная подтяжка шины к питанию. В сложных случаях лучше перейти на трёхпроводное подключение .
Области применения: реальные проекты
- Умный полив — контроль температуры воды или почвы в теплице.
- Домашняя метеостанция — уличный герметичный датчик DS18B20 работает годами.
- Автоматизация аквариума — поддержание стабильной температуры воды.
- Системы отопления — мониторинг температуры теплоносителя и обратки .
- Холодильное оборудование — сигнализация о превышении порогов .