TCA9548A compatibilità con wemos d1 mini o esp32

Buongiorno, ho questo multiplexer x
con protocollo i2c per effettuare letture da sensori bme280, ma quando avvio il programma dopo la prima lettura va in eccezione per poi riavviarsi .
Ho fatto dei test con un wemos d1 mini e con un esp 32 ma nulla , qualcuno si è imbattuto in questo problema.

Allego programma

  1. /*********

* #include <Wire.h>

6. #include <Adafruit_Sensor.h>

7. #include <Adafruit_BME280.h>

* #define SEALEVELPRESSURE_HPA (1022)

* Adafruit_BME280 bme1; // I2C

8. //Adafruit_BME280 bme2; // I2C

9. //Adafruit_BME280 bme3; // I2C

10. Adafruit_BME280 bme4; // I2C

* // Select I2C BUS

11. void TCA9548A(uint8_t bus){

12. Wire.beginTransmission(0x70); // TCA9548A address

13. Wire.write(1 << bus); // send byte to select bus

14. Wire.endTransmission();

15. }

* void printValues(Adafruit_BME280 bme, int bus) {

16. TCA9548A (bus);

17. Serial.print("Sensor number on bus");

18. Serial.println(bus);

19. Serial.print("Temperature = ");

20. Serial.print(bme.readTemperature());

21. Serial.println(" *C");

* Serial.print("Pressure = ");

22. Serial.print(bme.readPressure() / 100.0F);

23. Serial.println(" hPa");

* Serial.print("Approx. Altitude = ");

24. Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));

25. Serial.println(" m");

* Serial.print("Humidity = ");

26. Serial.print(bme.readHumidity());

27. Serial.println(" %");

* Serial.println();

28. }

* void setup() {

29. Serial.begin(115200);

* // Start I2C communication with the Multiplexer

30. Wire.begin();

* // Init sensor on bus number 2

31. TCA9548A(2);

32. if (!bme1.begin(0x76)) {

33. Serial.println("Could not find a valid BME280 sensor on bus 2, check wiring!2");

34. while (1);

35. }

36. Serial.println();

37. /*

38. // Init sensor on bus number 3

39. TCA9548A(3);

40. if (!bme2.begin(0x76)) {

41. Serial.println("Could not find a valid BME280 sensor on bus 2, check wiring!");

42. while (1);

43. }

44. Serial.println();

* // Init sensor on bus number 4

45. TCA9548A(4);

46. if (!bme3.begin(0x76)) {

47. Serial.println("Could not find a valid BME280 sensor on bus 2, check wiring!");

48. while (1);

49. }

50. Serial.println();

51. */

52. // Init sensor on bus number 5

53. TCA9548A(5);

54. if (!bme4.begin(0x76)) {

55. Serial.println("Could not find a valid BME280 sensor on bus 2, check wiring!5");

56. while (1);

57. }

58. Serial.println();

59. }

* void loop() {

60. //Print values for sensor 1

61. printValues(bme1, 2);

62. // printValues(bme2, 3);

63. //printValues(bme3, 4);

64. printValues(bme4, 5);

65. delay(5000);

66. }

Si prega di utilizzare la lingua inglese nella parte inglese del forum. La domanda è stata spostata nella parte italiana del forum.

@minixium:

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

P.S.: Attenzione, non è la prima volta che la cosa succede ... Al ripetersi l'account potrebbe venir sospeso.

Mi scuso per la disattenzione, solo che ho messo il traduttore in lingua originale non soffermandomi se ero nella sezione giusta

Se vuoi che qualcuno ti dia una mano con il tuo codice, devi rendergli la cosa semplice.
Il tuo codice formattato in questo modo e con i numeri di riga all'inizio è praticamene illegibile.

Comunque il problema dovrebbe essere nella funzione void printValues(Adafruit_BME280 bme, int bus) dove hai definito come primo parametro una copia dell'istanza della classe Adafruit_BME280 mentre poi in realtà passi alla funzione istanze già definite (bme1 e bme4).
Non puoi fare in questo modo, ma devi passare un puntatore all'istanza di Adafruit_BME280 o in alternativa puoi passare l'argomento per riferimento invece che per valore.

void printValues(Adafruit_BME280 & bme, int bus)

Questo il codice formattato e senza numeri di riga:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1022)

Adafruit_BME280 bme1; // Sensore BME280 su I2C
Adafruit_BME280 bme4; // Sensore BME280 su I2C

// Seleziona il bus I2C sul TCA9548A
void TCA9548A(uint8_t bus) {
  Wire.beginTransmission(0x70); // Indirizzo del TCA9548A
  Wire.write(1 << bus);         // Seleziona il bus
  Wire.endTransmission();
}

// Stampa i valori letti dal sensore BME280
void printValues(Adafruit_BME280 &bme, int bus) {
  TCA9548A(bus);
  Serial.print("Sensore sul bus ");
  Serial.println(bus);
  
  Serial.print("Temperatura = ");
  Serial.print(bme.readTemperature());
  Serial.println(" °C");

  Serial.print("Pressione = ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa");

  Serial.print("Altitudine approssimativa = ");
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");

  Serial.print("Umidità = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");

  Serial.println();
}

void setup() {
  Serial.begin(115200);
  Wire.begin();

  // Inizializza il sensore BME280 sul bus 2
  TCA9548A(2);
  if (!bme1.begin(0x76)) {
    Serial.println("Impossibile trovare un sensore BME280 valido sul bus 2, controlla il cablaggio!");
    while (1);
  }

  // Inizializza il sensore BME280 sul bus 5
  TCA9548A(5);
  if (!bme4.begin(0x76)) {
    Serial.println("Impossibile trovare un sensore BME280 valido sul bus 5, controlla il cablaggio!");
    while (1);
  }

  Serial.println();
}

void loop() {
  printValues(bme1, 2);
  printValues(bme4, 5);
  delay(5000);
}

Ciao grazie per avermi risposto , spero di trovarmi nella giusta sezione "lingua Italiana , perchè non sono riuscito a capire ......
Comunque ho corretto quella routine me l'errore persiste

Perdona, ma nel mio post ti ho dato il link diretto alla sezione Italiana del forum ... Perché non te lo memorizzo così ci arrivi direttamente? :slight_smile:

Guglielmo

Prova a mettere il messaggio di errore che ottieni.

Ciao cotestatnt , rivisto attentamente tutto il tuo codice ma mi continuava a dare errore , riavviato il tutto e ti posso finalmente dire che funziona , ti ringrazio , quindi l'errore era dovuto che i 2 bme1 e bme4 erano già instanziati ?
Per mia conoscenza dove posso vedere qualche esempio per capire i puntatori o i passaggi di argomento o riferimento