Термошкаф для расстойки теста был моим первым проектом, где градус решал всё: при 24 тест подходит три часа, при 32 дрожжи уходят вразнос, и уксусный запах не заставляет себя ждать. Я поставил NTC-термистор за сорок рублей, собрал делитель на макетке, вывел сырые значения в монитор — и два вечера превращал счёты АЦП в градусы, которым можно верить. Формулы нашлись, коэффициенты подогнались, осадок остался: на соседней полке лежал DHT22, который отдаёт готовые градусы одной строкой кода, а я честно пересчитывал логарифмы.
С тех пор я собрал на этих трёх кандидатах с десяток устройств и вывел рабочее правило: термометр выбирают под задачу, а не по цене и не по красивому даташиту. Каждому кандидату я дам по одной странице паспорта и по одной истории с граблями: у термистора это калибровка, у DHT — интервал, у DS18B20 — шина. В этом уроке сравним NTC, DHT11/DHT22 и DS18B20 по четырём практическим осям — точность, скорость опроса, обвязка и стоимость часа возни — а в конце отдам своё распределение задач по датчикам с границами, где оно ломается.
Три кандидата: паспортные данные
NTC-термистор — это резистор, сопротивление которого падает с ростом температуры. У популярного десятикилометрового NTC при 25 °C сопротивление равно десяти килоомам, при нуле — около 33 кОм, при 50 °C — около 3,6 кОм. Чтобы превратить это в число для скетча, термистор ставят одним плечом делителя напряжения, вторым — резистор 10 кОм, а среднюю точку читают на аналоговом входе; формулу делителя мы уже считали в уроке про расчёт делителя напряжения. Дальше работает бета-формула или уравнение Штейнхарта–Харта — обе с готовым кодом разобраны в уроке про NTC и Штейнхарта, повторять их здесь не буду.
DS18B20 — цифровой термометр на шине OneWire: питание, земля и один провод данных с подтяжкой 4,7 кОм. Заводская калибровка даёт ±0,5 °C в диапазоне от −10 до +85 °C, разрешение программируется от 9 до 12 бит, конверсия занимает от 94 до 750 миллисекунд. Главные козыри — водонепроницаемые зонды на кабеле любой разумной длины и адресация: по 64-битному серийному номеру на одном пине живут десятки датчиков. Плата за удобства тоже есть: две библиотеки вместо одной, а ещё стоит проверить вывод платы на 3,3 В, если берёте модуль без стабилизатора — часть клонов капризничает на пяти вольтах.
DHT22 мы знаем по всему разделу: готовые градусы и влажность за один опрос, но не чаще раза в две секунды — требование интервала опроса не отменить, сколько бы кода вы ни написали. Здесь важно одно: это единственный из трёх, кто меряет влажность без дополнительных деталей. Выбор между DHT11 и DHT22 мы проговаривали в сравнении двух сенсоров, а теперь добавим в компанию аналогового и OneWire-соперников.
| Параметр | NTC 10 кОм | DHT22 | DS18B20 |
|---|---|---|---|
| Цена за штуку | ≈40–60 ₽ | ≈350 ₽ | ≈150 ₽, зонд ≈350 ₽ |
| Диапазон | −50…+150 °C (реально — сколько откалибруете) | −40…+80 °C | −55…+125 °C |
| Точность | ±2 °C без калибровки, ±0,5 после | ±0,5 °C | ±0,5 °C в −10…+85 |
| Скорость опроса | 100–200 раз в секунду | раз в 2 секунды | конверсия 750 мс (12 бит) |
| Обвязка | резистор делителя + аналоговый вход | подтяжка 10 кОм | резистор 4,7 кОм |
| Где я его беру | быстрые процессы, бюджет | комнаты и влажность | вода, трубы, шина датчиков |
Скорость опроса: где NTC рвёт конкурентов
Скорость — единственная ось, где термистор уходит с отрывом. analogRead занимает около 0,1 миллисекунды, поэтому NTC спокойно читается сто-двести раз в секунду — потолок тут не в датчике, а в вашем желании усреднять. DHT22 ограничен жёстко: обмен по линии данных занимает 4–5 миллисекунд, но внутренние значения обновляются раз в две секунды, и спрашивать чаще бессмысленно. DS18B20 при 12 битах думает над каждой конверсией 750 миллисекунд; скетч при этом не блокируется, если не ждать, но свежее значение появляется именно с этим шагом, а при 9 битах — уже через 94 миллисекунды ценой точности.
Из этих чисел задачи раскладываются сами. ПИД-регулятору фена или паяльной станции нужен быстрый ряд — NTC. Комнатному климату две секунды хватает с запасом: воздух меняется на градус за час, а не за секунду. Бойлеру и аквариуму даже 750 миллисекунд ни к чему, зато зонд DS18B20 годами живёт в воде и на трубе. Между полосами скорости выбор и решается: у DHT22 полоса узкая, но внутри неё — влажность.
#include "OneWire.h"#include "DallasTemperature.h" OneWire oneWire(10); // шина OneWire на D10DallasTemperature 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); delay(2000);}Разберём скетч. requestTemperatures() отправляет всем датчикам на шине команду конверсии и через 750 миллисекунд при 12 битах результат готов; getTempCByIndex(0) читает первого на шине. Если вернулось −127 — датчик не ответил: ищите обрыв, перепутанные провода или слабую подтяжку 4,7 кОм. От индексов уходят к адресам: getTempCByAddress держит конкретный датчик по серийному номеру, и на одном пине D10 спокойно живут датчик улицы, обратки и бойлера — по опросу в цикле каждый со своим именем.
Второй аргумент в пользу цифры — кабели. Аналоговый NTC на трёх метрах тонкой верёвки ловит всё: наводки от блока питания, просадки, щелчки реле — как наводки врут датчикам, мы разбирали в уроке про наводки и шум, и термистор там главная жертва. DS18B20 передаёт цифру, которую принимающая сторона либо приняла, либо нет: третьего не дано. Мой зонд в бочке для полива висит на пятиметровом кабеле третий год и не сполз ни на десятую градуса.
Сырые счёты из монитора — это ещё не конец пути, и к ним нужен свой ритуал. NTC я читаю пачкой из десяти значений с интервалом в две миллисекунды и беру среднее: шум делителя в одиночном отсчёте скачет на единицу-две, а в среднем по десяти сидит уже почти неподвижно, и вот этот средний отсчёт идёт в формулу. Для DHT22 усреднение не нужно — библиотека сама отдаёт готовое значение, и усреднять два с половиной показания в секунду незачем. Зато у цифровых есть свой ритуал: проверка на −127 и nan перед тем, как число поедет в логику или на экран.
Заметьте, как изменился бы график, если бы мы поменяли местами ритмы: термистор раз в две секунды был бы бесполезен для быстрой петли, а DHT22 сто раз в секунду собирал бы nan пачками. Ритм опроса — не параметр стиля, а часть паспорта датчика, такая же важная, как точность. Когда в следующий раз будете выбирать термометр, спросите сперва: сколько показаний в секунду мне нужно на самом деле? Чаще всего честный ответ — одно, максимум два.
Что ставлю я — и где границы этого выбора
Распределение у меня рабочее, не теоретическое. Комната, шкаф, теплица, инкубатор — DHT22: влажность нужна чаще, чем десятые доли градуса, а раз в две секунды воздух обновлять бессмысленно. Вода, котлы, трубы и любые точки дальше метра от платы — DS18B20 в зонде: цифра не боится длины. Быстрая петля регулировки или партия на сорок штук — NTC: сто показаний в секунду за копейки не даст никто, но с ним к быстрому датчику применяется и быстрый термостат с гистерезисом, иначе реле нащёлкает себе смерть на десятых долях.
Где правило ломается. Проект одноразовый, время дороже деталей — берите DS18B20 даже для комнаты: доплата в полторы сотни против вечера с бета-формулой. Нужно сто точек в теплице по одному проводу — снова DS18B20, DHT там невозможен физически. А если влажность не нужна и скорость не важна, я всё равно ставлю DHT11 за сотню: его двухградусной погрешности достаточно, чтобы понять, холодно ли в погребе.
- 1. Какой датчик живёт на шине OneWire с подтяжкой 4,7 кОм?
- 2. С каким минимальным интервалом имеет смысл опрашивать DHT22?
- 3. Сколько длится конверсия DS18B20 при разрешении 12 бит?
- 4. Почему NTC на длинном кабеле начинает врать?
- 5. Сколько DS18B20 можно повесить на один пин?
- NTC — самый дешёвый и самый быстрый, но платите делителем, шумом и калибровкой; резистор плеча меряйте мультиметром, а не верьте маркировке.
- DHT22 отдаёт готовые градусы и влажность, но внутренние данные обновляются раз в две секунды — интервал не обогнать.
- DS18B20 — цифра ±0,5 °C, конверсия 750 мс при 12 битах, зонды в воде и шина из десятков датчиков на одном пине.
- Вода, котлы и кабели длиннее метра — царство DS18B20; быстрые петли регулировки — NTC; комнатный климат — DHT22.
- Половина «погрешностей» датчиков живёт не в сенсорах, а в схеме: питание, провода и допуски резисторов врут раньше любого чипа.
Частые вопросы по теме урока
- Какой датчик живёт на шине OneWire с подтяжкой 4,7 кОм?
- OneWire и подтяжка 4,7 кОм — визитная карточка DS18B20. NTC аналоговый и живёт в делителе, у DHT22 свой однопроводной протокол с подтяжкой 10 кОм на линии данных. DS18B20
- С каким минимальным интервалом имеет смысл опрашивать DHT22?
- DHT22 обновляет внутренние значения раз в две секунды, DHT11 — раз в секунду. Чаще — это nan или кэш, свежих данных не будет. 2 секунды
- Сколько длится конверсия DS18B20 при разрешении 12 бит?
- 12 бит — 750 мс, 9 бит — 94 мс ценой точности 0,5 °C. Скетч может не ждать конверсию, но свежее значение появляется только с этим шагом. 750 мс
- Почему NTC на длинном кабеле начинает врать?
- Аналоговый сигнал — маленькие напряжения, которые провода и помехи портят по дороге. Цифровой DS18B20 по тому же кабелю передаёт значения без потерь. Наводки и сопротивление проводов искажают аналоговый сигнал
- Сколько DS18B20 можно повесить на один пин?
- Шина OneWire адресует каждый датчик серийным номером, поэтому на одном пине живут десятки термометров — вопрос мощности подтяжки и длины линий. Десятки — по 64-битным адресам