Cómo evitar rápidamente la inmutabilidad de la dirección del sensor HTU21 sin disparar en la pierna

Hola queridos Khabrovites, bueno, aquí les estoy ayudando.





En el proceso de desarrollo de un dispositivo interesante, encontré un problema, era necesario conectar rápidamente varios sensores htu 21 al arduinka y registrar las lecturas. El sensor estaba satisfecho con la presencia del bus i2c, pero luego hubo un fastidio, porque sus direcciones son estáticas. A un genio interno de arduino se le ocurrió una forma inteligente de conmutación alternativa y sondeo de sensores, frotándome las palmas, vi que el controlador a veces se congelaba, porque no todo es tan simple. Buscando en Google, encontré solo esto , el mismo genio, pero aparentemente no probó el paquete, porque no está operativo por más de un par de minutos debido a la corriente a través del diodo protector del puerto.





En los comentarios, personas inteligentes sugirieron diferentes formas y, oh sí, la forma más simple y barata resultó ser usar el multiplexor analógico cd4051be. Cito el comentario:





"Sí, es más fácil. Y hay menos patas y hardware I2C (¿no estamos hablando de controladores en los que SCL se puede utilizar con cualquier pie?): Un multiplexor analógico como incluso un CD4051 prehistórico, SDA se instala directamente en todos los chips, SCL a través de un multiplexor. Tres patas adicionales, 8 canales adicionales. No olvides colocar el pull-up SCL en la fuente de alimentación después del multiplexor, y no antes ".





Lo conecté de acuerdo con el esquema de aquí , solo la salida del multiplexor no es para A0, sino para A5. 3 sensores SCL están conectados a la pata 15, 13 y 1, común SDA.





El código indio más simple, basado en la tabla de estados.





Los buses de direcciones están habilitados a través de digitalWrite () (por favor, no golpee, no hurgo)





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