IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Initialisation de capteurs


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 238
    Par défaut Initialisation de capteurs
    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).
    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:
    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());
    }
    Mon soucis est donc la repetition du
    Puisque si j'ai quatre capteurs, et une mesure toutes le 10 secondes cela fait un paquet de begin()........

    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 :
    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();
    }
    Je crois avoir compris que si le I2c_dev existe, on le "delete" puis on le reconstruit.
    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

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 938
    Par défaut
    d'un point de vue design vous devez décider à quel endroit est l'abstraction

    est-ce que votre objet c'est un ensemble de capteurs ==> "[multiplexeur I2C + n capteurs]" ou juste n instances pour les "[n capteurs]" qui doivent savoir qu'ils sont derrière un multiplexeur I2C.

    et vous devez décider si votre classe réutilise une classe existante pour BME280 ou si vous embarquez vous même le code de contrôle.

    un design possible serait une classe multiplexeur I2C (ça existe https://github.com/RobTillaart/TCA9548) que vous instanciez une fois puisque vous avez un seul multiplexeur et vous passez une référence à ce multiplexeur I2C au constructeur d'une classe spécifique pour capteur BME280 qui sait être derrière le multiplexeur I2C (donc on passe au constructeur par exemple la référence au multiplexeur et le N° de port)

  3. #3
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 238
    Par défaut
    bonjour Jay M,

    Je n'avais pas trouver la bibliothèque pour les TCA9548,

    Je vais voir....

    Merci pour les réflexion je vais déja voir avec cela

Discussions similaires

  1. [Servlet] Fichiers d'initialisation
    Par david71 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 03/09/2003, 14h47
  2. Créer et initialiser un composant TStatusBar :help:
    Par James_ dans le forum C++Builder
    Réponses: 10
    Dernier message: 21/08/2003, 09h52
  3. [servlet] initialisation d'objets
    Par tiPouick dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/08/2003, 13h12
  4. Initialisation de XMLModule
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 10
    Dernier message: 01/04/2003, 11h08
  5. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 18h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo