Редкаясамоделка на тему «умного дома» обходится без термометров. В интернете есть масса инструкций по подключению, но при этом обычно ограничиваются «классическим», учебно‑демонстрационным вариантом, наверняка его все видели:
Берется какая‑нибудь ардуиноподобная плата, или что‑то из серии ESP, один из выводов GPIO настраивается в прошивке как линия 1-wire, а микросхема DS1820 подключается примерно так:

И в общем всё работает. Но есть нюанс: вообще говоря, по стандарту, обычного напряжения питания для микропроцессоров 3.3в, для 1-wire мало. Работать оно будет, но это учебный пример, когда всё собирается на макетной плате, вот прямо тут рядом: прочитали данные, порадовались и хватит.
Но ведь на одну линию 1-wire можно посадить до 128 разных устройств, причем не только термометры, а саму линию растянуть на сотню метров — например, чтобы собирать данные о температуре отовсюду, от подвала до чердака. Да, для этого хватит всего одной ножки GPIO микроконтроллера.
Однако если вы попробуете сделать это по той схеме — скорее всего ничего не получится. Чтобы понять почему — немного теории, на пальцах:
Все данные передаются по линии 1-wire буквально по одному проводу (относительно земляного, т. е. по 1 паре). И питание датчиков — тоже по ней.
Для этого «в покое» на линии должно поддерживаться рабочее напряжение, порядка 5–6в. Оно поступает в датчики, заряжая их внутренние конденсаторы.
Микроконтроллер запрашивает данные, «прижимая» линию до 0: в зависимости от длительности «прижатий» и «отпусканий» датчики расценивают это как разные команды, например те же термометры могут переходить в режим измерения температуры, после чего начинают сами точно так же «прижимать» линию к 0, передавая побитно свой уникальный адрес и биты данных.
Всё это время каждый датчик питается от своего внутреннего конденсатора, который при этом, внезапно, постепенно разряжается. Если датчик один — он быстро передает свои данные и всё, а если их несколько — они начинают друг другу мешать, их внутренняя логика заставляет делать рандомные паузы, перепосылать биты, считать контрольные суммы, и всё это намного дольше чем ответ одного датчика.
А конденсатор разряжается в ноль раньше чем всё передано.
Конечно, можно запитать датчики отдельным проводом — но это уже не 1 пара, а трехпроводка, причем питать желательно штатными 5 вольтами, но тогда возникает опасность попадания 5 вольт на GPIO микроконтроллера. Если бы GPIO работал только на вход — можно было бы просто поставить делитель на двух резисторах, но он ведь и на выход должен работать, «прижимая» 5в к 0, а подавать на него эти 5в нельзя. Особенно для ESP, не любят они этого.
Поэтому умные люди придумали вот такую конструкцию подключения линии:

Транзистор включен так, что не позволит напряжению на ножке GPIO подняться выше напряжения питания, но при этом не помешает «прижать» линию к 0, если микроконтроллер попробует это сделать.
Резисторах R1 и стабилитрон D1 снизят относительно высокое напряжение до «комфортных» 1-wire 5v, С1 защитит от помех, а R2 позволит датчикам и микроконтроллеру «прижимать» 5в к 0.
Сложность тут в том, что R2 должен иметь достаточно большое сопротивление, чтобы можно было легко «зажать» линию, но достаточно небольшое чтобы быстро восстановить заряды датчиков.
При этом на самих 1-wire устройствах вывод питания вообще не нужен, и для снижения помех лучше замкнуть его на «землю». Питание будет идти по линии данных.
Но иногда, на длинных линиях, этого недостаточно — тогда можно применить вот такую схему:

Питание с линии данных через диод заряжает конденсатор, а конденсатор питает датчик.
Примерно так же оно и устроено внутри, только теперь мы «увеличили» емкость конденсатора, и нам по‑прежнему достаточно 1 пары проводов.
И это всё действительно работает. Можно завести в систему Умного дома всего одно устройство для считывания шины, а саму шину развести, ну например, коаксиалом, телефонным шнуром или той же витой парой, и собирать данные из разных мест.
Правда, тут можно наткнуться на особенности работы штатной ардуиновской библиотеки — она плохо подходит для опроса большого числа датчиков, но это уже другая тема, чисто программная.
Комментарии (42)
sergyk2
18.01.2025 03:46подключение датчиков к мк было удобнее организовать звездой. но когда линии разной длинны, отражения искажали сигнал. пришлось добавить в программу проверку и повторное чтение.
randomsimplenumber
18.01.2025 03:46Как раз датчики температуры лучше беспроводные. Угадать, где его лучше разместить - сложно, перенести - ещё сложнее. Измерять температуру можно и не каждую секунду,
JBFW Автор
18.01.2025 03:46У беспроводных проблемы с батарейкой, она заканчивается. И надо пойти ее поменять.
Если речь о температуре в комнате для посмотреть - это не страшно, ну не показывает сейчас, покажет потом. Для автоматики, типа температуры подачи котла, температуры воды в трубе и прочего такого же - удобнее проводные оказались.
Kirillko312
18.01.2025 03:46Можно запитать его где-то рядом с местом измерения, а данные отдавать по вайфаю
JBFW Автор
18.01.2025 03:46Тогда он уже не беспроводной, а еще один с проводами )
Ну я так и делаю, водоснабжение - одна ветка, котельная - другая.
Потому что водогрейный кабель должен включаться по температуре, а не когда там управляющий управлятор решит сообщение принять, и с котлом так же...
По той же причине теплые полы от комнатной ветки отключил, и перенес в контроллеры.
slog2
18.01.2025 03:46А не лучше ли выкинуть R1 D1 C1 и запитать схему от 5в ? Никакой необходимости в 12в не видно. А защиты проца от длинной линии очень не хватает.
JBFW Автор
18.01.2025 03:46Скажем так, особенность конструкции в целом.
Нужно бесперебойное питание всякой прочей аппаратуры в доме, роутеров-камер и прочего, что также требует аккумуляторов, в итоге вышло что есть Большой Аккумулятор на 12в (а мог бы быть и на 24), и вот эти 12 вольт идут как стандартное питание, оно уже есть по умолчанию.
Для питания всяких ESP оно понижается до 3.3, но тут нужно больше, поэтому просто беру 12.
Jury_78
18.01.2025 03:46тогда можно применить вот такую схему
Напряжение на конденсаторе будет еще меньше 3,3В.
JBFW Автор
18.01.2025 03:46Нет, 5 - 0.6(0.1) = 4 с чем-нибудь.
Там оно как: сам процесс измерения - 200-300 мс, потом передача, и всё это время датчик работает на внутреннем конденсаторе, у которого небольшая ёмкость. Когда питание было всего 3.3 - оно тоже работает, но очень быстро напряжение падает. Внешний конденсатор даст достаточно времени, работа стабильнее, и 4 вольт хватит
HardWrMan
18.01.2025 03:46Я бы не назвал данный каскад усилителя с общим затвором "умным" решением. Простым - да, умным - нет.
Если GPIO работает в режиме OD тогда при лог.1 каскад должен быть в режиме истокового повторителя и ограничить напряжение на истоке до напряжения на затворе. Только это гаоантированно работает лишь с полевыми транзисторами с неизолированным затвором. Как оно будет на полевом транзисторе с изолированным затвором - мало кто знает. Эти транзисторы больше для ключевых (дискретных) режимов а не линейных.
Когда GPIO будет давить исток к земле, то весь ток с шины пойдёт в ногу GPIO. А в статье про доинную шину. Длинная шина это и индуктивность и, самое главное, ёмкость. А ещё датчик может закоротить на Vcc. И привет ноге.
Правильная схема будет что-то типа управляемого генератора тока. Я такие собирал для K-Line, можно даже оптическую развязку сделать.
JBFW Автор
18.01.2025 03:46Вы усложняете.
Датчик не может закоротить на Vcc, потому что у него нет ничего кроме шины данных и земли, некуда коротить, разве что на землю. Это не страшно, просто работать ничего не будет.
Режим работы тут как раз дискретный, и работает оно вполне понятно как.Вот то, что емкость линии может влиять на возможность "прижатия" - это да.
Но тут ведь какое дело - если емкость линиии настолько велика, что МК не может ее "прижать", или у него отгорает ножка - то как ее сможет прижать микросхема датчика?
Тогда и она не сможет, а значит, смысла во всей этой линии просто нет, такая линия будет просто неработоспособна.Это вообще не "Универсальное решение на все случаи жизни!" - я просто привел пример как оно сделано и работает. Возможно, у кого-то оно так работать не будет.
HardWrMan
18.01.2025 03:46Датчик не может закоротить на Vcc, потому что у него нет ничего кроме шины данных и земли, некуда коротить, разве что на землю.
Ну, видимо, вы ещё не встречали датчики, побитые статикой.
JBFW Автор
18.01.2025 03:46Так статикой, или на Vcc? )
Там всего 2 линии, Vcc среди них нет - как датчик закоротит одну из линий на Vcc, если Vcc нет?
Это 1-wire, это не линия связи между разными устройствами со своим питанием, типа K-line.HardWrMan
18.01.2025 03:46Статика (в том числе и наведённая на линию) выбивала кристалл так, что он коротил ноги. Бывало что к VCC, бывало что к GND. А бывало что и туда и туда, защита выбивала питание.
JBFW Автор
18.01.2025 03:46Это понятно. Статикой можно выбить что угодно.
Речь о том что там НЕТ Vcc. Вообще нет.Есть 2 провода и 3-хногая микросхема, которая к ним подключена. К ней больше ничего не подключено внешнего, как ее ни выбивай и не закорачивай она эти два провода может только замкнуть между собой.
Это 1-wire.HardWrMan
18.01.2025 03:46Вы про фантомное питание? Последняя картинка в статье. Там да, проблемы этой не будет. А вот при подключении по первой картинке - будет. Разница лишь в длине линии: при её длине выше определённого предела фантомное питание не обеспечит работоспособность датчика(-ов).
JBFW Автор
18.01.2025 03:46О том и речь, что по 1 картинке - это пример из инструкций по подключению ds1820 к Arduino, и он хорошо работает при компактных размерах, "на столе".
А вот другие варианты - другое дело. И питание там не фантомное, самое обычное, просто надо понимать как оно там работает и как это можно увеличивать.
Так-то при достаточно длинной линии вообще ничего работать не будет, из-за сглаживания фронтов импульсов (лишь один человек сказал) и большого роста количества ошибок.
HardWrMan
18.01.2025 03:46А вот другие варианты - другое дело. И питание там не фантомное, самое обычное, просто надо понимать как оно там работает и как это можно увеличивать.
Когда питание подаётся вместе с сигналом оно называется фантомным. Что для микрофонов что для 1wire. Заметьте, что в случае 1wire это питание закорачивается на массу, поэтому требует развязки и буферного элемента (в вашем случае диод и конденсатор).
romanetz_omsk
18.01.2025 03:46У MAX/Dallas была аппнота по этой теме. 47 нанофарад ёмкости линии выдерживает 1-wire мастер, по их рекомендациям реализованный. Полкилометра витухи (91 пф/м)
rexen
18.01.2025 03:46Таки в статье не хватает фоток реализованного. Автор теории накидал, а вот сколько метров у него линия в реальности, например?
JBFW Автор
18.01.2025 03:46Как вы себе представляете "фотки" кабеля, лежащего в гипсокартонных коробах и закладных трубах? )
Обычная витая пара, соединения на скрутках, с ответвлениями. Проложена где просто в коробе, где через гофру или ПНД - вот например к колодцу ПНД закопана, чтобы не раздавило, а в стене удобнее гофру прокладывать.
ahdenchik
18.01.2025 03:46"Длинная линия" в электронике это линия, длина которой превышает длину распространяющейся в ней волны
firehacker
18.01.2025 03:46Абсолютно безосновательное заявление о ненужности пина питания. Актуально только для DS1820-PAR — версии чипа для чисто паразитного питания, там он действительно не подключен внутри чипа.
Следующая итерация улучшения ситуации, которую ожидал, но не увидел в статье — это активный pull-up — не с помощью резистора, а с помощью constant current source — для борьбы с паразитной ёмкостью длинной линии и медленным нарастанием при отпускании пуллдауна. Тогда оно будет не по экспоненте, а линейным.
Отдельный разговор это то, что если на шину посадить целую гряду термодатчиков -PAR-подверсии, то оно вообще работать не будет: нужно на время замера делать strong pull-up, иначе на все чипы тока не хватит.
firehacker
18.01.2025 03:46До полутора миллиампер доходит ток потребления одного чипа во время измерения температуры согласно даташиту.
Даже если бы предложенный пуллап в 470 ом был подключен к +5V-шине с бесконечно низким выходным импедансом, уже при токе 6 mA падение на пуллапе составит 470*0.006=2.82V.
Более чем на 1/2 упадет напряжение питание при одновременном запуске измерения всего лишь на 4 чипах, Карл! На четырёх! Хотя на шину их можно посадить сотню.
Но это при условии что та нода, к которой подключен верхний конец пуллапа, имеет нулевой output impedance. А пуллап по факту подключен к средней точки делителя резистор-стабилитрон, и выходной импеданс этой ноды далеко не ноль. Почему было там 7805 не поставить вместо этой порнографии со стабилитроном? В итоге наверное даже два-три одновременно запущенных на измерение чипа на шине уложат шину
Что за шляпу предлагает нам автор?
firehacker
18.01.2025 03:46Совсем забыл: там же стоит конденсатор 10 uF у каждого датчика, чтобы обеспечить каждый датчик энергией. Так вот, если предположить, что во время измерения термодатчик потребляет ток 1.5 mA вне зависимости от напряжения питания, достаточно 16 миллисекунл чтобы разрядить конденсатор 10 uF с изначальных 5V до 2.5V (минимальное напряжение для работы чипа — 3V, то есть на 2.5V чип уже не будет работать). Между тем, процедура замера температуры длится как минимум 94 миллисекунды (в самом грубом 9-битном режиме), а в худшем случае — 750 миллисекунд (в 12-битном режиме).
Так что этот конденсатор — мёртвому припарка. Заряд из «локального» конденсатора чип очень быстро высосет, а с шины взять нужный ток несколько устройство одновременно не смогут из-за подтягивающего резистора.
Если интересно, можно даже просимулировать. Симулировать будем с упрощениями:
Термодатчик потребляет 1.5 mA вне зависимости от напряжения питания
Диодом перед «локальным» конденсатором пренебрегаем.
Пуллап сделан к «супермощной» +5V-шине, а не к маломощной RD-цепочке.
4 термодатчика, одновременно делающих преобразование:
просадят напряжение на шине до минимально допустимого (+3V) уже за 24 мс — что в четыре раза меньше, чем требуется чипу для совершения термопреобразования с минимальной точностью (94 мс). Вывод: чипы перестанут работать раньше, чем смогут сделать какой-то замер.
3 термодатчика, одновременно делающих преобразоание:
просадят напряжение на шине до минимально допустимого где-то за 40 мс — опять же, раньше, чем процесс измерения завершится, в итоге измерения не состоятся вообще.
2 термодатчика, одновременно делающих преобразование:
смогут закончить начатое измерение термпературы при любой настроенной точности (от 8 бит до 12 бит — 94...750 мс)
Но это пуллап к идеальной +5V-шине. Без учёта «стабилитронного» подхода.
JBFW Автор
18.01.2025 03:46Один вопрос: вы это ДЕЛАТЬ пробовали сами, или только в программе посчитали? )
- ваш Паваротти - хрень полная!
- а где ты его слушал?!
- да мне сосед вчера напел...Там всё совершенно не так как вы рассчитываете, потому что реальность далека от упрощений. Да и работает оно немного не так как вы думаете...
Оставайтесь с нами, напишу )
garageman
18.01.2025 03:46Мастер шины, типично, не запускает преобразования на нескольких термометрах одновременно.
JBFW Автор
18.01.2025 03:46Вот именно.
Но штатная ардуиновская библиотека запускает (потому что в куче примеров по программированию МК с 1-wire именно так написано, "для всех сразу")
garageman
18.01.2025 03:46Ну, это же пример... Просто скелет для понимания принципа.
Соверешенно аналогичное, спрашивают меня про демо-скрипт в 20 строчек: "А как он будет реагировать на <возможная ошибка>?".
Ну и даю ссылку на боевую реализациюю, в которой те ж 20 строк и еще 300 - проверки и обработки нештатного поведения.HardWrMan
18.01.2025 03:46боевую реализациюю, в которой те ж 20 строк и еще 300 - проверки и обработки нештатного поведения
Жиза. Помню, какую анальную эквилибристику надо делать для обработки ошибок и внештатных состояний у I2C контроллера в STM32... Там ещё из ерраты 2 абзаца кода надо учитывать...
kkuznetzov
Очень странные схемы.
Не хватает защиты линии. Поставить какой-нибудь защитный диод и последовательный резистор.
Не жирно ли 10 мкФ на второй схеме? Думаю хватит сильно меньше. Даже, что то вроде 0.47 мкФ.
JBFW Автор
Стабилизация, напряжение прыгать не должно. А 10 мкФ потому что "какой был", обычный мелкий электролит.
Если разрабатывать как фабричное изделие - другое дело, может и хватило бы 0.47