[RISOLTO] Problemi con il BME280 - tutti i valori sono nan

Buongiorno a tutti,
sto cercando di far funzionare il mio sensore BME280 con una scheda Arduino Mega.
Essendo che il sensore in questione comunica tramite I2C, ho effettuato i collegamenti in questo modo, con a sinistra il nome dei pin del BME e a destra il nome dei pin dell'Arduino:

  1. Vin -> 3.3V
  2. GND -> GND
  3. SCL -> SCL 21
  4. SDA -> SDA 20

Per migliore chiarezza, ho disegnato il diagramma su Fritzing, che allego.

Questo è invece lo sketch che ho usato (al 99.9% è quello standard di test della libreria Adafruit per il BME, senonchè ho modificato il begin, specificando la porta 0x76 dopo aver fatto uno scan I2C):

/***************************************************************************
  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
  See the LICENSE file for details.
 ***************************************************************************/

#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);
    while(!Serial);    // time to get serial running
    Serial.println(F("BME280 test"));

    unsigned status;
    
    // default settings
    delay(50);
    status = bme.begin(0x76);  
    // You can also pass in a Wire library object like &Wire2
    //status = bme.begin(0x76, &Wire2)
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
        Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
        Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
        Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
        Serial.print("        ID of 0x60 represents a BME 280.\n");
        Serial.print("        ID of 0x61 represents a BME 680.\n");
        while (1) delay(10);
    }
    
    Serial.println("-- Default Test --");
    delayTime = 1000;

    Serial.println();
}


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 problema è che non ricevo alcun dato, ogni stampa mi ritorna soltanto 'nan'. A cosa può essere dovuto?

Vedo alcuni problemi ...
... Arduino lavora a 5V e Arduino MEGA, credo una delle poche schede Arduino ad averle, ha le resistenze di pull-up del bus I2C integrate, il che significa che porta su SCL ed SDA 5V.

Ora ... io vedo che tu alimenti il BME280 a 3.3V ... non credo sia salutare dargli 5V sui pin del I2C ... ::slight_smile:

Che scheda con il BME280 hai? metti un link che vediamo le caratteristiche ...

Guglielmo

Questo è il BME che ho acquistato. Dice effettivamente che lavora da 1.8 a 3.6V, quindi io lo alimento con 3.3V.

Si, ma se vedi bene il loro esempio, per i pin SCL ed SDA usano ... un traslatore di livelli ...


... quel modulo blu che da un lato è alimentato a 5V e dall'altro a 3.3V ... ::slight_smile:

Guglielmo

https://www.arduiner.com/it/convertitori/convertitori-livello/6693-convertitore-di-livello-logico-4-canali-iic-i2c-bidirezionale-da-5v-a-33v-modulo-per-arduino-3809200638122.html?search_query=traslatore+livello&results=274

Quindi questo potrebbe fare al caso mio? Perdonami ma a livello elettronico sono una schiappa. Ho conoscenze prettamente informatiche, ma tutti questi dettagli sulla tensione spesso mi sfuggono perchè non sono abituato a farci caso.

Si, se funziona (... visto il prezzo :smiley:), dovrebbe andare bene ... :wink:

Guglielmo

... personalmente, per adattare i livelli del bus I2C, se proprio devo, uso oggetti pensati apposta per tale bus, come QUESTO, ma comunque, anche quello che hai scelto tu, avendo sia lato BMP che lato Arduino le resistenze di pull-up presenti, non dovrebbe dare problemi.

Guglielmo

Anche nel mio link vedo la dicitura I2C, solo che, come dici tu, costa molto poco, quindi magari non è fatto per durare a lungo XD poco male, perchè non sto facendo un progetto destinato a durare. Comunque ti aggiornerò non appena mi arriva il componente. Spero tanto che il problema sia effettivamente questo. Nel frattempo pensi che potrei testare il mio BME in modo diverso? Ho anche un Arduino UNO, che non ha le uscite dedicate per l'I2C, però penso che comunque il problema dei 5V sia identico.

foobrizio:
... Ho anche un Arduino UNO, che non ha le uscite dedicate per l'I2C, però penso che comunque il problema dei 5V sia identico.

Attento che, su Arduno UNO, le usite I2C, anche se riportate separatamente, sono comunque in parallelo ai due pin A4 (SDA) ed A5 (SCL) e NON sono una cosa separata, quindi, quando si usa I2C, comunque NON si può usare A4 ed A5.

Guglielmo

foobrizio:
... Spero tanto che il problema sia effettivamente questo ...

... NON è detto sia solo questo (che comunque è meglio risolvere per evitare danni al modulo causati dai 5V) ... ma intanto sistema la cosa e poi proseguiamo a capire cosa altro magari non va ... ::slight_smile:

Guglielmo

Nel frattempo sto testando il BME con una scheda Raspberry, sfruttando il fatto che su quella scheda i GPIO funzionano a 3.3v. Beh, diciamo che sto avendo dei comportamenti alquanto strani, infatti ho scritto a riguardo anche sul forum Raspberry (non so se posso mettere qui il link di quella discussione).

foobrizio:
... non so se posso mettere qui il link di quella discussione ...

... si, certo, nessun problema, anche se ... se ci dici cosa stai riscontrando, facciamo prima ;D

Guglielmo

Beh, sostanzialmente mi sta ritornando sempre gli stessi valori ogni volta che lo uso. è dalle 6 e mezza del pomeriggio che in stanza mia ci sono 22.03 °C ed un' umidità dell' 85.89% ahahahha.
Sto cercando di capire se c'è un errore nella configurazione del mio Raspberry...ma in pratica questo sensorino si sta rivelando una condanna.

Ok, adesso sembra funzionare. Sto usando un altro script rispetto al precedente. Ora ho 25 °C ed un'umidità del 64%, ma soprattutto sono valori che cambiano col tempo. Quindi mi viene da concludere dicendo che il sensore è fortunatamente funzionante.

Ok, è arrivato il logic level shifter. Purtroppo, utilizzandolo, il BME non funziona comunque, anzi, addirittura non viene rilevato se eseguo l'i2c_scanner. Sto pensando di comprare un nuovo sensore BME280 che regge i 5V, così da non avere problemi

Sicuro di aver collegato il logic level shifter nella maniera corretta ?

Hai messo le resistenze di pull-up ? ... perché ora hai due sezioni separate.

Hai verificato che il traslatore sia ben collegato e che funzioni bene? Dando high o low sul lato 5V devi avere lo stesso comportamento lato 3.3V e viceversa ...

Guglielmo

Non so cosa siano le resistenze di pull-up, ma ho copiato lo stesso circuito fornito da AzDelivery, quello che mi hai inviato nei primi post. Ho usato la stessa resistenza (è quella la resistenza di pull-up?), ma non ha funzionato. L'unica differenza tra il mio circuito e quello inviato da AzDelivery è che io ho usato direttamente i pin di Arduino dedicati all'i2c, piuttosto che i pin analogici A4 e A5.

Ho misurato i vari poli con il tester, ho rilevato comportamenti "strani" (almeno per me che non ho esperienza in elettronica) sui due capi dei 2 segnali i2c, l'sck e l'sda. Nello specifico, uno dei due segnali mi risultava a 1.8V dove mi aspettavo i 3.3V e a 4V dove mi aspettavo i 5V. Non so se ciò ha potuto influire sull'esito.

I pin analogici che nomini sono equivalenti al bus I2C solo su alcune schede, ma NON sulla Mega.

Per il traslatore, dagli le dovute alimentazioni (5V, 3.3V e GND), dopo di che con un filo colleghi uno dei pin lato 5V prima a 5V e poi a GND e verifichi che sul corrispondente pin lato 3.3V tu abbia 3.3V e GND, poi fai il contrario, dai su un pin lato 3.3V prima 3.3V e poi GND e verifichi che sul corrispondente pin lato 5V tu abbia prima 5V e poi GND.

Le resistenze di pull-up sono resistenze da 4.7K che devi mettere tra SCL e Vcc e tra SDA e Vcc ... ovviamente, lato 3.3V vanno verso i 3.3V, lato 5V vanno verso i 5V.

Guglielmo

... altrimenti prendi QUESTO che lavora a 5V e segui pedissequamente il loro tutorial che trovi su quella pagina.

Guglielmo