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