Anomalia sensore BME280

Ciao a tutti
Ho realizzato una stazione meteo, in funzione da molti mesi senza alcun problema, utilizzando una scheda Esp32.
Da oggi però i dati ricevuti dal sensore BME280 hanno iniziato a registrare problemi: prima ho iniziato a ricevere valori di temperatura di circa 169 gradi fissi, pressioni negative e umidità a 100.
Ho provato quindi a sostituire il sensore con uno nuovo senza risoluzione.
Ho provveduto a rimettere il sensore originario, a verificare i cablaggi e l'alimentazione, e adesso come valori di temperatura, umidità e pressione ricevo sempre 0.
Cosa può essere successo?
Non riesco a capire la causa e a risolvere quindi il problema.

Grazie mille

Aggiungo che ho provato a rimuovere la scheda Esp32 dalla breakout board e l'ho rimessa, e ora il sensore invece di registrare sempre 0 per i tre valori di temperatura umidità e pressione, registra circa 92 gradi, 100% umidità e una pressione apparentemente corretta.

Non riesco a capire come mai questi problemi dopo mesi di corretto funzionamento.

Sembra un problema di cablaggio

Possibile ossidazione dei contatti di dove era inserito il modulo ESP32.

Guglielmo

Ho provveduto ieri sera a spruzzare dello sprai per riattivazione e anti ossidazione contatti, dopo alcune ore senza risultati è ricominciato a funzionare tutto di nuovo correttamente.

Buongiorno,
torno dopo qualche tempo a scrivere in questo topic.
Continuando a riscontrare problemi di ossidazione e contatti ho deciso di rendere il mio progetto più serio eliminando la breadboard e passando a una mille fori saldando i vari collegamenti.
Purtroppo, anche se utilizzo lo stesso identico codice funzionato per anni, e anche se ho utilizzato le stesse identiche schede ESP32 e BME280 (versione alimentata a 5V come indicato nel sito di acquisto e come ho sempre fatto e ha sempre funzionato), il sensore mi restituisce sempre valori NAN.

Ho provato a sostituire il sensore ed il problema persiste.

Ho verificato col tester ed il sensore riceve correttamente 5V in alimentazione.

Ho provato ad aggiungere &Wire nella parte di begin e ora ricevo solo valori nulli:

sensore.begin(0x76, &Wire);

Allora ho provato il seguente programmino per capire l'indirizzo del sensore (anche se avrebbe dovuto essere lo stesso di quando avevo la breadboard ovviamente):

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("I2C Scanner");

  for (byte address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    if (Wire.endTransmission() == 0) {
      Serial.print("I2C device found at address 0x");
      Serial.println(address, HEX);
    }
  }
}

void loop() {}

Il risultato del programma è il seguente:

invalid header: 0xffffffff
invalid header: 0xffffffff
invalid header: 0xffffffff
invalid header: 0xffffffff
invalid header: 0xffffffff
invalid header: 0xffffffff
e una serie infinita di punti di domanda.

Allora ho provato a eseguire un programma base che riporto di seguito:

/***************************************************************************
  This is a library for the BME280 humidity, temperature & pressure sensor
  Designed specifically to work with the Adafruit BME280 Breakout
  ----> http://www.adafruit.com/products/2650
  These sensors use I2C or SPI to communicate, 2 or 4 pins are required
  to interface. The device's I2C address is either 0x76 or 0x77.
  Adafruit invests time and resources providing this open source code,
  please support Adafruit andopen-source hardware by purchasing products
  from Adafruit!
  Written by Limor Fried & Kevin Townsend for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
 ***************************************************************************/

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

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

unsigned long delayTime;

void setup() {
    Serial.begin(9600);
    Serial.println(F("BME280 test"));

    bool status;
    
    // default settings
    // (you can also pass in a Wire library object like &Wire2)
    status = bme.begin();  
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    
    Serial.println("-- Default Test --");
    delayTime = 1000;

    Serial.println();

    delay(100); // let sensor boot up
}


void loop() { 
    printValues();
    delay(delayTime);
}


void printValues() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");

    Serial.print("Pressure = ");

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

    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");

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

    Serial.println();
}

Il risultato sono solo una serie infinita di punti di domanda a video.

Qualcuno saprebbe aiutarmi a identificare quale potrebbe essere il problema e quali altre operazioni potrei fare per provare a risolvere?

Grazie mille a tutti

Allora, uso normalmente o BME280 con ESP32 ... questo è quello che includo ad inizio programma:

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

... come vedi usa la libreria di Adafruit e non ho alcun problema.

Condidera che, in Adafruit_BME280.h sono definite alcune cose:

#define BME280_ADDRESS (0x77)                               // Primary I2C Address
#define BME280_ADDRESS_ALTERNATE (0x76)                     // Alternate I2C Address
bool begin(uint8_t addr = BME280_ADDRESS, TwoWire *theWire = &Wire);

... e che per alcuni BME280 comprati su AliExpress ho dovuto, nel setup() inizializzarli così:

uint8_t    bme_Status      = 0;
...
bme_Status = bme.begin ( BME280_ADDRESS_ALTERNATE );

... utilizzado l'indirizzo I2C alternativo.

Per il resto nulla di particolare. Uso delle WeMos D1 Mini con ESP32 (NO ESP8266) e le impostazioni dell'IDE sono:

Per i pin I2C uso il default, GPIO22 per SCL e GPIO21 per SDA ...

Guglielmo

Ti ringrazio per queste risposte.
Confermo che uso le tue stesse identiche librerie, anche perchè prima di passare dalla breadboard alla millefori funzionava tutto perfettamente.

Provo ad andare per gradi, ho testato il seguente nuovo programma reperito in rete per intanto capire quale è l'indirizzo corretto del sensore:

 // --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    https://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

Il programma mi restituisce sempre No I2C devices found.

Sul sensore arrivano correttamente i 5V e i due pin I2Csono collegati come da tue indicazioni GPIO22 per SCL e GPIO21 per SDA.

Se non rileva il sensore a cosa altro può essere dovuto?
Preciso che se tocco il sensore, è bollente, non penso sia normale, mi confermate? Può essere di aiuto per individuare il problema?

Grazie mille

Sembra proprio un problema di cablaggio

Direi proprio che lo hai trovato

Prima di smontare tutto fai una bella analisi
Controlla tutti i cablaggi (che mi sembra siano solo 4) scriviteli e controllali con uno schema sicuro

Se smonti tutto senza capire il perché puoi scommetterci che ti ricapita

Male non sarebbe un paio di foto, a futura memoria

Non vedo nessun link al modulo con il sensore ... ci fai vedere QUALE modulino stai utilizzando?

E magari, metti anche uno schema del cablaggio completo delle alimentazioni.

Guglielmo

Il sensore che sto utilizzando è il seguente:

https://www.amazon.it/dp/B0CP7WHD4H?ref=ppx_yo2ov_dt_b_fed_asin_title

Allego anche qualche foto per mostrare i collegamenti.



Le 'specifiche' di Amazon dicono che Vcc può essere 1.8/5.0 V, lo schema mostra 3.3V, il sensore è bollente, VIO è settato uguale a Vcc, quindi se non soffre il sensore soffre l'ESP32.

Ciao, Ale.

Come ben visibile nello schema che è riportato su Amazon, NON c'è alcun regolatore di tensione e, come ben specificato nel datasheet del BME280 la Vcc massima è 3.6V ... quindi, SE quello è lo schema, è una bojata che quelle schedine possano lavorare a 5V !!!

Verificare SEMPRE gli schemi e datasheet e NON fidarsi mai di ciò che dicono i vari venditori su Amazon ed altrove!

Detto questo, su AliExpress si trova una versione che, sul retro della scheda, monta un LDO per alimentare il tutto a 5V ... fai una foto fronte/retro del tuo sensore così vediamo ... :roll_eyes:

Foto retro con LDO

Guglielmo

P.S.: Comunque, se il sensore scotta ... è andato ... :confused:

Ecco le foto del sensore.


Quindi devo alimentarlo a 3.3 V?

Grazie mille

In teoria quello in foto è come la versione di AliExpress (e quindi lo schema su Amazon NON corrisponde :angry:) ed è presente il LDO, quindi ... dovrebbe poter andare anche a 5V ...

... quello che mi preoccupa è quel "Logic Level Shifter" ... perché potrebbe portare i segnali a 3.3V del BMP a 5V e ... il ESP32 NON sarebbe affatto contento !!!

Alimenta il tutto a 3.3V e dimentica i 5V !

Guglielmo

Ok provo a sostituire il sensore e a alimentarlo a 3.3V.
Senza dover rifare troppo il progetto posso portare la tensione da 5V a 3.3V con una resistenza prima del sensore?
In caso affermativo, che valore di resistenza mi consigliate?

Grazie mille

NO, usa i 3.3v che sicuramente sono presenti sulla scheda ESP32 (l'ESP lavora a 3.3V, quindi ... ci sono).

Guglielmo

Buongiorno,
ho seguito i vostri consigli e alimentando a 3.3V un sensore completamente nuovo la stazione meteo ha ripreso a funzionare correttamente.

Verso le 6 di questa mattina però il sensore è andato in tilt e ha iniziato a registrare valori costanti e totalmente errati.

Riavviando la stazione meteo il sensore ha iniziato a restituire sempre valori pari a zero...

Ecco una foto del problema.

A cosa può essere dovuto?
Non può essere un problema di contatti, è tutto nuovo e stavolta tutto saldato, senza cavi volanti o bread board.

Grazie mille

Confermo purtroppo che il sensore anche dopo diversi riavvii continua a restituire sempre valori nulli.
Dopo 7 ore di funzionamento perfetto tutto d'un tratto non funziona più.

Sinceramente non capisco più come intervenire.

Mah ... SE i collegamenti sono esatti ed ora stai alimentando a 3.3V ... posso solo immaginare che si tratti di "scarti di produzione" che cessano di funzionare in tempi brevi :roll_eyes:

Guglielmo