Comment contourner rapidement l'immuabilité de l'adresse du capteur HTU21 sans tirer dans la jambe

Bonjour chers Khabrovites, eh bien, me voici maintenant en train de vous aider.





En train de développer un appareil intéressant, j'ai rencontré un problème, il fallait rapidement connecter plusieurs capteurs htu 21 à l'arduinka et enregistrer les lectures. Le capteur était content de la présence du bus i2c, mais ensuite il y avait une déception, car leurs adresses sont statiques. Un génie interne de l'arduino a trouvé un moyen astucieux d'alterner la commutation et l'interrogation des capteurs, en me frottant les paumes, j'ai parfois regardé le contrôleur se figer, car tout n'est pas si simple. En cherchant sur Google, je n'ai trouvé que ça , le même génie, mais il n'a apparemment pas testé le bundle, car il n'est pas opérationnel pendant plus de quelques minutes en raison du courant traversant à travers la diode de protection du port.





Dans les commentaires, des personnes intelligentes ont suggéré différentes façons, et oh oui, la façon la plus simple et la moins chère s'est avérée être l'utilisation du multiplexeur analogique cd4051be. Je cite le commentaire :





"Oui, c'est plus facile. Et il y a moins de pattes, et du matériel I2C (on ne parle pas de contrôleurs dans lesquels SCL peut être sorti sur n'importe quel pied ?) - un multiplexeur analogique comme même un CD4051 préhistorique, le SDA est installé directement sur toutes les puces, SCL via un multiplexeur. Trois pattes supplémentaires, 8 canaux supplémentaires. N'oubliez pas de mettre le pull-up SCL sur l'alimentation après le multiplexeur, et pas avant. "





Je l'ai connecté selon le schéma d'ici , seule la sortie du multiplexeur n'est pas vers A0, mais vers A5. 3 capteurs SCL sont connectés aux pattes 15, 13 et 1, commun SDA.





Le code indien le plus simple, basé sur la table des états





les bus d'adresses sont activés via digitalWrite() (merci de ne pas taper, je ne fouille pas)





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