2 capteurs RVB TCS34725 avec un multiplexeur TCA9548A

Bonjour,

Voila je voudrais faire fonctionner deux capteurs de couleur TCS34725 avec un multiplexeur TCA9548A et stoker les valeurs RVB ( R0, V0, B0, R1, V1, B1 )

J'ai essayé de composer un programme avec ce que j'ai trouvé comme exemple mais visiblement j'ai déjà des erreurs de compilation alors que j'en suis qu'a l'initialisation....

Il me dit: variable or field 'TCA9548A' declared void

C'est le nom de mon sous programme, je sent bien une erreur de gros débutant, mais il est vrai que j'ai jamais utilisé de sous programme encore ( honte à moi )

(( Je me demande si ça serait pas plus simple de piloter le TCA9548A via ses entrées A0 A1 et A2,
si je mets A0=5v A1=0v A2=0v je sélectionne mon capteur 1 sur sda1 et scl1 et si je mets A0=0v A1=5v A2=0v je sélectionne mon capteur 2 sur sda2 et scl2 exact?? ))

voici mon programme : ( par avance merci à ceux qui pourront m'aider )

#include <Wire.h>
#include "Adafruit_TCS34725.h"
#include <SparkFun_I2C_Mux_Arduino_Library.h>



/* Example code for the Adafruit TCS34725 breakout library */

/* Connect SCL    to analog 5
   Connect SDA    to analog 4
   Connect VDD    to 3.3V DC
   Connect GROUND to common ground */



void setup(void) {
  Serial.begin(9600);
  while (!Serial);

  Wire.begin();

  

      // **** Initialisation capteur N°0 ****
      
      TCA9548A(0);  // ouverture du port 0 du multiplexeur à l'adresse 0x70 
      // initialisation du capteur N°0

      /* Initialise with default values (int time = 2.4ms, gain = 1x) */
      Adafruit_TCS34725 tcs = Adafruit_TCS34725();

      /* Initialise with specific int time and gain values */
      Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_614MS, TCS34725_GAIN_1X);

      delay(500);

      if (tcs.begin()) {
    Serial.println("Capteur N°0 disponible");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1);
  }
    

     

// **** Initialisation capteur N°1 ****
      
      TCA9548A(1);  // ouverture du port 0 du multiplexeur à l'adresse 0x70 
      // initialisation du capteur N°0

      /* Initialise with default values (int time = 2.4ms, gain = 1x) */
      // Adafruit_TCS34725 tcs = Adafruit_TCS34725();

      /* Initialise with specific int time and gain values */
      Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_614MS, TCS34725_GAIN_1X);

      delay(500);

      if (tcs.begin()) {
    Serial.println("Capteur N°1 disponible");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1);
  }
    

     

int R0 = 0; // Rouge capteur N°0 à zero
int V0 = 0; // Vert capteur N°0 à zero
int B0 = 0; // Bleu capteur N°0 à zero

int R1 = 0; // Rouge capteur N°1 à zero
int V1 = 0; // Vert capteur N°1 à zero
int B1 = 0; // Bleu capteur N°1 à zero



}

void loop(void) {
  uint16_t r, g, b, c, colorTemp, lux;

  tcs.getRawData(&r, &g, &b, &c);
  // colorTemp = tcs.calculateColorTemperature(r, g, b);
  colorTemp = tcs.calculateColorTemperature_dn40(r, g, b, c);
  lux = tcs.calculateLux(r, g, b);

  Serial.print("Color Temp: "); Serial.print(colorTemp, DEC); Serial.print(" K - ");
  Serial.print("Lux: "); Serial.print(lux, DEC); Serial.print(" - ");
  Serial.print("R: "); Serial.print(r, DEC); Serial.print(" ");
  Serial.print("G: "); Serial.print(g, DEC); Serial.print(" ");
  Serial.print("B: "); Serial.print(b, DEC); Serial.print(" ");
  Serial.print("C: "); Serial.print(c, DEC); Serial.print(" ");
  Serial.println(" ");
}


void TCA9548A(unit8_t bus){
  Wire.beginTransmission(0x70);
  Wire.write(1<<bus);
  Wire.endTransmission();
   
}

Bonjour kuzo64

Non, ces 3 pin sont faites pour sélectionner un TCA9548, ce qui te permet d'en avoir 8 dont le premier a l'adresse 0x70.

Pour sélectionner les sda1/scl1 ou sda2/scl2, c'est ta fonction void TCA9548A(unit8_t bus) qui le fait.

Pour ton erreur, pas encore trouvé :woozy_face:

Cordialement
jpbbricole

Merci Jpb😉

Je me disais aussi ça aurait été trop simple :sweat_smile:

Bonjour kuzo64

Ca doit pas être trop compliqué :wink:
Tu devrai, en premier, faire fonctionner un capteur sans le multiplexeur TCA9548

Ensuite inclure le multiplexeur.

Cordialement
jpbbricole

c'est ce que j'ai fait :grin:
J'ai réussi à faire fonctionner le capteur et j'ai eu des données cohérentes, par contre le multiplexeur, il se laisse pas faire le bougre :grimacing:

Post effacé
Oups j'ai écrit des bêtises je me suis trompé avec un autre capteur.

Ce montage, SDA et SCL est à déconnecter de l'Arduino et connecter sur un des ports du multiplexeur.

Il y en a, parfois, des têtus :wink:

Si tu charges le scanner i2c, vois tu l'adresse 0x70 de ton multiplexeur?
Si non montre moi comment tu as branché tout ça, fais une photo en gros plan.

Bonjour fdufnews

C'est possible, pour autant que l'on puisse changer l'adresse du capteur, physiquement, non?

Question a se poser, avec le multiplexeur, est il nécessaire de déclarer plusieurs instances du capteur, vu qu'il n'en est vu qu'un à la fois, sur le bus.

Cordialement
jpbbricole

Je commence a être perdu les gas loool, j'étais persuadé que les capteurs auraient la même adresse que j'étais obligé de passer par un multiplexeur.

Fdunews, au final il me faudra 6 capteurs RVB, tu penses qu'en fesant comme tu m'as montré je vais pouvoir accéder au 6 Capteurs??

Jpbbricole, pour le moment j'ai pas encore fait le câblage, je bloque sur mon programme qui ne veux pas se compiler

Au temps pour moi. Je me suis trompé.
J'ai effacé mon message.

C'est un TCS34725 dont l'adresse est fixée à 0x29 et il n'y a aucun pont pour en changer.

Cordialement
jpbbricole

Donc le programme du capteur fonctionne ou pas?

Si si le capteur seul fonctionne :+1:

OK!
Est ce que le TCA9548 est "visible" avec le programme de scacnner?

Si le capteur fonctionne et que le TCA9548 est "visible", à quel moment ça "coince"?

uint8_t au lieu de unit8_t passerait mieux.

Trois instances portant le même nom tcs ???
Il faudrait leur donner deux noms différents.

Beaucoup de variables inutiles en fin de setup(), et B0, B1 sont des constantes déclarées dans binary.h de la librairie ARDUINO, donc la compilation est impossible.

Merci Beaucoup hbachetti,

J'ai honte de moi pour le Unit :flushed: et merci pour le B0 et B1 :+1: je savais pas.

Normalement pour initialiser mes 2 captateurs, je dois ouvrir le port 0 initialiser le premier capteur qui est en sda0 et scl0 puis ouvrir le port 1 et initialiser le second capteur qui est en sda1 et scl1, c'est bien ça?? ( peut être en mettant tcs0 et tcs1 )

Oui, par exemple, s'il y a besoin de deux instances.

j'ai du mal a comprendre ce que sont les instances, ce sont des sous programmes??

je m'excuse d'avance pour mon manque de connaissances :face_with_peeking_eye:

j'ai remodelé mon programme mais c'est pas encore ça, lors de la compilation il me dit que tcs0 n'est pas déclaré, je pense que j'ai pas tout pigé :roll_eyes:

#include <Wire.h>
#include "Adafruit_TCS34725.h"
#include <SparkFun_I2C_Mux_Arduino_Library.h>
QWIICMUX myMux;



/* Example code for the Adafruit TCS34725 breakout library */

/* Connect SCL    to analog 5
   Connect SDA    to analog 4
   Connect VDD    to 3.3V DC
   Connect GROUND to common ground */



void setup(void) {
  Serial.begin(9600);
  while (!Serial);

  Wire.begin();

  if (myMux.begin() == false)
  {
    Serial.println("Mux not detected. Freezing...");
    while (1)
      ;
  }
  Serial.println("Mux detected");

      // **** Initialisation capteur N°0 ****
      
      TCA9548A(0);  // ouverture du port 0 du multiplexeur à l'adresse 0x70 

      
      // initialisation du capteur N°0


    Adafruit_TCS34725 tcs0 = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_614MS, TCS34725_GAIN_1X);  // initialisation du capteur N°0

      delay(500);

      if (tcs0.begin()) {
    Serial.println("Capteur N°0 disponible");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1);
  }
    

     

// **** Initialisation capteur N°1 ****
      
      TCA9548A(1);  // ouverture du port 1 du multiplexeur à l'adresse 0x70 
      
      // initialisation du capteur N°1

      Adafruit_TCS34725 tcs1 = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_614MS, TCS34725_GAIN_1X);    // initialisation du capteur N°1

      delay(500);

      if (tcs1.begin()) {
    Serial.println("Capteur N°1 disponible");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1);
  }
    


}

void loop(void) {

  TCA9548A(0);  // ouverture du port 0 du multiplexeur à l'adresse 0x70 
  uint16_t CR0, CV0, CB0, C0;

  tcs0.getRawData(&CR0, &CV0, &CB0, &C0);
  
  delay(500);


  Serial.print("R0: "); Serial.print(CR0, DEC); Serial.print(" ");
  Serial.print("V0: "); Serial.print(CV0, DEC); Serial.print(" ");
  Serial.print("B0: "); Serial.print(CB0, DEC); Serial.print(" ");
  Serial.print("C0: "); Serial.print(C0, DEC); Serial.print(" ");
  Serial.println(" ");

  delay(1000);


    TCA9548A(1);  // ouverture du port 1 du multiplexeur à l'adresse 0x70 
  uint16_t CR1, CV1, CB1, C1;

  tcs0.getRawData(&CR1, &CV1, &CB1, &C1);
  
  delay(500);


  Serial.print("R1: "); Serial.print(CR1, DEC); Serial.print(" ");
  Serial.print("V1: "); Serial.print(CV1, DEC); Serial.print(" ");
  Serial.print("B1: "); Serial.print(CB1, DEC); Serial.print(" ");
  Serial.print("C1: "); Serial.print(C1, DEC); Serial.print(" ");
  Serial.println(" ");

  delay(1000);
  
}


void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);
  Wire.write(1<<bus);
  Wire.endTransmission();
   
}

Bonjour,

tcs0 est défini dans le setup donc il n'existe que dans le setup
Tu dois le définir en global avant le setup. Idem pur tcs1.

Merci Kamill :grin:

je le défini comment ? comme une simple variable ?