Датчик мне был нужен внутрь бойлера: вода под пятьдесят градусов, конденсат, пар — DHT22 в таких условиях сдался бы сразу, у него предел +80 °C и пластиковый корпус, который боится влаги. Термистор NTC я тоже отложил: делитель напряжения, расчёт по формуле Штайнхарта, калибровка — всё это мы проходили в уроке про NTC-термистор, и для двух точек на графике возня оправдана, но мне хотелось готовых цифр без формул. Выбор пал на герметичный DS18B20 на двухметровом шнуре — стальной зонд, цифровой выход, пара сотен рублей за готовое решение.
Я собрал схему за пять минут, залил скетч и открыл монитор порта. Там стояло −127.00 — в июле, в комнате, от датчика в баке с горячей водой. Полчаса я искал сгоревший сенсор, а потом вспомнил главную мелочь 1-Wire: без подтягивающего резистора 4,7 кОм между линией данных и питанием шина мертва. Один резистор — и вместо мистического минуса появились честные 51,3 градуса. В этом уроке подключим DS18B20 правильно, разберём тайминги протокола и научимся отличать температуру от кода ошибки.
1-Wire: одна линия данных и адрес внутри каждого датчика
Протокол 1-Wire устроен экономно до скупости: вся связь идёт по одному проводу данных, а питание и земля — обычные провода. Контроллер роняет линию в ноль, чтобы начать обмен, и каждый бит кодируется длительностью импульса — по духу это родственник DHT из урока про подключение DHT11, только тайминги строже и честнее задокументированы: бит занимает от 15 до 60 микросекунд, и библиотека отмеряет их без таймеров, чистым циклом. Линия данных в покое должна быть подтянута к питанию резистором 4,7 кОм — без него фронты размываются наводками и обмен рассыпается. Почему именно столько Ом и как читают номиналы, мы разбирали в уроке про подбор резисторов; на очень длинных линиях подтяжку иногда ужимают до 2,2 кОм, чтобы победить ёмкость кабеля.
Распиновка зависит от исполнения. Голый сенсор в корпусе TO-92, плоской стороной к себе, ножки слева направо: GND, DQ (данные), VDD. Герметичный зонд на шнуре раскрашен почти стандартно: красный — питание, чёрный или синий — земля, жёлтый (иногда белый или зелёный) — данные. Почти — потому что цвета у разных продавцов гуляют, и я два раза жалел, что не прозвонил мультиметром: второй провод зонда из кита оказался питанием, а не землёй.
Внутри каждого DS18B20 зашит заводской 64-битный адрес, и это ключ ко всей магии: на одной линии данных можно повесить десятки датчиков, и каждый узнает, что обращаются именно к нему. Для одиночного датчика библиотека упрощает жизнь командой Skip ROM — «откликайся, кто слушает». Как выловить и использовать адреса при нескольких датчиках — тема следующего урока про несколько DS18B20 на шине.
Кстати, «герметичный» на зонде — не маркетинговое слово. Внутри стальной гильзы чип залит компаундом, и воде до него не добраться: мой зонд четвёртый год живёт в баке. Слабое место другое — место заделки шнура в гильзу: его мочить не стоит, туда вода пробирается по капилляру и добирается до контактов за пару месяцев.
Диапазон, точность и цена в миллисекундах
Диапазон DS18B20 — от −55 до +125 °C: минус существует, в отличие от DHT11, и верх выше, чем у DHT22 с его +80. Точность ±0,5 °C держится в коридоре от −10 до +85 °C — за его границами дрейф растёт, поэтому обещать полградуса при −40 не стоит. Разрешение настраивается от 9 до 12 бит, и здесь начинается арифметика, которую полезно понимать: каждый лишний бит удваивает время конверсии. Датчик не отвечает мгновенно — он меряет, и чем мельче шаг, тем дольше молчит.
Практический вывод из таблицы ниже: для комнаты и бойлера двенадцать бит с шагом 0,0625 °C — красиво, но 750 миллисекунд ожидания на каждое измерение. Девять бит с шагом полградуса отвечают за 94 миллисекунды и закрывают девять задач из десяти. Я ставлю 10 бит по умолчанию: шаг 0,25 °C, ожидание около 190 мс, а десятые доли градуса в графике всё равно рисует шум в полградуса. Если сомневаетесь — начните с десяти бит и поднимите до двенадцати, когда увидите на графике ступеньки крупнее, чем хотелось бы.
Отдельная вилка — питание. Классика: три провода, VDD на 5 В. Существует и паразитное питание на два провода, когда датчик крадёт энергию с линии данных, — экономит провод, но во время конверсии датчику нужна еда именно с линии, и на длинных или нагруженных шинах это превращается в лотерею. Моё правило без исключений: три провода, если физически нет третьего; паразитное питание оставляю для коротких экспериментов.
Проверка на коленке, которую я делаю с каждым новым зондом: стакан с колотым льдом и водой — датчик обязан показать около нуля, у меня было +0,2 °C; и кипяток — около сотни, мой выдал 99,1 °C при давлении чуть ниже нормального. Если в нулевой точке датчик врёт на градус-другой, дальше в проект его можно не пускать — это брак. Сравнение с комнатным термометром работает хуже: он даёт одну примерно известную точку, а стакан — две точные.
| Разрешение | Шаг показаний | Время конверсии |
|---|---|---|
| 9 бит | 0,5 °C | ≈94 мс |
| 10 бит | 0,25 °C | ≈188 мс |
| 11 бит | 0,125 °C | ≈375 мс |
| 12 бит (по умолчанию) | 0,0625 °C | ≈750 мс |
Код: OneWire плюс DallasTemperature
Нужны две библиотеки из менеджера: OneWire и DallasTemperature — как ставить их через IDE, показано в уроке про библиотеки. Первая знает язык шины, вторая говорит на нём по-человечески: «измерь температуру», «сколько устройств», «дай градусы». Схема скетча одинаковая для голого сенсора и зонда — разница только в проводах:
Строка requestTemperatures() блокирует скетч на время конверсии — при 12 битах это 750 миллисекунд тишины в loop. Для метеостанции незаметно, а в цикле с сервой или кнопками уже тоскливо; выход — неблокирующий опрос через setWaitForConversion(false) и проверку isConversionComplete() по таймеру millis, это тот же приём, что и для прочих долгих дел. Счастливый случай с 1-Wire: при нескольких датчиках конверсия запускается всем сразу одной командой, так что 750 мс остаются 750 мс, а не превращаются в семь с половиной секунд, как иногда пугают на форумах.
Дробные доли градуса из 12 бит — вещь обманчивая: шаг 0,0625 не делает датчик точнее, он лишь мельче делит шкалу, а реальная погрешность остаётся ±0,5 °C в рабочем коридоре. Печатая t=, я обрезаю хвост до десятой: разница между 24,3750 и 24,3 ничего не решает, зато график в Serial Plotter перестаёт дёргаться на мнимых тысячных. Шум в две-три сотых градуса у этого сенсора — норма; им же удобно ловить дыхание на корпус: дунули — показания поползли вверх.
#include <OneWire.h>#include <DallasTemperature.h> OneWire oneWire(2); // линия DATA на пине 2DallasTemperature sensors(&oneWire); void setup() { Serial.begin(9600); sensors.begin();} void loop() { sensors.requestTemperatures(); // конверсия, ~750 мс при 12 битах float t = sensors.getTempCByIndex(0); Serial.print("t="); Serial.println(t); // -127.00 значит: шина не ответила delay(1000);}- 1. Монитор порта показывает −127.00 °C. Что проверить первым делом?
- 2. Нужен термометр в бойлер с водой до +95 °C. Что выбрать?
- 3. Почему после requestTemperatures() скетч замирает примерно на 750 мс?
- 4. Как получить более частые показания с DS18B20?
- 5. Сколько сигнальных линий у шины 1-Wire?
- 1-Wire — одна линия данных; подтяжка 4,7 кОм между DATA и 5 В обязательна, без неё шина молчит.
- Распиновка TO-92 плоской стороной: GND, DQ, VDD; цвета проводов зонда не стандарт — прозванивайте.
- Диапазон −55…+125 °C, ±0,5 °C в коридоре −10…+85 °C; разрешение 9–12 бит стоит временем: 94…750 мс.
- −127.00 — не температура, а молчание шины: подтяжка, провода, питание.
- Паразитное питание на два провода существует, но честные три провода надёжнее на любой линии длиннее макетки.
Частые вопросы по теме урока
- Монитор порта показывает −127.00 °C. Что проверить первым делом?
- −127 — код «шина не ответила». В девяти случаях из десяти это отсутствующая подтяжка или перепутанные провода зонда. Датчики DS18B20 умирают на порядок реже, чем разваливается их обвязка. Подтяжку 4,7 кОм между DATA и 5 В и целостность линии данных
- Нужен термометр в бойлер с водой до +95 °C. Что выбрать?
- У DHT22 официальный предел +80 °C и он боится конденсата, DHT11 начинает с нуля и кончает на пятидесяти. DS18B20 держит до +125 °C и выпускается в герметичных зондах. Герметичный DS18B20 на шнуре
- Почему после requestTemperatures() скетч замирает примерно на 750 мс?
- Каждый бит разрешения удваивает время измерения: 9 бит — около 94 мс, 12 бит — около 750 мс. По умолчанию стоит 12 бит, отсюда и пауза. Столько длится конверсия при разрешении 12 бит
- Как получить более частые показания с DS18B20?
- Частота опроса не ускоряет измерение — датчик отвечает только после конверсии. Снизив разрешение с 12 до 9 бит, ужимаете паузу с 750 мс до 94 мс ценой шага 0,5 °C. Снизить разрешение до 9–10 бит
- Сколько сигнальных линий у шины 1-Wire?
- Весь обмен идёт по одному проводу данных. Питание и земля — провода энергии, к протоколу отношения не имеют. Этим 1-Wire и отличается от двухпроводного I2C. Одна — только данные, питание и земля не считаются