Go Down

Topic: BME280 température fantaisiste (Read 217 times) previous topic - next topic

dudule63

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.
Code: [Select]
/******************************************************************************
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);

}

lesept

Ca doit être un problème lié à la bibliothèque que tu utilises : essaye avec une autre.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

68tjs

#2
Oct 18, 2018, 06:12 pm Last Edit: Oct 18, 2018, 06:15 pm by 68tjs
Code: [Select]
// 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

dudule63

#3
Oct 18, 2018, 07:01 pm Last Edit: Oct 18, 2018, 07:02 pm by dudule63
Code: [Select]
// 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.   


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 ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

dudule63

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..
   

lesept

#6
Oct 19, 2018, 09:16 am Last Edit: Oct 19, 2018, 09:18 am by 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
Code: [Select]
  display.print("Pression (hPa): ");
  display.print(mySensorA.readFloatPressure()/100, 2);
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

al1fch

#7
Oct 19, 2018, 09:21 am Last Edit: Oct 19, 2018, 10:15 am by al1fch Reason: mé
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
...

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) ..
Ma couveuse :https://forum.arduino.cc/index.php?topic=571843.0

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).

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dudule63

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
Code: [Select]
 display.print("Pression (hPa): ");
  display.print(mySensorA.readFloatPressure()/100, 2);

Exactement, j'ai changé.
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
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.
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 !       

al1fch

Quote
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

Go Up