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

от автора

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

Хочу рассказать о новом и неожиданном способе подключения нескольких датчиков 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); }


ссылка на оригинал статьи https://habr.com/post/425541/