Partage
  • Partager sur Facebook
  • Partager sur Twitter

connecter 7 sonde sht85 avec arduino

en utilisant le mux tca9548a (BUS I2C)

Sujet résolu
    21 août 2019 à 13:59:07

    Bonjour les amis j'ai un projet et je suis coincé , je suis nouveau dans la programmation avec arduino 
    le problème c est que je veux connecter 7 sonde de température sht85 avec arduino en utilisant  le tca9548a ,j'ai trouver un code mais il est valable que pour une seul sonde .
    comment puis je faire pour modifie
    #include <Wire.h>
     
    #include "SHTSensor.h"
     
    SHTSensor sht;
    // To use a specific sensor instead of probing the bus use this command:
    // SHTSensor sht(SHTSensor::SHT3X);
     
    void setup() {
      // put your setup code here, to run once:
     
      Wire.begin();
      Serial.begin(9600);
      delay(1000); // let serial console settle
     
      if (sht.init()) {
          Serial.print("init(): success\n");
      } else {
          Serial.print("init(): failed\n");
      }
      sht.setAccuracy(SHTSensor::SHT_ACCURACY_MEDIUM); // only supported by SHT3x
     
    }
     
    void loop() {
      // put your main code here, to run repeatedly:
     
      if (sht.readSample()) {
          Serial.print("SHT:\n");
          Serial.print("  RH: ");
          Serial.print(sht.getHumidity(), 2);
          Serial.print("\n");
          Serial.print("  T:  ");
          Serial.print(sht.getTemperature(), 2);
          Serial.print("\n");
      } else {
          Serial.print("Error in readSample()\n");
      }
     
      delay(1000);
    }

    r le code est l'adapter avec mon besoin ? 
    • Partager sur Facebook
    • Partager sur Twitter
      21 août 2019 à 14:58:19

      Bonjour,

      Tu n'as pas grand chose à modifier, tu dois seulement envoyer le numéro du canal du TCA9548A à activer avant la lecture de chaque capteur, par exemple avec la fonction suivante (du site d'adafruit) en adaptant l'adresse du TCA:

      #define TCAADDR 0x70
       
      void tcaselect(uint8_t i) {
        if (i > 7) return;
       
        Wire.beginTransmission(TCAADDR);
        Wire.write(1 << i);
        Wire.endTransmission();  
      }

       Donc par exemple:

      #define NB_CAPTEURS 7
      
      
      void setup() {
      ...
      
        for(int i = 0; i < NB_CAPTEURS; ++i) {
          tcaselect(i);
          Serial.print("Capteur ");
          Serial.print(i);
          Serial.print(" :");
      
          if (sht.init()) {
            Serial.print("init(): success\n");
          } else {
            Serial.print("init(): failed\n");
          }
          sht.setAccuracy(SHTSensor::SHT_ACCURACY_MEDIUM); // only supported by SHT3x
        }
      }
      
      void loop() {
        for(int i = 0; i < NB_CAPTEURS; ++i) {
          tcaselect(i);
          Serial.print("Capteur ");
          Serial.print(i);
          Serial.print(" :");
      
          if (sht.readSample()) {
            Serial.print("SHT:\n");
            Serial.print("  RH: ");
            Serial.print(sht.getHumidity(), 2);
            Serial.print("\n");
            Serial.print("  T:  ");
            Serial.print(sht.getTemperature(), 2);
            Serial.print("\n");
          } else {
            Serial.print("Error in readSample()\n");
          }
        }
        delay(1000);
      }
      • Partager sur Facebook
      • Partager sur Twitter
        21 août 2019 à 15:31:07

        Merci pour votre aide alexisdm 

        je veux savoir si j'ajoute un autre tca9548a et d'autre capteur disons 8 autre le code devient comment  si tu peux m'aider vraiment j'essaye de comprendre 

        -
        Edité par donmh 21 août 2019 à 15:34:38

        • Partager sur Facebook
        • Partager sur Twitter
          22 août 2019 à 14:50:12

          Avec plusieurs tca9548a, il faut envoyer 0 sur les TCA non utilisés et activer le i-ième bit sur le TCA sur lequel se trouve la sonde à lire, pour le i-ième canal.

          En supposant que tu veuilles te simplifier la vie en configurant les TCA avec des adresses qui se suivent, donc 0x70, 0x71..., il suffit de faire une boucle comme ceci dans la fonction tcaselect:

          #define TCAADDR 0x70
          #define TCA_COUNT 3 // 3 TCA9548A aux adresses 0x70, 0x71, 0x72
            
          
          void tcaselect(uint8_t i) {
            // on récupère le numéro du TCA, 
            // par exemple si i == 5, => port 5 du TCA n°0
            // si i == 17 => port 1 du TCA n°2 (2*8 + 1)
            uint8_t index_tca = i / 8; 
            // et on réécrit le numéro du port entre 0 et 7 dans i
            i = i % 8;
            if (index_tca >= TCA_COUNT) return;
            
            for(uint8_t n = 0; n < TCA_COUNT; ++n) {
              uint8_t data;
              // on écrit 0 sur les TCA non actifs et 
              // le masque de bit du port à activer pour le TCA actif
              if (n != index_tca)
                data = 0;
              else 
                data = 1 << i;
                
              Wire.beginTransmission(TCAADDR+n);
              Wire.write(data);
              Wire.endTransmission(); 
            }
          }

          Et donc tu n'as plus qu'à passer le port à activer entre 0 et TCA_COUNT*8-1 à la fonction.

          PS: le TCA9548A permet d'activer plusieurs sorties en même temps en mettant plusieurs bit à 1 dans la valeur qu'on lui envoie, mais comme le SHT85 n'a pas d'adresse I²C modifiable, cette fonctionnalité n'est pas utilisable ici.

          • Partager sur Facebook
          • Partager sur Twitter
            23 août 2019 à 8:19:48

            Merci pour ton aide alexisdm 

            j'aimerais savoir comment dois je transférer  l'information par modbus pour une seul sonde a un automate ?  :) :) 

            Merci une autre fois 

            • Partager sur Facebook
            • Partager sur Twitter
              23 août 2019 à 14:32:42

              AmineHourag a écrit:

              Merci pour ton aide alexisdm 

              j'aimerais savoir comment dois je transférer  l'information par modbus pour une seul sonde a un automate ?  :) :) 

              Merci une autre fois 

              Qui sera le maitre? L'arduino ou l'automate? En principe, ce devrait être l'automate.

              Il existe une bibliothèque modbus pour arduino.

              • Partager sur Facebook
              • Partager sur Twitter
                26 août 2019 à 9:45:40

                est ce que je dois modifier ce code 

                ou je dois réecrire un autre code si t as une idée  pour que je puisse l'adapter avec ce code la 

                oui l'arduino c'est l'esclave et le rasp et le maitre .

                #include <Wire.h>
                #include "SHTSensor.h"
                SHTSensor sht;
                // To use a specific sensor instead of probing the bus use this command:
                // SHTSensor sht(SHTSensor::SHT3X);
                void setup() {
                // put your setup code here, to run once:
                Wire.begin();
                Serial.begin(9600);
                delay(1000); // let serial console settle
                if (sht.init()) {
                Serial.print("init(): success\n");
                else {
                Serial.print("init(): failed\n");
                }
                sht.setAccuracy(SHTSensor::SHT_ACCURACY_MEDIUM); // only supported by SHT3x
                }
                void loop() {
                // put your main code here, to run repeatedly:
                if (sht.readSample()) {
                Serial.print("SHT:\n");
                Serial.print("  RH: ");
                Serial.print(sht.getHumidity(), 2);
                Serial.print("\n");
                Serial.print("  T:  ");
                Serial.print(sht.getTemperature(), 2);
                Serial.print("\n");
                else {
                Serial.print("Error in readSample()\n");
                }
                delay(1000);
                }

                • Partager sur Facebook
                • Partager sur Twitter
                  26 août 2019 à 11:40:05

                  ???

                  Ah, il y a une Raspberry désormais? Dans ton message précédents tu parlais d'un automate. Quel est le cahier des charges exactement?

                  Sinon, pour ton code, je ne vois pas le rapport avec Modbus ...

                  Çà ressemble juste à un code pour que l'arduino aille lire les mesures de température et d'humidité dans le capteur. Pourquoi n'essaies-tu pas pour voir si ça marche?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 août 2019 à 12:28:45

                    oui je suis entrain de voir plusieurs solution j'essaye de voir si c' est  possible de travailler avec  le raspberry  et annuler l'automate . oui c'est le code pour pouvoir lire la température et l'humidité . pouvez vous m'aidez a faire des modification dedans pour qui' il travaille avec le modbus 

                    je m'excude j ai pas bien expliqué ma situation. 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 août 2019 à 14:30:54

                      Ca va être très compliqué de faire ça à distance, et d'autant plus difficile pour ma part que ce n'est pas avec cette librairie que j'ai l'habitude de travailler. Je n'utilise en effet pas beaucoup l'arduino, mais plutôt la Raspberry Pi.

                      Pour la raspberry, il existe la bibliothèque libmodbus. On peut noter que la librairie Modbus de l'arduino s'appuie elle-même sur libmodbus.

                      Vu que tu n'as toujours pas de cahier des charges précis, on peut se poser la question sur l'intérêt d'utiliser Modbus, non parce que ce protocole est inadapté (au contraire), mais parce qu'il faut déjà un peu s'y connaitre, ce que tu n'indiques pas non plus.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      connecter 7 sonde sht85 avec arduino

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown