BME280 température fantaisiste

Bonjour à tous,

J’ai installé une BME280 sur un nano, la sonde me renvoie 27 degrés quand il en fait 19 et elle m’affiche la pression sous cette forme 95155.62. il y a une possibilité pour déplacer le point pour avoir 951.5562 ?
d’avance, merci.

/******************************************************************************
I2C_and_SPI_Multisensor.ino
BME280 Arduino and Teensy example

******************************************************************************/

#include <stdint.h>
#include "SparkFunBME280.h"
#include "Wire.h"
#include "SPI.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//Global sensor object
BME280 mySensorA; //appellation pour le prog du cateur n°1
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup()
{
	

	
	
	
	//***Set up sensor 'B'******************************//

	//specify chipSelectPin using arduino pin names
	//specify I2C address.  Can be 0x77(default) or 0x76
//Indiquer si le cablage de la sonde "mySensorA est en I2C_MODE ou en SPI_MODE
	mySensorA.settings.commInterface = SPI_MODE;
  // si elle est en SPI_MODE on récupère les données sur le pin N°10
	mySensorA.settings.chipSelectPin = 10;
// si le cablage de la sonde "mySensorA est en I2C_MODE utiliser cette partie et invalider le spi_mode
  //mySensor.settings.commInterface = I2C_MODE;
  //mySensor.settings.I2CAddress = 0x76;
	mySensorA.settings.runMode = 3; //  3, Normal mode
	mySensorA.settings.tStandby = 0; //  0, 0.5ms
	mySensorA.settings.filter = 0; //  0, filter off
	//tempOverSample can be:
	//  0, skipped
	//  1 through 5, oversampling *1, *2, *4, *8, *16 respectively
	mySensorA.settings.tempOverSample = 1;
	//pressOverSample can be:
	//  0, skipped
	//  1 through 5, oversampling *1, *2, *4, *8, *16 respectively
    mySensorA.settings.pressOverSample = 8;
	//humidOverSample can be:
	//  0, skipped
	//  1 through 5, oversampling *1, *2, *4, *8, *16 respectively
	mySensorA.settings.humidOverSample = 1;
	
	
	
	//***Initialize the things**************************//
	Serial.begin(9600); 
	Serial.print("Program Started\n");
	Serial.println("Starting BME280s... result of .begin():");
	delay(10);  //Make sure sensor had enough time to turn on. BME280 requires 2ms to start up.
	//Calling .begin() causes the settings to be loaded


	Serial.print("Sensor A: 0x");
	Serial.println(mySensorA.begin(), HEX);

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialise l'écran à l'adreese  I2C addr 0x3C (pour le 128x32)
}

void loop()
{
	// affichage sur l'écran
  // Clear the buffer.
 display.clearDisplay();
 
 // text display tests
 display.setTextSize(1);
 display.setTextColor(WHITE);
 
 display.setCursor(0,0); //position du texte sur l'afficheur
 display.print("Temperature: ");  //texte qui s'affiche tel quel avant la variable
 display.print(mySensorA.readTempC(), 2); //affichage de la variable température
 display.print(" c"); //texte qui s'affiche tel quel apres la variable
 
 display.setCursor(0,8);
 display.print("Pression: ");
 display.print(mySensorA.readFloatPressure(), 2);
 
 display.setCursor(0,16);
 display.print("Altitude: ");
 display.print(mySensorA.readFloatAltitudeMeters(), 2);
 display.print(" m");
 
  display.setCursor(0,25);
 display.print("humidite: ");
 display.print(mySensorA.readFloatHumidity(), 2);
 display.print(" %");
 display.display();

 //fin d'affichage sur l'écran
 // début affichage sur le monitor série
	Serial.print("Temperature: "); //ce qui s'affiche tel quel
	Serial.print(mySensorA.readTempC(), 2); // valeur en sortie de sonde bme280
	Serial.println(" degrees C"); //ce qui s'affiche tel quel


	Serial.print("pression: ");
	Serial.print(mySensorA.readFloatPressure(), 2);
	Serial.println(" Pa");
	

	Serial.print("humidite: ");
	Serial.print(mySensorA.readFloatHumidity(), 2);
	Serial.println(" %");

 
 Serial.print("Altitude: ");
 Serial.print(mySensorA.readFloatAltitudeMeters(), 2);
 Serial.println("m");

	Serial.println();
	 // fin d'affichage sur le monitor série
	delay(1000);

}

Ca doit être un problème lié à la bibliothèque que tu utilises : essaye avec une autre.

 // si elle est en SPI_MODE on récupère les données sur le pin N°10
	mySensorA.settings.chipSelectPin = 10;

Je n'ai pas bien lu le programme mais ce commentaire : "on récupère les données sur la pin 10" montre une méconnaissance du fonctionnement du SPI.

En SPI il y a 4 signaux
N: 1 -> Horloge, toujours fournie par le maître
N: 2 -> MOSI qui veut dire Master Out Slave IN qui correspond aux messages (les ordres) que le maître envoie à l'esclave sélectionné
N: 3 -> MISO qui veut dire Master In Slave Out qui correspond aux messages que l'esclave sélectionné envoie au maître : C'est ce signal qui récupère les données envoyées par l'esclave.

N: 4 -> Chip Select, la pin 10
Tous les esclaves reçoivent les ordres du maître car tous les MOSI sont câblés en parallèle ainsi que, respectivement, tous les MISO.
Il faut bien indiquer quel esclave est concerné par l'ordre, c'est le rôle de la pin ChipSelect (la 10 sur un UNO).

Dans le cas où il n'y a qu'un seul esclave sur le SPI, Chipselect peut ne pas être utilisé. La pin 10 peut être récupérée pour autre chose à condition qu'elle soit en sortie, sinon si elle est en entrée et si elle reçoit un 0 le module SPI du micro passe du mode maître au mode esclave.
Dans le cas où il y a plusieurs esclaves connectés le premier peut être sélectionné par Chipselect et les autres doivent être sélectionnés individuellement par une pin numérique disponible

68tjs:

 // si elle est en SPI_MODE on récupère les données sur le pin N°10

mySensorA.settings.chipSelectPin = 10;




Je n'ai pas bien lu le programme mais ce commentaire : "on récupère les données sur la pin 10" montre une méconnaissance du fonctionnement du SPI.

Loin de moi l'idée de nier cette évidence ! (et merci pour tes explications)

Comme la préconisé lesept j'ai changé de librairie et j'ai perdu 5 degrés ce qui est plus proche de la réalité,
mais je n'arrive pas à remettre mon afficheur dans la boucle.
C'est quand même curieux que la BME280 utilisée avec la bibli SparkFunBME280.h, qui doit être utilisée par des milliers d'utilisateurs, renvoie des températures aussi éloignées de la réalité sans que personne ne fasse des bonds.. (j'ai changé de BME les résultats sont identiques)
Demain, je vais me brancher en I2C pour voir si sa change quelque chose.

En effet c'est bizarre d'avoir si peu de précision. Je ne vois pas ce que e changement de bus va changer à ce niveau. As-tu essayé ça ?

lesept:
En effet c'est bizarre d'avoir si peu de précision. Je ne vois pas ce que e changement de bus va changer à ce niveau. As-tu essayé ça ?

J'ai essayé, mais dans intervalle je suis aussi passé en i2c et surtout j'ai changé de BME.
C'est mieux, je ne suis plus qu'a 1,5° au dessus plutôt que 5°.
Il y a pas mal de discutions sur cette sonde pour ce qui concerne la mesure de la température qui semble souvent surestimée, réchauffement par les composants ? Qualité des copies Chinoise ?
Je vais rajouter une dht22 pour comparer les température et garder la mesure la plus juste.
Si tu as une idée pour déplacer le point dans la valeur de la pression.. Une conversion de Pascal en Hectopascal ?
Merci pour ton aide..

En effet, en lisant la doc de la bibliothèque (page 23) du capteur, j'ai l'impression qu'elle renvoie la pression en Pa: si tu la veux en hPa, il suffit de diviser par 100

  display.print("Pression (hPa): ");
  display.print(mySensorA.readFloatPressure()/100, 2);

Bonjour

Le BME280 n'est pas un capteur de température de précision (précision de l'ordre de +/- 1°C entre 0°C et 65°C)

Le capteur de température a pour fonction première la compensation pour la mesure de pression, il peut aussi servir dit la notice du fabricant BOSH à faire 'estimation' de la température ambiante.

Bien entendu les composants environnants ont leur influence thermique, mais le facteur prépondérant est sans doute l**'auto-échauffement**. Voire si cet auto-échauffement ne serait pas dépendant de la configuration de la puce (cadence d'échatilonnage ou sampling) configuration qui pourrait différerer selon les librairies.

->On lit içi que la configuration par défaut de la librairie Adafruit donne 1 a 2°C en trop et qu'il est possible de choisir une configuration donnant moins d'écart
...

Méfies toi aussi de ce que tu mesures ...ya des gradients de températures énormes dans l'air ambiant .
Pour moi le mieux pour comparer c'est dans un liquide agité (bien homogène) ..

Ne te pose pas plus de question dudule.
Ajoute un DS18B20 (précis à 0.5°) ou mieux MCP9808 (±0.25 (typical) from -40°C to +125°C).

@+

lesept:
En effet, en lisant la doc de la bibliothèque (page 23) du capteur, j'ai l'impression qu'elle renvoie la pression en Pa: si tu la veux en hPa, il suffit de diviser par 100

  display.print("Pression (hPa): ");

display.print(mySensorA.readFloatPressure()/100, 2);

Exactement, j'ai changé.

hbachetti:
Ne te pose pas plus de question dudule.
Ajoute un DS18B20 (précis à 0.5°) ou mieux MCP9808 (±0.25 (typical) from -40°C to +125°C).
@+

Je vais commander une MCP9808

al1fch:
Bonjour

Le BME280 n'est pas un capteur de température de précision (précision de l'ordre de +/- 1°C entre 0°C et 65°C)

Le capteur de température a pour fonction première la compensation pour la mesure de pression, il peut aussi servir dit la notice du fabricant BOSH à faire 'estimation' de la température ambiante.

Bien entendu les composants environnants ont leur influence thermique, mais le facteur prépondérant est sans doute l**'auto-échauffement**. Voire si cet auto-échauffement ne serait pas dépendant de la configuration de la puce (cadence d'échatilonnage ou sampling) configuration qui pourrait différerer selon les librairies.

->On lit içi que la configuration par défaut de la librairie Adafruit donne 1 a 2°C en trop et qu'il est possible de choisir une configuration donnant moins d'écart
...

On se demande pourquoi ils ne propose pas d'entrée la configuration qui génère le moins d'erreurs.

BrUnO14200:
Méfies toi aussi de ce que tu mesures ...ya des gradients de températures énormes dans l'air ambiant .
Pour moi le mieux pour comparer c'est dans un liquide agité (bien homogène) ..

Oui bien sur, j'ai simplement posé à coté de la BmE deux thermomètres qui eux sont d'accord pour me trouver 20.5°, alors que la BME me trouvait 25° ! Je n'ai pas besoin d'une précision de labo mais il faut que ce soit vaguement crédible !

Merci à tous pour votre aide pertinente, je vais continuer mon aventure arduinesque en remplaçant le nano par un mini pro pour la sonde ext (pour une raison de consommation) et rajouter une partie rf pour envoyer le tout sur un méga et son afficheur Nextion. Tout ça a déjà été fait 100 fois et se trouve sur le net, malheureusement presque toujours en Anglais et de manière très parcellaire... Donc à bientôt !

On se demande pourquoi ils ne propose pas d'entrée la configuration qui génère le moins d'erreurs.

probablement parce que leur configuration par défaut présente certains avantages pour la mesure de pression et d'humidité, fonction première du BME280