Подключение датчиков температуры и влажности (1-Wire)
Введение в протокол 1-Wire
Протокол 1-Wire — это последовательная шина данных, разработанная компанией Dallas Semiconductor, которая позволяет осуществлять связь между одним ведущим устройством (master) и одним или несколькими ведомыми устройствами (slave) по единственному проводу (плюс общий провод/земля). Это делает его чрезвычайно популярным в системах автоматизации для задач, не требующих высокой скорости передачи данных, но где важны простота монтажа и низкая стоимость.> 💡 Подсказка: Максимальная длина шины 1-Wire сильно зависит от топологии, качества кабеля и количества устройств. На практике, при использовании кабеля типа "витая пара" (например, UTP/FTP Cat.5e) и соблюдении правил монтажа, можно добиться стабильной работы на длинах до 50-70 метров. Для более длинных линий может потребоваться использование специальных усилителей шины или переход на более помехозащищенные интерфейсы, такие как RS-485.
Принцип работы и ключевые особенности
Протокол работает по принципу master-slave. Контроллер (master-устройство) инициирует все коммуникации на шине, отправляя команды и запросы данных. Ведомые устройства (slave), такие как датчики, отвечают только тогда, когда к ним обращается master.
📋 Ключевые понятия:
- Уникальный 64-битный адрес (ROM ID): Каждое устройство 1-Wire имеет уникальный, прошитый на заводе 64-битный идентификатор. Этот адрес позволяет мастеру однозначно обращаться к любому из десятков датчиков, подключенных к одной и той же двухпроводной линии. Первые 8 бит адреса определяют тип (семейство) устройства. Например, для популярных датчиков температуры DS18B20 код семейства — `0x28`.
- Архитектура шины: Все устройства подключаются параллельно к одной линии данных (DQ) и общему проводу (GND). Master-устройство "подтягивает" линию данных к высокому уровню напряжения (обычно +3.3V или +5V) через резистор. Для передачи данных устройства "притягивают" линию к земле, формируя логические нули и единицы.
- Паразитное питание (Parasitic Power): Одной из уникальных особенностей протокола является возможность работы устройств без отдельного провода питания. В этом режиме ведомое устройство получает энергию для работы, заряжая внутренний конденсатор от линии данных, когда та находится в высоком (свободном) состоянии. Это упрощает монтаж до всего двух проводов (Data и GND). Однако этот режим более чувствителен к длине линии и количеству устройств.
Преимущества и области применения
Простота и низкая стоимость сделали 1-Wire стандартом де-факто для ряда задач в системах "умный дом" и автоматизации зданий.
Преимущества:- Простота монтажа: Требуется всего два или три провода.
- Низкая стоимость: Датчики (особенно DS18B20) очень доступны.
- Гибкая топология: Позволяет подключать множество устройств на одну шину.
- Уникальная идентификация: Нет необходимости в ручной настройке адресов, как в Modbus.
- Измерение температуры: Наиболее частое применение. Датчики DS18B20 используются для мониторинга температуры в помещениях, температуры теплоносителя в системах отопления, полов с подогревом.
- Измерение влажности: Комбинированные датчики, такие как DHT22 (в специальной обвязке для 1-Wire), позволяют измерять и температуру, и влажность.
- Идентификация: Использование ключей iButton (Touch Memory) в системах контроля доступа.
- Подсчет импульсов: Специализированные счетчики с выходом 1-Wire.
Для контроллеров нашей платформы, поддержка 1-Wire является встроенной функцией, позволяющей напрямую подключать и опрашивать десятки датчиков без дополнительного оборудования.
---
Физическое подключение датчиков к контроллеру
Правильное физическое подключение — залог стабильной работы шины данных. Ошибки на этом этапе являются самой частой причиной неисправностей.
> ⚠️ Внимание: Неправильное подключение (переполюсовка питания и данных) может привести к необратимому выходу из строя как самих датчиков, так и порта контроллера. Всегда выполняйте монтажные работы при полностью обесточенном оборудовании. Перед подачей питания еще раз сверьтесь со схемой.
Идентификация клемм на контроллере
На корпусе контроллера клеммы, предназначенные для работы с шиной 1-Wire, четко промаркированы. Как мы рассматривали в уроке [COURSE-01-M03-L01], универсальные входы (UI) могут быть настроены на разные режимы. Для 1-Wire используются специализированные или назначаемые порты.
- D (Data): Линия данных. К этой клемме подключаются выводы DQ всех датчиков на шине.
- GND (Ground): Общий провод, "земля".
- 5V (Power): Выход питания +5В для датчиков. Используется при подключении по трехпроводной схеме.
Схемы подключения датчика DS18B20
Датчик температуры DS18B20 является самым распространенным устройством 1-Wire. Рассмотрим два варианта его подключения.
1. Стандартная (3-проводная) схема — РекомендуетсяЭтот метод наиболее надежен, особенно для длинных линий и большого количества датчиков.
| Клемма контроллера | Провод (Цвет по стандарту) | Вывод датчика DS18B20 | Назначение |
|--------------------|----------------------------|------------------------|-----------------|
| `5V` | Красный | `VDD` | Питание |
| `D` | Желтый | `DQ` | Линия данных |
| `GND` | Черный | `GND` | Общий провод |
2. Схема с паразитным питанием (2-проводная)Упрощает монтаж, но менее надежна. Используется, когда прокладка третьего провода невозможна или нецелесообразна.
| Клемма контроллера | Провод (Цвет по стандарту) | Вывод датчика DS18B20 | Назначение |
|--------------------|----------------------------|------------------------|-----------------|
| `D` | Желтый | `DQ` | Линия данных |
| `GND` | Черный | `GND` и `VDD` (соединены вместе) | Общий провод |
Топологии шины: "Линия" и "Звезда"
- "Линия" (Daisy-chain): Это предпочтительная топология. Кабель идет последовательно от контроллера к первому датчику, от него ко второму и так далее. Такой монтаж минимизирует длину "отводов" и снижает отражение сигнала, повышая стабильность шины.
[Контроллер] --<кабель>-- (Датчик 1) --<кабель>-- (Датчик 2) --<...>-- (Датчик N)
- "Звезда" (Star): В этой топологии все кабели от датчиков сходятся в одной точке (например, в клеммной коробке или прямо на клеммах контроллера). Такая схема допустима, но крайне не рекомендуется для линий с общей длиной "лучей" более 20-30 метров. Длинные "лучи" звезды действуют как антенны, что приводит к искажению сигнала и сбоям в работе шины.
Если без топологии "звезда" не обойтись, старайтесь делать "лучи" как можно короче.
🔗 Связанный материал: Принципы выбора кабеля и базовые правила монтажа были рассмотрены в документе Стандарты схем подключения. Для шины 1-Wire рекомендуется использовать кабель "витая пара" UTP/FTP, используя одну пару для данных и земли.
---
Конфигурация шины в веб-интерфейсе
После физического подключения датчиков необходимо настроить программную часть контроллера, чтобы он начал их опрашивать. Все действия производятся через веб-интерфейс контроллера.
1. Активация поддержки 1-Wire
Сначала нужно убедиться, что соответствующий системный драйвер активирован.
2. Проверка обнаружения датчиков в системе
После перезагрузки контроллер автоматически просканирует шину 1-Wire и обнаружит все подключенные устройства. Убедиться в этом можно через консоль, подключившись к контроллеру по SSH.
Выполните команду для просмотра списка обнаруженных устройств:
ls /sys/bus/w1/devices/
Вывод команды должен содержать список каталогов. Среди них будут каталоги, имена которых начинаются с `28-`. Это и есть ваши датчики DS18B20, идентифицированные по их уникальным 64-битным адресам.
Пример вывода:
28-00000a1b2c3d 28-00000a4e5f6g w1_bus_master1
Здесь система обнаружила два датчика.
3. Сопоставление устройств в веб-интерфейсе
Теперь, когда система "увидела" датчики на низком уровне, необходимо, чтобы их распознала служба, отвечающая за публикацию данных в MQTT.
На этом этапе вы можете задать для каждого датчика более понятное имя (description), например, "Температура в гостиной" или "Температура обратки котла". Это поможет в дальнейшем не запутаться при настройке логики.
---
Получение данных через MQTT
Красота платформы в том, что после описанной выше настройки, контроллер начинает автоматически опрашивать датчики и публиковать их показания в локальный MQTT-брокер. Вам не нужно писать код для опроса шины 1-Wire.
Структура MQTT-топиков
Служба `wb-mqtt-serial` (или ее аналоги) формирует MQTT-топики по стандартному шаблону. Для устройств на шине 1-Wire он выглядит следующим образом:
`/devices/{имя_устройства}/controls/{имя_контрола}`
- {имя_устройства}: По умолчанию `wb-w1`.
- {имя_контрола}: Уникальный 64-битный адрес датчика, например `28-00000a1b2c3d`.
Таким образом, полный топик для получения значения с датчика температуры будет выглядеть так:
`/devices/wb-w1/controls/28-00000a1b2c3d`
ℹ️ Информация: Если вы подключите датчик, то обнаружите, что к его адресу добавляется `/on`. Например: `/devices/wb-w1/controls/28-00000a1b2c3d/on`. Это является особенностью реализации и не несет смысловой нагрузки. Для чтения данных подписываться нужно на топик без `/on`. А значение публикуется именно в этот субтопик. Поэтому для подписки в Node-RED удобнее использовать wildcard: `/devices/wb-w1/controls/28-00000a1b2c3d/#`.
Формат данных (Payload)
Сообщение (payload), публикуемое в данный топик, представляет собой строку с числовым значением температуры в градусах Цельсия.
Пример сообщения в топике `/devices/wb-w1/controls/28-00000a1b2c3d/on`:
23.5
Для чтения этих данных в любой системе (например, в Node-RED) достаточно подписаться на соответствующий MQTT-топик.
{
"topic": "/devices/wb-w1/controls/28-00000a1b2c3d/on",
"qos": 0,
"retain": true,
"payload": "23.5"
}
Обратите внимание на флаг `retain: true`. Это означает, что MQTT-брокер хранит последнее полученное значение. Даже если вы подпишетесь на топик позже, вы немедленно получите актуальные данные, не дожидаясь следующего опроса датчика. Это ключевой аспект для построения логики с состоянием, как мы обсуждали ранее.
---
Пример: Визуализация температуры в Node-RED
Давайте создадим простой поток, который будет считывать температуру с нашего датчика и отображать ее на панели управления (Dashboard).
> 🔗 Связанный материал: Более сложные сценарии, включая усреднение показаний, создание уведомлений при выходе температуры за заданные пределы, запись истории в базу данных и управление отоплением, рассматриваются в курсе COURSE-03: Углубленное программирование в Node-RED.
Пошаговое создание потока
Предполагается, что у вас установлен пакет `node-red-dashboard`.
* Перетащите узел `mqtt in` из палитры на рабочее поле.
* Дважды кликните на него для настройки.
* В поле `Server` выберите локальный брокер (обычно `localhost:1883`).
* В поле `Topic` укажите топик вашего датчика, используя wildcard для удобства: `/devices/wb-w1/controls/28-00000a1b2c3d/#`.
* В поле `Output` выберите `a parsed JSON object`, если хотите получать всю структуру сообщения, или `a string`, если вас интересует только `payload`. Для простоты выберем `a string`.
* `QoS`: `0`.
* Этот узел будет преобразовывать строковое значение в числовое, что является хорошей практикой.
* Соедините выход узла `mqtt in` со входом узла `function`.
* В коде узла напишите:
// Преобразуем входящую строку в число с плавающей точкой
msg.payload = parseFloat(msg.payload);
// Устанавливаем статус узла для быстрой диагностики
node.status({fill:"green", shape:"dot", text:"T: " + msg.payload + " °C"});
return msg;
Это действие является элементом паттерна "Визуальный статус" и помогает мгновенно видеть в редакторе последнее полученное значение.
* Перетащите узел `ui_gauge` из палитры (секция `dashboard`).
* Соедините выход узла `function` с его входом.
* Настройте узел:
* `Group`: Выберите или создайте группу на вкладке дашборда.
* `Label`: "Температура в гостиной".
* `Value format`: `{{value | number:1}} °C` (это отформатирует число, оставив один знак после запятой).
* `Range`: Установите реалистичный диапазон, например, от 0 до 40.
* Нажмите красную кнопку Deploy.
* Перейдите на вкладку дашборда (обычно по адресу `http://
Вы увидите графический индикатор (gauge), показывающий текущую температуру с вашего датчика. Он будет обновляться автоматически при поступлении новых данных по MQTT.
---
Итоги и лучшие практики
В этом уроке мы прошли полный цикл работы с датчиками по шине 1-Wire: от физического подключения проводов до создания простого виджета для визуализации данных.
Краткий обзор процесса:Рекомендации и лучшие практики
- Документируйте адреса: При монтаже на объекте с большим количеством датчиков обязательно создайте таблицу, в которой будет сопоставлен уникальный 64-битный адрес каждого датчика с его физическим расположением (например, `28-00000a1b2c3d` — "Гостиная, у окна"). Это сэкономит вам часы времени при дальнейшей настройке и диагностике.
- Проверяйте контакты: Большинство проблем с "отваливающимися" датчиками связано с плохим контактом в клеммниках.
Базовая диагностика
Если датчик не появляется в системе или данные не обновляются:
🔗 Связанный материал: Напоминаем о необходимости сверяться с документацией предыдущих уроков (COURSE-01-M03-L01 и COURSE-01-M03-L02) при работе с клеммными колодками контроллера и подключении устройств типа "сухой контакт" на соседние универсальные входы.
Что дальше
В следующем уроке мы рассмотрим подключение исполнительных устройств — реле, и научимся управлять нагрузками, такими как освещение и розетки, на основе данных, полученных от датчиков.