Bonjour a tous.
Je reviens vers vous car j'ai une inquiétude.
J'ai un projet de mettre plusieurs capteur BME280 sur le même arduino connectés en I2C.
Comme ils ont tous la même adresse I2C, j'utilise un multiplexeur I2C type TCA9548A.
Cela fonctionne bien, j'ai quatre capteurs qui mesure 4 endroit différent et les mesures reviennent vers l'affichage.
Mon inquiétude est au niveau de l'initialisation des capteurs.
Version de base:
Pour chaque capteur, un port IO du multiplexeur est utilisées. Le capteur relié a ce port est initialisé dans le setup avec la commande:
Comme j'ai quatre capteurs, pour chaque capteur le "x" est remplacer par le numero (0,1,2,3).
Code : Sélectionner tout - Visualiser dans une fenêtre à part bmex.begin()
Dans l'absolu, cela fonctionne.
Version "professionnelle"
Je voudrais crée une classe pour utiliser le multiplexeur sur divers Arduino.
Donc je crée une classe qui comprendra les fonctions de scan I2C (pour trouver les adresses des bme280) et
une fonction qui lira les valeurs des capteurs.
Pour éviter de transmettre trop d'info, la fonction de lecture des valeurs des capteurs devrait aussi initialiser les capteurs.....
Donc si je lis les capteur toutes les 10 secondes, mes quatre capteurs seront initialisés toutes les 10 secondes??
mon code pour la lecture est quelque chose ainsi:
Mon soucis est donc la repetition du
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void MultiI2C::LitI2C(uint8_t multi, byte addr){ if (addr==0 ) addr=118; IO(multi); bme.begin(addr); Serial.print(F(" temp= ")); Serial.print(bme.readTemperature()); Serial.print(F(" Rh= ")); Serial.println(bme.readHumidity()); Serial.print(F("ID : ")); Serial.println(bme.sensorID()); }
Puisque si j'ai quatre capteurs, et une mesure toutes le 10 secondes cela fait un paquet de begin()........
Code : Sélectionner tout - Visualiser dans une fenêtre à part bme.begin(addr)
Dans le fonctionnement normal, le bme.begin() se fait dans le setup, donc une fois pour toutes.
Avec le multiplexeurs je dois exécuter le bme.begin() pour chaque capteur branché sur un port IO du multiplexeur.......
Ou faire le bme.begin() lors de l'appel à la fonction de lecture...
Si je regarde la bibliothèque Adafruit_BME280, je constate que la fonction "Adafruit_BME280::begin" contient les lignes :
Je crois avoir compris que si le I2c_dev existe, on le "delete" puis on le reconstruit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 bool Adafruit_BME280::begin(uint8_t addr, TwoWire *theWire) { if (spi_dev == NULL) { // I2C mode if (i2c_dev) delete i2c_dev; i2c_dev = new Adafruit_I2CDevice(addr, theWire); .......... return init(); }
Mais n'y à -t-il pas un risque de mémoire à effacer et réécrire toutes les 10 secondes?
De plus la ligne "return (init(); réinitialise le capteur, d’où écriture dans les registres du capteur.....
Pour éviter cela, il faudrait durant le setup déterminer le nombre de capteurs branchés sur le multiplexeur, initialiser chacun d'eux..
Dans le loop, il faut alors prévoir de définir lors de la lecture le port IO du multiplexeur et le capteur associé....
Le travail n'est pas le même......
Mais la question est plus comment bien écrire mes programmes......
Merci de vos conseils et remarques
Michel
Partager