Редкая самоделка на тему "умного дома" обходится без термометров. В интернете есть масса инструкций по подключению, но при этом обычно ограничиваются "классическим", учебно-демонстрационным вариантом, наверняка его все видели:
Берется какая-нибудь ардуиноподобная плата, или что-то из серии 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 пары проводов.
И это всё действительно работает. Можно завести в систему Умного дома всего одно устройство для считывания шины, а саму шину развести, ну например, коаксиалом, телефонным шнуром или той же витой парой, и собирать данные из разных мест.
Правда, тут можно наткнуться на особенности работы штатной ардуиновской библиотеки - она плохо подходит для опроса большого числа датчиков, но это уже другая тема, чисто программная.