Привет дорогие Хабровчане, ну вот и я теперь помогаю Вам.

В процессе разработки интересного девайса столкнулся с проблемой, нужно было быстро подключить несколько датчиков htu 21 к ардуинке и записать показания. Датчик порадовал наличием шины i2c, но тут случился облом, ибо адреса у них статичны. Внутренний ардуино гений придумал хитрый способ с поочередной коммутацией и опросом датчиков, потирая ладошки я наблюдал как контроллер иногда зависает, ведь не так все просто. Погуглив, я нашел только вот это, такой же гений, но он видимо не тестировал связку, потому что она не работоспособна больше пары минут из за сквозного тока через защитный диод порта.

В комментариях умные люди предлагали разные способы и о да, самый простой, дешевый способ оказался с применением аналогового мультиплексора cd4051be. Цитирую комментарий:

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

Подключал по схеме отсюда, только выход мульплексора не к А0, а к А5. 3 датчика SCL подключены к ноге 15, 13 и 1, SDA общий.

Код простейший индийский, основан на таблице состояний

адресные шины включаются через digitalWrite() (пожалуйста не бейте, я не шарю)

int temp1;
int hum1;
int temp2;
int hum2;
int temp3;
int hum3;
#include <HTU21D.h>
HTU21D myHTU21D(HTU21D_RES_RH12_TEMP14);
void setup() {
  pinMode(8,  OUTPUT);  // CD4051 pin 11 (A)
  pinMode(9,  OUTPUT);  // CD4051 pin 10 (B)
  pinMode(10, OUTPUT);  // CD4051 pin 9  (C)
  Serial.begin(9600);
  while (myHTU21D.begin() != true)
  {
    Serial.println(F("Sensor is faild or not connected")); //(F()) saves string to flash & keeps dynamic memory free
    delay (200);

    // Инициируем передачу данных по последовательному порту на скорости 9600 бот.
  }
}
void loop() {
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  myHTU21D.begin();
  delay (150);
  temp1 = myHTU21D.readTemperature();
  hum1 = myHTU21D.readCompensatedHumidity();
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  myHTU21D.begin();
  delay (150);
  temp2 = myHTU21D.readTemperature();
  hum2 = myHTU21D.readCompensatedHumidity();
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
    digitalWrite(10, LOW);
  myHTU21D.begin();
  delay (150);
  temp3 = myHTU21D.readTemperature();
  hum3 = myHTU21D.readCompensatedHumidity();

  Serial.print(" T1: "); Serial.print(temp1 );
  Serial.print(" H1: "); Serial.print(hum1 );
  Serial.print(" T2: "); Serial.print(temp2 );
  Serial.print(" Н2: "); Serial.print(hum2 );
  Serial.print(" Т3: "); Serial.print(temp3 );
  Serial.print(" Н3: "); Serial.print(hum3 );