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

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

В процессе разработки интересного девайса столкнулся с проблемой, нужно было быстро подключить несколько датчиков 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 );  

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *