- PVSM.RU - https://www.pvsm.ru -
Приветствую всех жителей !
Хочу рассказать о новом и неожиданном способе подключения нескольких датчиков HTU21 по шине I2C без использования дополнительных микросхем.
Данный датчик все еще пользуется популярностью среди разного рода DIY-мастеров, причем заслуженно: он более точен, чем предшественник и мал размерами (что удобно для встраивания в устройства).
Совсем недавно меня, как и многих пользователей, озадачило отсутствие возможности изменить адрес у данного датчика. Гугл, конечно же, выдал кучу статей о всяких мультиплексорах для шины I2C от «купить в известном всем китайском интернет-магазине» до «сделать схему своими руками». Нигде не было вариантов без паяльника и дополнительных расходов. Это не могло не расстроить так как нужно было решить проблему здесь и сейчас (заказчики такие заказчики). Хочу рассказать о более легком и непринужденном, очень простом выходе из данной ситуации. Заинтриговала? Тогда рассказываю.
Исходные данные: Arduino mega и 4 датчика HTU21.
Задача: необходимо подключить все датчики htu по шине I2C и считывать значения. Причем данные сенсоры — не единственные ведомые устройства на данной шине (в планах еще ЖК экран и другие датчики).
Что мы знаем? У датчика HTU21 фиксированный адрес на шине — 0x40 1 [1]. Как, имея микроконтроллер и 4 датчика с одинаковыми адресами на шине, обращаться к конкретному устройству без лишних микросхем?
Все оказывается довольно просто:
Конечно же, в таком методе также есть недостатки, например, может просто отсутствовать необходимое количество свободных цифровых или аналоговых выходов. Но для использования в проектах этот принцип работает, и работает на достаточных расстояниях от микроконтроллера. Надеюсь, данная статья поможет Вам сберечь нервы, средства и время.
Не зря говорится, что все гениальное — просто!
Листинг прилагается:
/* функция, считывающая значение температуры
и влажности с датчиков 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);
}
Автор: Барак Адама
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/umny-j-dom/293634
Ссылки в тексте:
[1] 1: https://cdn-shop.adafruit.com/datasheets/1899_HTU21D.pdf
[2] Источник: http://habrahabr.ru/sandbox/123841/
Нажмите здесь для печати.