Problema ESP32 e libreria WIRE

Buon giorno a tutti…

Ho un piccolo grande problema in un mio progetto dove sto usando diverse librerie che funzionano ottimamente senza conflitti tra loro.

Ma ora devo trasferire delle variabili tra un NANO ed ESP 32 38 pin usando la libreria WIRE attraverso I2c.

Risultato non ho trasferimento dati tra i due processori LCD non funziona e BME 680 non viene riconosciuto.

In sintesi

NANO deve inviare dati di una variabile (x nel mio caso) attraverso I2c

ESP 32 deve riceve dati con I2c usando libreria WIRE

ESP 32 ha collegato con I2c una display LCD 24x4

ESP 32 ha collegato con I2c un BME 680

GND in comune alimentazione 5V.

ecc.

Tutti i servizi con I2c funzionano perfettamente senza libreria WIRE

Appena inserisco quest’ultima nel progetto non avviene alcun trasferimento tra NANO ed ESP 32.

Le istruzioni funzionano perfettamente tra NANO ed ESP 32 usando solo la WIRE ed eliminando l’utilizzo delle altre periferiche che sfruttano I2c

Collegamenti ridottissimi 10cm circa.

Attraverso la seriale mi viene aggiornata solo la variabile x del Loop con la stampa dello zero assegnata precedentemente, ma non aggiornata dal receiveEvent(int howMany).

Qualche idea? Devo usare una libreria diversa? Ci sono problemi noti con ESP 32 e la WIRE?

Ho già cercato un problema simile in rete, ma non ho trovato nulla per il mio caso.

Grazie in anticipo per l’attenzione.

#include <Wire.h>  // Library for I2C communication
#define I2C_DEV_ADDR 0x55
#include <LiquidCrystal_I2C.h>  // Library for LCD

//------------------------------------------------------------------------ SENSOR BME 680 //

#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "MutichannelGasSensor.h"
#include "Adafruit_BME680.h"

#define SEALEVELPRESSURE_HPA (1022.6)  //(1013.25)
float correzione_temperatura = 2.08;
float correzione_pressione = 12.5;
Adafruit_BME680 bme;

float temperature;
float pressure;
float humidity;
float gas_resistance;
float readAltitude;

//------------------------------------------------------------------------ SENSOR BME 680 //

//--------------------------------------------------------------------------- LCD DISPLAY //

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

int x = 0;

void setup() {
  //--------------------------------------------------------------------------- LCD DISPLAY //
  Wire.begin((uint8_t)I2C_DEV_ADDR);  // Inizializzazione I2c
  Wire.onReceive(receiveEvent);
  Serial.begin(115200);  // Inizializzazione Seriale

  // ---- S E T U P -    LCD     ----//

  lcd.backlight();           //                                                // Backlight ON LCD
  lcd.begin(20, 4);          //                                                // Inizializzazione Display LCD 20x4

  // ---- S E T U P -    LCD     ----//

  // ---- S E T U P - BME 680    ----//

  if (!bme.begin()) {
    Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
    //while (1);
  }
  // Set up oversampling and filter initialization
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150);  // 320*C for 150 ms

  // ---- S E T U P - BME 680    ----//
}


void loop() {
  BME_680();  //   aggiorna valori dei Sensor
  delay(100);

  Serial.print("x nel loop ");
  Serial.println(x);

  lcd.setCursor(0, 0);
    lcd.print(x);
}


void receiveEvent(int howMany) {
  x = Wire.read();
  Serial.print("x nella ricezione evento ");
  Serial.println(x);
}


//------------------------------------------------------------------------ SENSOR BME 680 //

void BME_680() {

  if (!bme.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }
  temperature = bme.temperature - correzione_temperatura;  // fattore di correzione
  pressure = (bme.pressure / 100.0) + correzione_pressione;
  humidity = bme.humidity;
  gas_resistance = bme.gas_resistance / 1000.0;
  readAltitude = bme.readAltitude(SEALEVELPRESSURE_HPA);

  // Obtain measurement results from BME680. Note that this operation isn't
  // instantaneous even if milli() >= endTime due to I2C/SPI latency.
  if (!bme.endReading()) {
    Serial.println(F("Failed to complete reading :("));
    return;
  }
}

Non credo che l'I2C possa lavorare contemporaneamente da master (per l'LCD ed il BME) e da slave per la comunicazione con l'Arduino.

Ciao, Ale.

Credo proprio di sì invece. È quello per cui è progettato. Probabilmente c’è qualche parte della libreria che porta al blocco per l’attesa di qualcosa.

Il protocollo I2C forse si, ma la libreria Wire o la inizializzi come "master" (senza un indirizzo) o la inizializzi come "slave" (con un indirizzo) ... non puoi inizializzarala contemporaneamnete per lavorare nelle due modalità.

Guglielmo

@patdepri:

Il cross-posting (anche tra lingue diverse) è proibito dal regolamento e tu stai discutendo di questo argomento già QUI ...

... questa discussione viene quindi chiusa.

Guglielmo

P.S.: Il motivo è che i messaggi doppi fanno perdere tempo alle persone che cercano di aiutare. Qualcuno potrebbe spendere parecchio tempo per scrivere una risposta dettagliata su una discussione, senza sapere che qualcun altro ha già fatto lo stesso in un altra identica/simile discussione.