Как быстро и без лишних микросхем обойти неизменяемость адреса у датчика HTU21 +11



Приветствую всех жителей Хабра!


Хочу рассказать о новом и неожиданном способе подключения нескольких датчиков HTU21 по шине I2C без использования дополнительных микросхем.


Данный датчик все еще пользуется популярностью среди разного рода DIY-мастеров, причем заслуженно: он более точен, чем предшественник и мал размерами (что удобно для встраивания в устройства).


Совсем недавно меня, как и многих пользователей, озадачило отсутствие возможности изменить адрес у данного датчика. Гугл, конечно же, выдал кучу статей о всяких мультиплексорах для шины I2C от «купить в известном всем китайском интернет-магазине» до «сделать схему своими руками». Нигде не было вариантов без паяльника и дополнительных расходов. Это не могло не расстроить так как нужно было решить проблему здесь и сейчас (заказчики такие заказчики). Хочу рассказать о более легком и непринужденном, очень простом выходе из данной ситуации. Заинтриговала? Тогда рассказываю.


Исходные данные: Arduino mega и 4 датчика HTU21.


Задача: необходимо подключить все датчики htu по шине I2C и считывать значения. Причем данные сенсоры — не единственные ведомые устройства на данной шине (в планах еще ЖК экран и другие датчики).


Что мы знаем? У датчика HTU21 фиксированный адрес на шине — 0x40 1. Как, имея микроконтроллер и 4 датчика с одинаковыми адресами на шине, обращаться к конкретному устройству без лишних микросхем?


Все оказывается довольно просто:


  1. подключаем землю, scl и sda как обычно (не забываем про подтягивающие резисторы для линии данных и синхронизации);
  2. подключаем провод питания каждого датчика к цифровому входу на Arduino (вы уже наверняка поняли куда я веду)
  3. поочередно подаем HIGH на каждый цифровой вход, питающий отдельный датчик и, после задержки, считываем значение с запитанного сенсора.
  4. подаем сигнал LOW для этого датчика и повторяем цикл для других сенсоров.

Конечно же, в таком методе также есть недостатки, например, может просто отсутствовать необходимое количество свободных цифровых или аналоговых выходов. Но для использования в проектах этот принцип работает, и работает на достаточных расстояниях от микроконтроллера. Надеюсь, данная статья поможет Вам сберечь нервы, средства и время.


Не зря говорится, что все гениальное — просто!


Листинг прилагается:


/* функция, считывающая значение температуры
и влажности с датчиков HTU21 и датчика BME280 */

void greenhouseHT()
{  
    delay(30);
    rooms[3].TempA = bme.readTemperature();
    delay(30);
    rooms[3].HumA = bme.readHumidity(); 
    delay(30);  

  for (int i=0; i<3; i++)
  {
    digitalWrite(HTU21_pins[i], HIGH);
    delay(30);
    rooms[i].HumA   = myGreenhouseHumidity.readHumidity(); 
    rooms[i].TempA  = myGreenhouseHumidity.readTemperature(); 
    delay(30);
    digitalWrite(HTU21_pins[i], LOW);
    delay(30);
  }
  digitalWrite(pin_HTU21_1, HIGH);
}

Вы можете помочь и перевести немного средств на развитие сайта



Комментарии (41):

  1. Serge78rus
    /#19200509

    Зачем задержка после считывания значения перед отключением питания?

  2. Tsvetik
    /#19200685 / +2

    На мой взгляд, не надо у датчиков выключать питание. Они после включения могут долго выходить на режим. Лучше транзистором SCL или SDA от датчика отцеплять, или дешифратор поставить

    • Dima_Sharihin
      /#19200773

      Для этого есть специальные мультиплексоры I2C шин, зачем что-то изобретать.
      http://www.ti.com/product/tca9544a как пример

      • Tsvetik
        /#19200857

        Есть, но их надо заказывать, ждать доставки и стоят они в 10 раз дороже чем стандартная логика 74 или 40 серии
        И TCS9544 слишком умная, чтобы обойтись просто дерганьем ножек. Ей самой надо по I2C управлять.

        • Dima_Sharihin
          /#19200887 / +1

          Так это не недостаток, а достоинство. Не нужно тянуть отдельные GPIO для коммутации абонентов, все делается по одному I2C.
          И касаемо TI — если это нужно на один раз, микросхема заказывается образцами (и идет
          чуть больше недели из штатов в РФ), если нужно серийное устройство, то проще как раз взять готовую микросхему, чем потом разгребать возможные неочевидности.

          • Misaka10032
            /#19204377

            и идет чуть больше недели из штатов в РФ

            У них сейчас всё сильно лучше. Заказывал недавно несколько отладок — от Штатов до Самары 4-5 дней.

  3. AEP
    /#19200771

    Раз есть свободные входы/выходы, почему бы не сделать просто несколько I2C-шин?

    • Serge78rus
      /#19200943 / +5

      Потому, что для реализации I2C программным «ногодрыгом» нежно забыть про digitalWrite(), так полюбившуюся ардуинщикам, перестать писать «скетчи» и начать программировать.

      • dernuss
        /#19201547

        soft i2c писать 2 часа максимум)

        • dlinyj
          /#19202907

          Или 10 минут погуглить

          • Misaka10032
            /#19204411

            Или взять MSP432E4, у которого десяток аппаратных I2C)

            • Dima_Sharihin
              /#19204475

              Сестра-близнец тивы TM4C1294 — это дикий монстр, который для 90% задач — оверкилл. Зато Ethernet с физикой на борту, это круто, да. Грубо говоря мультиплексор стоит 0.73USD*1ku, а этот монстрик ~14USD за штучку.


              Для каждой задачи — свой инструмент

              • Misaka10032
                /#19204509

                Так это же сарказм был))
                И E401 в TQFP-128 стоит 8.66USD*1ku.

                • Dima_Sharihin
                  /#19204531

                  О, или я что-то напутал, или они реально подешевели. Впрочем TM4C1294NCPDTI3 все равно стоит 8.07*1ku :P

                  • Misaka10032
                    /#19204541

                    Кстати, я техасовскими MCU интересоваться начал недавно, поэтому никак не могу понять, вдруг вы объясните — что у них творится за чертовщина с названиями семейств? И какое в итоге актуальное, а какое выбросили на свалку истории?

                    • Dima_Sharihin
                      /#19204633

                      Ну, я так понял, что SimpleLink (CC13xx, CC26XX, MSP432) — это "стильно-модно-молодежно" и развивать будут именно его. Собственно это не столько микроконтроллеры, сколько техасовская софтовая поддержка всего этого безобразия: куча кода зашита прям в ROM микроконтроллера, из-за чего и весь сыр-бор с отдельными микроконтроллерами.


                      Пока не выбросили ничего, продают даже Concerto и TM4C123, и, зная TI, старые контроллеры они могут поддерживать очень долго, пока есть крупный клиент, готовый их покупать.


                      А по остальным семействам — так у них же разные сферы применения: MSP430 — бюджетные и сверхмалопотребляющие железки, C2000 — числодробильные контроллеры с крутейшей аналоговой периферией (14 компараторов с собственными ЦАП + 2 буфферированных ЦАП + ШИМ высокого разрешения + 3 S/H SAR ADC по 3MSPS каждая + вычисление синуса за четыре такта).


                      Keystone, Sitara, DRA и иже с ними "микроконтроллерами" назвать язык не поворачивается, поэтому упоминать их не буду.

                      • Misaka10032
                        /#19204651

                        Окей, спасибо большое. Меня, собственно, позиционирование MSP432 как раз и интересовало. Видимо, 432 заменил Tiva, но Tiva продавать они не прекращают.

                      • olartamonov
                        /#19205857

                        У TI же гарантированный 10-летний минимальный срок выпуска по любой позиции, без этого трудно считаться серьёзным производителем. Поэтому запуск новой серии, заменяющей старую, вообще никак не означает прекращение выпуска старой.

                        • Dima_Sharihin
                          /#19205971

                          Ну, это если микросхема выбралась из состояния "preview", а то получается 66AK2G01. Но да, TI — пример очень долгой поддержки своих мелкосхем.

            • olartamonov
              /#19205847

              Если надо решить проблему строго без внешних чипов — есть контроллеры со свободной коммутацией GPIO, например, nRF52 или TI CC13xx/C26xx, там I2C можно перекидывать на произвольные ножки чипа (равно как и все прочие сигналы, кроме входов АЦП).

              Контроллер с десятью I2C нужен, только если эти десять I2C должны фигачить одновременно.

  4. avf1906
    /#19201355 / +1

    а точно проверяли? потому что на входах scl sda предполагается защитный диод на vdd, который будет садить линии данных на землю, ведь на входе +Vdd лог. 0. А если 0 не подавать, а переводиться в высокоимпедансное состояние, то микросхема будет запитываться через тот же диод. Судя по требованию к напряжениям на входах scl sda <Vdd+0.3V это не истинный открытый сток и диод там должен быть.

  5. olartamonov
    /#19201439 / +3

    Ну почему, почему как ардуина — так обязательно какой-то детский сад, а не советы?

    Типичная схема цифрового входа включает в себя защитный диод с входа на + питания. Не у всех, но у многих. Если у HTU21D они есть, притянув его питание к земле, вы просто притянете к земле через диод всю свою шину I2C.

    А если вы такие эксперименты начнёте на любой шине с push-pull драйвером, то это вообще немного печально закончится.

    • dlinyj
      /#19202909

      Да, данный пост полное днище и деградация. Тут я полностью солидарен.

      • SadAngel
        /#19202971

        Эффект Даннинга — Крюгера на практике :)

  6. proton17
    /#19201453 / +4

    Отличный способ выстрелить себе в ногу. По даташиту максимальное входное напряжение на цифровых входах = VDD. Если отключить питание, то VDD=0, значит и на вход можно подовать не больше 0. У вас там утяжка шины висит, т.е. через защитный диод на входе датчика все время в выключенном состоянии будет течь ток VDD/Rpullup, скорее всего это будет около 3-5ма. Может диод и не сгорит, сразу, но греться может.

  7. FGV
    /#19202083 / +2

    одна нога МК — общий SDA (для всех);
    N ног МК — N отдельных SCL.
    экономия — одна нога МК и не надо с питанием мучаться.

    • olartamonov
      /#19202145

      Да проще же. И ног меньше, и I2C аппаратный (мы же тут не про контроллеры, у которых SCL можно на любую ногу вывести?) — ставится аналоговый мультиплексор типа хоть доисторического CD4051, SDA напрямую на все чипы, SCL через мультиплексор.

      Три дополнительные ноги, 8 дополнительных каналов. Подтяжку SCL к питанию не забыть поставить после мультиплексора, а не до.

      • FGV
        /#19202847

        Ну да, с мультиплексором еще больше экономия ног МК. Тока тут в названии было "… без лишних микросхем...".

  8. dlinyj
    /#19202905

    Так делать нельзя.

    Происходит деградация порта и в конце концов котроллер выходить из строя, при чём вы даже не поймёте, как в какой-то момент порт перестанет работать. Смотрите. Микросхема потребляет 500 мА, согласно даташиту:



    А ATmega2560, стоящая в Arduino Mega выдаёт всего 100-200 мА на порт.



    Оно работать будет, но не долго и очень плохо.

    • Serge78rus
      /#19202941

      Микросхема потребляет 500 мА, согласно даташиту
      Не 500 мА, а 500 мкА

      • dlinyj
        /#19203081

        Да, невнимателен'c… Ну тогда вполне себе вариант

        • Serge78rus
          /#19204477

          Нет, все равно не вариант, и выше уже три человека написали почему: 1 2 3

    • SadAngel
      /#19202963

      У вас ошибка, там 500 микроА, а не 500mA (0.5)

  9. SadAngel
    /#19202955

    Ничего удивительного, просто результат низкого порога вхождения который всё ардуинщики любят :)

    • r00tGER
      /#19204439 / +1

      Существенная проблема, ещё и в том, что после детального объяснения, например как выше в комментариях — не будет сделано никаких выводов. И, только единицы пойдут разбираться, что это там за диод такой…

      • SadAngel
        /#19204899 / +1

        Даже когда отключено напряжение питания HTU21, на микросхеме будет напряжение достаточное для работы (5V — Vd), тоесть примерно 5 — 0.6 = 4.4V
        image

        • Mike_soft
          /#19205449

          а в случае, когда Vcc HTU притянуто к нулю ногой МК — имеем такую же цепь, только вместо Vcc — GND, диоды получаются встречно-параллельно, и через резистор и диоды постоянно течет ток. а вход получается практически прижат к земле…

        • olartamonov
          /#19205923

          HTU21 не работает от 5 В, у него 3,6 В absolute maximum. У автора скорее всего готовая ардуино-плата с транслятором уровней.

          Но это не суть важно, потому что достаточного для работы напряжения не будет.

          Во-первых, R1 = 10...50 кОм, в зависимости от микроконтроллера, HTU21 при измерении потребляет 0,54 мА, итого падение на R1 будет 5,4 В, т.е. даже в идеальных условиях попытка чипа уйти в измерение обрушит питание ниже допустимого предела.

          Во-вторых, SCL и SDA при передаче данных будут регулярно падать в ноль, чип при этом будет пытаться как-то жить на висящем у него на VCC конденсаторе…

          Короче, лучше не думать, чем и как он там будет в линию мусорить, если его так насиловать.

      • olartamonov
        /#19205879

        Ну, может будет сделан вывод «в интернете говорили, что так включать почему-то нельзя».

        А должен быть сделан вывод «книжки читать надо».

        Причём тема-то элементарная, это вам не радиочастотка или там mixed signal какой-нибудь, в которых, если ударение во фразе не там поставить, можно Сатану случайно вызвать.