Como contornar rapidamente a imutabilidade do endereço do sensor HTU21 sem atirar na perna

Olá queridos Khabrovites, bem, aqui estou eu agora ajudando você.





No processo de desenvolvimento de um dispositivo interessante, encontrei um problema, era necessário conectar rapidamente vários sensores htu 21 ao arduinka e registrar as leituras. O sensor ficou satisfeito com a presença do barramento i2c, mas depois houve uma chatice, porque seus endereços são estáticos. Um gênio arduino interno veio com uma maneira inteligente com alternância de comutação e votação de sensores, esfregando minhas mãos, observei o controlador às vezes congelar, porque nem tudo é tão simples. Procurando no Google, encontrei apenas este , o mesmo gênio, mas aparentemente ele não testou o bundle, pois ele não está operacional por mais de alguns minutos devido à passagem de corrente pelo diodo de proteção da porta.





Nos comentários, pessoas inteligentes sugeriram maneiras diferentes e, ah, sim, a maneira mais simples e barata acabou sendo usar o multiplexador analógico cd4051be. Cito o comentário:





"Sim, é mais fácil. E há menos pernas e hardware I2C (não estamos falando de controladores nos quais o SCL pode ser colocado em qualquer pé?) - um multiplexador analógico, como até mesmo um CD4051 pré-histórico, SDA é instalado diretamente no todos os chips, SCL através de um multiplexador. Três pernas adicionais, 8 canais adicionais. Não se esqueça de colocar o SCL pull-up na fonte de alimentação após o multiplexador, e não antes. "





Liguei de acordo com o esquema daqui , só que a saída do multiplexador não é para A0, mas para A5. 3 sensores SCL são conectados à perna 15, 13 e 1, comum SDA.





O código indiano mais simples, baseado na tabela de estados





os barramentos de endereços são habilitados via digitalWrite () (por favor, não bata, eu não vasculho)





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 );


      
      






All Articles