ESP utilisation de 2 bus I2C

Bonjour,
La famille ESP ne disposant pas d'interface I2C hardware, je souhaitais utiliser 2 bus I2C soft. Pour mon test, j'ai fait un petit programme d'évaluation mais il ne fonctionne pas comme prévu.
Le seul bus fonctionnel est le Wire2.

#include <Arduino.h>
#include <Wire.h>
#include <SparkFun_PCA9536_Arduino_Library.h>

#define SDA1 5
#define SCL1 4
#define SDA2 2
#define SCL2 14
#define VERT 0
#define ORANGE 1
#define ROUGE 2
#define ATTENTE 500

PCA9536 io;
PCA9536 io2;

TwoWire Wire2;

void setup() {
  Serial.begin(115200);
  Serial.println("\n\nPCA9536 example");

  Wire.begin(SDA1, SCL1);
  Wire2.begin(SDA2, SCL2);

  // Initialize the PCA9536 with a begin function
  if (io.begin() == false){
    Serial.println("PCA9536 not detected. Please check wiring. Freezing...");
    while (1)
      ;
  }
  if (io2.begin() == false){
    Serial.println("PCA9536 not detected. Please check wiring. Freezing...");
    while (1)
      ;
  }

  for (int i = 0; i < 4; i++){
    // pinMode can be used to set an I/O as OUTPUT or INPUT
    io.pinMode(i, OUTPUT);
    io2.pinMode(i, OUTPUT);
  }

  for (int i = 0; i < 4; i++){
    //pinMode can be used to set an I/O as OUTPUT or INPUT
    io.pinMode(i, OUTPUT);
    io2.pinMode(i, OUTPUT);
  }

  for (int i = 0; i < 4; i++){
    io.write(i, LOW);
    io2.write(i, LOW);
  }
  for (int i = 0; i < 4; i++){
    io.write(i, LOW);
    io2.write(i, LOW);
  }
}

void loop() {
  io2.digitalWrite(VERT, HIGH);
  delay(ATTENTE);
  io2.write(VERT, LOW);
  delay(ATTENTE);
  io.digitalWrite(ORANGE, HIGH);
  delay(ATTENTE);
  io.write(ORANGE, LOW);
  delay(ATTENTE);
  io.digitalWrite(ROUGE, HIGH);
  delay(ATTENTE);
  io.write(ROUGE, LOW);
  delay(ATTENTE);
}

J'ai du loupé quelque chose. Peut être une piste ?

Bonjour

Un exemple ici si ça peut servir (je n'ai pas testé)
https://quadmeup.com/esp32-and-multiple-i2c-buses/

Merci @al1fch
J'avais testé quelque choses de similaire mais non opérationnel.
Je vais tester cet exemple pour voir si cela fonctionne

D'après le .h de la librairie SparkFun_PCA9536_Arduino_Library., begin() est défini ainsi

bool begin(TwoWire &wirePort = Wire);

donc, tu devrais avoir:

if (io.begin() == false){ // connect IO to Wire

puis

if (io2.begin(Wire2) == false){ // connect IO2 to Wire2

Merci @fdufnews
Je viens de tester. On a le même comportement, il n'y a que Wire2 qui fonctionne.
C'est le dernier wire déclaré avec begin qui reste actif.

Pour que cela fonctionne, il faut réinitialiser Wire ou Wire2 par .begin(SDA, SCL) ou .begin(SDA1, SCL1)
Un peu lourd mais je n'ai rien trouvé d'autre. Si vous avez une autre solution, je suis preneur.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.