Датчик температуры DS18B20: обзор и подключение, включая водонепроницаемую версию
У термистора и LM35 общая беда: измерить напряжение — ещё не узнать температуру. Термистору нужны АЦП и таблица пересчёта, LM35 — АЦП и стабильная опора. DS18B20 снимает весь этот слой: внутри корпуса стоит измеритель с АЦП, и контроллер получает готовое число по одному проводу данных. А по этому же проводу можно опрашивать хоть десяток датчиков: у каждого свой уникальный 64-битный серийный код в ROM, зашитый на заводе.
Отсюда и список мест, где его ставят: тёплый пол в стяжке, бак с водой, аквариум, теплица, улица за окном. Отдельная история — водонепроницаемая версия: тот же чип в металлической гильзе с припаянным кабелем, стык залит герметиком. Стоит она ненамного дороже голого TO-92, а избавляет от пайки, термоусадки и протечек. Для воды, грунта и мороза это вариант по умолчанию.
Как устроена шина 1-Wire
Проводов всего два: данные и земля. Питание подаётся третьим проводом (3,0–5,5 В по паспорту) либо паразитно, от самой линии данных, — тогда VDD сажают на землю. Линия open-drain, поэтому без подтягивающего резистора шина мертва: в паспорте Analog Devices (Maxim) указана подтяжка «примерно 5 кОм», на практике ставят ближайший стандартный номинал 4,7 кОм. Команды адресные: мастер перечисляет устройства по ROM-кодам, поэтому число датчиков на одной линии фактически не ограничено.
Разрешение переключается от 9 до 12 бит, по умолчанию 12 — шаг 0,0625 °C. За точность платим временем: при 12 битах преобразование длится до 750 мс, при 9 битах — 93,75 мс. С паразитным питанием есть засада: во время измерения датчик тянет до 1,5 мА, и обычной подтяжки ему не хватает. По паспорту нужно в течение 10 мкс после команды «старт измерения» прижать линию к питанию транзистором и держать её до конца преобразования. Совет начинающему: питайте тремя проводами и не трогайте паразитный режим.
Характеристики из паспорта
| Параметр | Значение |
|---|---|
| Диапазон измерений | −55…+125 °C |
| Точность | ±0,5 °C (−10…+85 °C); ±1 °C (−30…+100 °C); ±2 °C (весь диапазон) |
| Разрешение | 9–12 бит: 0,5 / 0,25 / 0,125 / 0,0625 °C |
| Время преобразования (макс.) | 93,75 / 187,5 / 375 / 750 мс |
| Питание | 3,0–5,5 В локально или паразитно от линии данных |
| Потребление | до 1,5 мА при измерении; 0,75–1 мкА в покое |
| Идентификация | уникальный 64-битный ROM-код у каждого датчика |
| Пороги тревоги TH/TL | энергонезависимая EEPROM: 50 тыс. записей, хранение 10 лет |
| Корпуса | TO-92, SO-8, µSOP; водозащищённый зонд — чип в гильзе с кабелем |
Источник: datasheet Analog Devices / Maxim Integrated «DS18B20 — Programmable Resolution 1-Wire Digital Thermometer».
Подключение к Arduino
UNO или Nano, питание 5 В:
- VDD датчика → 5 V;
- GND → GND;
- DQ → любой цифровой пин, в примере D2;
- резистор 4,7 кОм между DQ и 5 V, физически рядом с датчиком.
Подключение к ESP32
Та же схема на 3,3 В: VDD → 3V3, GND → GND, DQ → GPIO4, подтяжка 4,7 кОм между DQ и 3V3. Порог логической единицы у DS18B20 — от 2,2 В, поэтому 3,3 В хватает без преобразователей уровней. Правило одно: подтяжка — к той же шине питания, от которой запитан датчик.
Код: чтение температуры
Нужны библиотеки OneWire и DallasTemperature (Paul Stoffregen). Скетч одинаков для UNO и ESP32 — меняется только номер пина.
#include <OneWire.h>
#include <DallasTemperature.h>
#define PIN_DQ 2 // у ESP32 поставьте 4 (GPIO4)
OneWire oneWire(PIN_DQ);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
sensors.begin(); // поиск датчиков на шине
sensors.setResolution(12); // 12 бит: шаг 0,0625 °C, до 750 мс
}
void loop() {
sensors.requestTemperatures(); // Convert T и ожидание
float t = sensors.getTempCByIndex(0); // первый найденный датчик
if (t == DEVICE_DISCONNECTED_C) {
Serial.println("Нет ответа: проверь подтяжку и пин");
} else {
Serial.println(t);
}
delay(1000);
}
getTempCByIndex(0) берёт первый попавшийся датчик, и порядок индексов после перезагрузки не гарантирован. Для двух датчиков хватит и индексов; для серьёзного проекта узнайте 64-битные адреса примером поиска устройств из поставки OneWire и обращайтесь через getTempCByAddress.
Частые ошибки
- Постоянно −127 °C. Это код «датчик отключён». Причины: забыли подтяжку 4,7 кОм, DQ воткнут не в тот пин, обрыв линии, перепутаны GND и VDD. Половина «мёртвых» DS18B20 лечится одним резистором.
- Читается ровно +85,00 °C. Это не комнатная температура: +85 °C — значение температурного регистра после подачи питания. Вылезает, когда чтение случилось раньше завершения преобразования или датчик сидит на паразитном питании без сильной подтяжки. Лечение: между командой измерения и чтением — не меньше 750 мс.
- Паразитное питание «почти работает». Слабая подтяжка просаживает линию под током преобразования, измерение срывается на ровном месте. Схема сильной подтяжки на транзисторе описана в паспорте, но проще подать питание третьим проводом.
- Несколько датчиков по индексам. Индекс — это порядок опроса шины, он может смениться после перезагрузки или замены одного датчика. Привязывайтесь к адресам ROM.
- Длинный кабель зонда. Уже с нескольких метров линия ловит наводки: подтяжку ставьте у самого датчика, при глюках снижайте её номинал (например, до 3,3 кОм), на десятках метров — витая пара «данные + земля».
- Куплен клон. Рынок полон копий DS18B20 с худшей, чем в паспорте, точностью и урезанным диапазоном. Если партия новых датчиков дружно врёт на градус-другой в одну сторону — это оно; спасают поверка по эталону и программная поправка.
Итог
DS18B20 — самый дешёвый способ получить честную цифровую температуру без калибровки, АЦП и таблиц: один пин, одна подтяжка, готовая библиотека. Для воды и улицы берите зонд в гильзе. Если сравниваете с другими «температурными» датчиками — у нас есть разбор DHT22 (AM2302) с его типовыми ошибками, а влажность и давление одним чипом добавляет BME280.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.