Русский
Русский
English
Статистика
Реклама

Как быстро обойти неизменяемость адреса у датчика 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 );
Источник: habr.com
К списку статей
Опубликовано: 07.06.2021 00:10:32
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Diy или сделай сам

Htu 21

Мультиплексоры

Ардуино

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru