Pull to refresh

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

Reading time 2 min
Views 13K

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


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

Articles