connecter 7 sonde sht85 avec arduino en utilisant le mux tca9548a (BUS I2C)

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 modifier le code est l’adapter avec mon besion ?

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

je veux être orienté sur le bon sens Merci les amis :slight_smile: :slight_smile: :slight_smile:

Bonjour,

Il faut sélectionner la voie sur le tca9548a avant d’accéder au sht85

#define TCAADDR 0x70

void tcaselect(uint8_t i) {
 if (i > 7) return;

 Wire.beginTransmission(TCAADDR);
 Wire.write(1 << i);
 Wire.endTransmission();  
}

Voir ici

Peut être qu’il faut instancier 7 sht.

le problème c'est que le code que j'ai trouvé ,il n y as pas la possibilité de changer l’adresse je pense qu'il travail automatiquement. je veux un petit exemple du code de sht85 si c est possible pour que je puisse savoir comment manipuler les adresses

Tu ne changes pas l’adresse.
Tu sélectionnes la voie du tca9548a puis tu accèdes au sht à son adresse normale.

#include <Wire.h>

#include <SHTSensor.h>

#define TCAADDR 0x70
const byte NBSENSORS = 7;

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(115200);
  delay(1000); // let serial console settle

  for (byte i = 0; i < NBSENSORS; i++)
  {
    tcaselect(i);     // sélectionne le sht qui va bien

    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 (byte i = 0; i < NBSENSORS; i++)
  {
    tcaselect(i);

    Serial.print("SHT: ");
    Serial.println(i);
    if (sht.readSample()) {
      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);
}

void tcaselect(uint8_t i) {
  if (i > 7) return;

  Wire.beginTransmission(TCAADDR);
  Wire.write(1 << i);
  Wire.endTransmission();
}

s'il vous plais j'ai voulu tester le code il y as une erreur " 'tcaselect' was not declared in this scope "

Merci kamill pour votre aide

Oui, on peut connecteur jusqu’à 8 tca9548a.
La sélection d’adresse se fait avec les pins A0-A2

monsieur kamil le code qaue vous m avais donnés ca se compile
donc je peux commander le matériel pour commancer la realisation ?

Oui, il faut se lancer.
Qu'est ce que tu veux faire avec tes 7 sondes? Le bus I2C doit être assez court.

je veux mesurer la température et l'humidité et pour faire cela j'ai besoin de plus de 7 sonde . doit etres equipé de 20-30 sonde le min

dans les environs de combien la longueur de bus doit êtres ?

Ca dépend de l'environnement et de la vitesse, mais c'est de l'ordre de 1m.
Il existe des amplis qui permettent de prolonger le bus sur plusieurs mètres voire plusieurs dizaines de mètres.

pour optimiser mon travail vous pensez combien de tca9548A dois je utiliser pour le maximum de sonde dans un 1 seul arduino ?

Sur chaque tca9548a on peut connecter 8 capteurs. Tu fais la division.
Il faut peut-être prévoir une alimentation adéquate.

d'accord Merci bien Kamill ,tu m'as vraiment aidée

en tout cas ce sujet est loin d’êtres résolu ,des que je fait la manip je te tiendrai au courant

Le bus I2C a été conçu pour des liaisons entre circuit intégrés situé sur la même carte de circuit imprimé.
Il permet de faire plus de la dizaine de cm comme prévu initialement mais il ne faut pas trop lui demander.

Avant de commander l'ensemble du matériel (cela dépend du prix) je pense que faire des tests en grandeur nature sur les différentes longueurs serait plus prudent.

Ces tests peuvent être fait avec n'importe quel circuit I2C comme par exemple une simple horloge RTC DS3231 qui servira toujours et que l'on trouve à 1 € (Ebay, Aliexpress). Il restera quelques petit pourcents d'incertitude par rapport aux circuits intégrés définitifs mais les risques seront très faibles.

kamill:
Ca dépend de l'environnement et de la vitesse, mais c'est de l'ordre de 1m.
Il existe des amplis qui permettent de prolonger le bus sur plusieurs mètres voire plusieurs dizaines de mètres.

Les fréquences normées sont 100 kHz et 400 kHz, mais ce n'est qu'une recommandation.
Il est possible de baisser la fréquence en dessous de 100 kHz, la bibliothèque ("~Wire~") peut le faire mais ce n'est pas documenté.
On pourra voir cela si tu as besoin de descendre en dessous de 100 kHz valeur par défaut de ~Wire~

qu es ce que tu t en pense après avoir vu le système

Je pense rien, je ne comprend pas comment le câblage sera fait.

Tout ce qui compte c'est que de part son principe l' I2C ne supporte pas les longueurs de fil.

Qu'elle est la limite de la longueur de fil : je ne peut pas le dire cela dépend trop de la façon dont le câblage sera fait.
Quand on se place en limite de système il n'y a que l'expérimentation qui compte.
Le gros problème de base de l'I2C c'est la bidirectionnalité de la liaison SDA.

Ce qui gêne dans l'I2C c'est :

  • du fait que la sortie est en schéma émetteur commun la résistance équivalente du générateur de signal est égale à la résistance équivalente des résistances réparties sur SDA (ou SCL).
    Le schéma est complexe parce que toutes les résistances ne sont pas au même endroit mais on peut estimer cette résistance équivalente à plusieurs kilo ohms.
  • il y a de la capacité (entrées de CI et capa dans le câble) et plus le câble est long plus il présente de la capacité parasite.

Le résultat forme un circuit RC qui avachi le temps de montée (descente) des signaux et il devient impossible de distinguer un état haut d'un état bas.

C'est pour cela que pour "améliorer" la reconnaissance des signaux on dispose de trois moyens :

  1. circuit intégré "répéteur" qui remettent le signal en forme

  2. diminution des résistances sur SDA et SCL.
    Le temps de montée (ou de descente) dépend de la quantité T= RC.
    Au prix d'une augmentation de la consommation en diminuant Réquivalente sur SDA (SCL) on "redresse" les fronts.

  3. diminution de la fréquence : si on ne peut plus jouer sur le facteur T = RC on peut donner "plus de temps" au signal en diminuant la fréquence ce qui augmente la période.

Clairement tu vois qu'a part une expérimentation il est impossible de répondre dans ton cas d'utilisation.
Surtout que tu n'a fournis aucune information sur l'estimation des longueurs.

je peux utiliser
plusieurs carte arduino, donc surement je vais besoin de manipuler la fréquence pour pouvoir la baisser .

Peut être que je n'ai rien compris mais la fréquence de l'I2C n'a rien à voir avec le nombre de carte.
A propos de plusieurs cartes je rappelle que sur le bus I2C il ne peut y avoir simultanément qu'un seul maître.
S'il doit y en avoir plusieurs il faudra le gérer.

a propos d'estimation de longueur envions 1.5m .

Si tu as compris les limites de l'I2C c'est la longueur max qui aurait été intéressante.

Tous mes propos précédents était pour bien te faire comprendre que ton application est en limite de possibilité de l'I2C et que les solutions ne pourront être que du cas par cas.

Si je pars du principe que chaque voie du TCA est indépendante et ne recevra qu'un seul module SHT85 avec une résistance de 1k ohms sur SDA (SCL) cela "pourrait" bien se passer (avec 5 mA dans les transistors de sortie du TCA)
J'ai bien dit "pourrait" car jamais je n'affirmerai quoi que soit sur une utilisation en limite de performance.

Coté entrée TCA :
30 sondes par roue , sur le dessin je vois 2 roues plus ce qui peut sembler être des ventilateurs.
60 sondes font 8 TCA -> nombre max atteint.
Tu peux tenter de faire avec un nombre de composant minimal (8 TCA connectés sur l'I2C du micro, chaque TCA commandant 1 sondes et 4 emplacements de libres) .
Si les modules TCA sont pré-équipés avec une résistance sur SDA (SCL) la résistance équivalente sera la résistance d'un module divisé par le nombre de modules.
Coté négatif : les 8 TCA seront en parallèles sur l'I2C avec leur capa parasite --> expérimentation à prévoir.

Si 8 TCA reliés à l'I2C du microcontrôleur ne fonctionne pas je suis sec ou ce à quoi je pense tient de l'usine à gaz (multiplexeurs analogiques).
Il y a quand même la solution de placer "un ampli I2C" entre la carte micro et les 8 TCA, je n'ai jamais fait mais cela pourrai fonctionner.

Si tu peux te contenter de 56 sondes (7 TCA) tu pourrai envisager d'utiliser en tête un TCA "aiguilleur" vers les 7 TCA sur lesquels les 56 sondes sont raccordées. Chaque tronçon I2C étant alors limité à 50 cm et chaque tronçon étant à capacité parasite minimale.

on peux faire plusieurs carte par exemple chaque carte est connecté a un tca9548a

Je ne vois ce que cela vient faire là
Tu as 7 sht à connecter, un TCA en permet d'en connecter 8
Et si tu mets plusieurs cartes pour diminuer les longueurs il faudra bien que les cartes dialoguent entre elle. Comment elles le feront ?

Commence par faire des essais. Avec un emplacement "au mieux" de la carte et des TCA dans le système à contrôler.
Je commencerai par vérifier que cela fonctionne correctement avec le TCA positionné à raz de la carte microcontrôleur et la liaison la plus longue entre une voie du TCA et la sonde.
Si c'est bon il suffira d'ajouter les lignes une par une ou deux par deux ( pas la peine de tout câbler s'il faut tout recommencer).
Si c'est pas bon j'éloignerais progressivement les TCA de la carte micro pour diminuer celle entre la sortie TCA et la sonde.

Pour le câblage je préfère les paires torsadées ou carrément les quartes ( deux paires torsadées, torsadées ensemble).
Un fil d'une paire est le signal, l'autre fil la masse.
Une paire pour SCL et l'autre pour SDA.

C'est un peu contradictoire à ce que j'ai dit au sujet de la capa parasite mais pas tant que cela.
L'avantage d'une paire c'est qu'elle est parfaitement définie ( impédance caractéristique, résistance, capacité et inductance linéique) et qu'il n'y aura pas de mauvaises surprises si tu déplace la paire de 20 cm ce qui n'est absolument pas assuré avec des fils volants.

oui je comprend ce que vous avais dit , çà seras difficile de la réaliser ,tout d'abord je vais commencer par tester cas par cas pour voir les résultats

68tjs:
(8 TCA connectés sur l'I2C du micro, chaque TCA commandant 1 sondes et 4 emplacements de libres) .

j'ai pas bien compris cette partie " chaque TCA commandant 1 sonde et 4 emplacement de libre

vous pouvait m'expliqué si vous plait les emplacement pourquoi les laissé libre ?

Merci pour votre aide 68tjs

8 TCA avec 8 sorties font 64 sondes possibles
30 sondes par roue, deux roues font 60 sondes.

Il reste 4 emplacements de libre pour diverses utilisations

ah d'accord j'ai compris vraiment vous m'avais aidé 68tjs Merci infiniment :slight_smile:

Il suffit de déterminer le numéro du tca9548 et le numéro de voie en fonction du numéro du capteur

  byte nTca=i/8;        // numéro du boitier tca9548
  byte nVoie=i%8;       // numéro de la voie sur le tca9548

Ce qui donne le code suivant

#include <Wire.h>

#include <SHTSensor.h>

#define TCAADDR 0x70
const byte NBSENSORS = 60;

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(115200);
  delay(1000); // let serial console settle

  for (byte i = 0; i < NBSENSORS; i++)
  {
    tcaselect(i);     // sélectionne le sht qui va bien

    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 (byte i = 0; i < NBSENSORS; i++)
  {
    tcaselect(i);

    Serial.print("SHT: ");
    Serial.println(i);
    if (sht.readSample()) {
      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);
}

void tcaselect(uint8_t i) {
  byte nTca=i/8;        // numéro du boitier tca9548
  byte nVoie=i%8;       // numéro de la voie sur le tca9548

  Wire.beginTransmission(TCAADDR+nTca);
  Wire.write(1 << nVoie);
  Wire.endTransmission();
}