Приветствую всех жителей Хабра!
Хочу рассказать о новом и неожиданном способе подключения нескольких датчиков HTU21 по шине I2C без использования дополнительных микросхем.
Данный датчик все еще пользуется популярностью среди разного рода DIY-мастеров, причем заслуженно: он более точен, чем предшественник и мал размерами (что удобно для встраивания в устройства).
Совсем недавно меня, как и многих пользователей, озадачило отсутствие возможности изменить адрес у данного датчика. Гугл, конечно же, выдал кучу статей о всяких мультиплексорах для шины I2C от «купить в известном всем китайском интернет-магазине» до «сделать схему своими руками». Нигде не было вариантов без паяльника и дополнительных расходов. Это не могло не расстроить так как нужно было решить проблему здесь и сейчас (заказчики такие заказчики). Хочу рассказать о более легком и непринужденном, очень простом выходе из данной ситуации. Заинтриговала? Тогда рассказываю.
Исходные данные: Arduino mega и 4 датчика HTU21.
Задача: необходимо подключить все датчики htu по шине I2C и считывать значения. Причем данные сенсоры — не единственные ведомые устройства на данной шине (в планах еще ЖК экран и другие датчики).
Что мы знаем? У датчика HTU21 фиксированный адрес на шине — 0x40 1. Как, имея микроконтроллер и 4 датчика с одинаковыми адресами на шине, обращаться к конкретному устройству без лишних микросхем?
Все оказывается довольно просто:
- подключаем землю, scl и sda как обычно (не забываем про подтягивающие резисторы для линии данных и синхронизации);
- подключаем провод питания каждого датчика к цифровому входу на Arduino (вы уже наверняка поняли куда я веду)
- поочередно подаем HIGH на каждый цифровой вход, питающий отдельный датчик и, после задержки, считываем значение с запитанного сенсора.
- подаем сигнал 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);
}