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

Автор Сообщение
news_bot ®

Стаж: 6 лет 3 месяца
Сообщений: 27286

Создавать темы news_bot ® написал(а)
07-Июн-2021 02:32

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

Похожие новости: Теги для поиска: #_diy_ili_sdelaj_sam (DIY или Сделай сам), #_htu_21, #_multipleksory (мультиплексоры), #_arduino (ардуино), #_diy_ili_sdelaj_sam (
DIY или Сделай сам
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 19-Май 13:08
Часовой пояс: UTC + 5