Impossible d'afficher les données du capteur BME280

Bonjour tous le monde.
j'ai fait un petit projet avec une carte uno R3, un lcd 2004 I2C, un capteur DS3231 et un BME280.
Le projet LCD2004 I2C avec DS3231 fonctionne (réglage par 3 boutons)
Le projet LCD2004 I2C avec capteur BME280 corrigé pour la pression atmosphérique fonctionne également.
Mais lorsque je mixe les deux, la modification de l'heure, minutes, jour, mois, année fonctionne et s'inscrit bien sur le LCD, mais les données du BME ne s'inscrivent pas sur le LCD.
lorsque je vérifie tout est ok mais après téléversement il n'y a pas d'affichage du BME280
Je suis novice sur arduino et si quelqu'un pouvait m'aider
Merci, je joint le projet ci dessous

//Sketch arduino LCD2004 et horloge DS3231 avec réglage par 3 boutons et BME280

// Autor / Auteur : Zineb KANDOUSSI (https://www.facebook.com/SchoolSurSeineFR/)
// Creation / Création : Le 21/04/2023
// Description : Display the current time, date and temperature on the 20x4 LCD screen / Affichage de l'heure actuelle, la date et la température sur l'écran LCD 20x4
// Inspired from this code : File => Examples => RTClib => ds3231 / inspiré de ce code : Fichier => Exemples => RTClib => ds3231
/*
BME280I2C Modes.ino

This code shows how to use predefined recommended settings from Bosch for
the BME280I2C environmental sensor.

GNU General Public License

Written: Dec 30 2015.
Last Updated: Sep 23 2017.

Connecting the BME280 Sensor:
Sensor              ->  Board
-----------------------------
Vin (Voltage In)    ->  3.3V
Gnd (Ground)        ->  Gnd
SDA (Serial Data)   ->  A4 on Uno/Pro-Mini, 20 on Mega2560/Due, 2 Leonardo/Pro-Micro
SCK (Serial Clock)  ->  A5 on Uno/Pro-Mini, 21 on Mega2560/Due, 3 Leonardo/Pro-Micro
*/
//horloge ds3231 et lcd 2004 et réglage par 3 boutons  

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <EnvironmentCalculations.h>
#include <BME280I2C.h>
#define DS3231_I2C_ADDRESS 0x68

LiquidCrystal_I2C lcd(0X27, 20, 4);
#define SERIAL_BAUD 9600

//char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
byte char_temp[8]={B00100,B01010,B01010,B01110,B01110,B11111,B11111,B01110}; // for thermometer icon / pour l'icône du thermomètre

// Assumed environmental values:
float referencePressure = 1026.0;  // hPa local QFF (official meteor-station reading)
float outdoorTemp = 7;           // °C  measured local outdoor temp.
float barometerAltitude = 90;  // meters ... map readings + barometer position

BME280I2C::Settings settings(
   BME280::OSR_X1,
   BME280::OSR_X1,
   BME280::OSR_X1,
   BME280::Mode_Forced,
   BME280::StandbyTime_1000ms,
   BME280::Filter_16,
   BME280::SpiEnable_False,
   BME280I2C::I2CAddr_0x76
);


int etatActuel = 0;
int etatUltime = 0;
int compteur = 0;
int MoinsAnterieur =0;
int etatPlus = 0;
int etatMoins = 0;
int PlusAnterieur =0;

byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
} 

void TrouverDate(byte *secondes,byte *minutes,byte *heure,byte *jourSemaine,byte *jourMois,byte *mois,byte *annee){
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
 
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
 
  *secondes     = bcdToDec(Wire.read() & 0x7f);
  *minutes      = bcdToDec(Wire.read());
  *heure         = bcdToDec(Wire.read() & 0x3f);
  *jourSemaine    = bcdToDec(Wire.read());
  *jourMois       = bcdToDec(Wire.read());
  *mois          = bcdToDec(Wire.read());
  *annee         = bcdToDec(Wire.read());
}
 
void VoirDate(){
    byte secondes, minutes, heure, jourSemaine, jourMois, mois, annee;
    String s, m, d, mth, h, mty;
     
    TrouverDate(&secondes, &minutes, &heure, &jourSemaine, &jourMois, &mois, &annee);
   
    if (secondes < 10) { s = "0" + String(secondes); } else { s = String(secondes); }
    if (minutes < 10) { m = "0" + String(minutes); } else { m = String(minutes); }
    h = String(heure);
    if (jourMois < 10) { d = "0" + String(jourMois); } else { d = String(jourMois); }
    if (mois < 10) { mth = "0" + String(mois); } else { mth = String(mois); }
    if (annee < 10) { mty = "0" + String(annee); } else { mty = String(annee); }
     
    char* days[] = { "NA", "Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di" };
     
    lcd.clear();
    lcd.backlight();
    
    lcd.setCursor(12,0); //modif
    
    lcd.print(h + ":" + m + ":" + s);
    
    lcd.setCursor(0,0); //  modif
    
    lcd.print(String( d + "/" + mth + "/20" + mty)); // days[jourSemaine]) + " " +  modif  
}

void modifier_temps(int type){
  byte secondes, minutes, heure, jourSemaine, jourMois, mois, annee;
  TrouverDate(&secondes, &minutes, &heure, &jourSemaine, &jourMois, &mois, &annee);
  Serial.println("pressé");
  int addition = 0;
  int soustraction = 0;

  if(etatMoins != MoinsAnterieur){
    if(etatMoins == HIGH){
      soustraction = 1;
    }
  }
  if(etatPlus != PlusAnterieur){
    if(etatPlus == HIGH){
      addition = 1;
    }
  }
  
  if(type == 1){ // modifier l'heure
    String h;
    h = String(heure);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Modifier l'heure");  // write  modif
    lcd.setCursor(0, 1);
    lcd.print(h); 
    lcd.blink();
    if(soustraction == 1){
      heure = heure-1;
    }
    if(addition == 1){
      heure = heure+1;
    }
    if(heure > 23) heure=0;  
  }

  if(type == 2){ // modifier les minutes
    String m;
    m = String(minutes);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Modifier minutes");  // write  modif
    lcd.setCursor(0, 1);
    lcd.print(m); 
    lcd.blink();
    if(soustraction == 1){
      minutes = minutes-1;
    }
    if(addition == 1){
      minutes = minutes+1;
    }
    if(minutes > 59) minutes=0;  
  }

  if(type == 3){ // modifier le jour de la semaine
    String d;
    d = String(jourSemaine);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Modifier jour semaine");  //  write  modif
    lcd.setCursor(0, 1);
    lcd.print(d); 
    lcd.blink();
    if(soustraction == 1){
      jourSemaine = jourSemaine-1;
    }
    if(addition == 1){
      jourSemaine = jourSemaine+1;
    }
    if(jourSemaine == 8) jourSemaine=1;
    if(jourSemaine == 0) jourSemaine=7;  
  }

  if(type == 4){ // modifier le jour du mois
    String m;
    m = String(jourMois);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Modifier jour ");  // write  modif
    lcd.setCursor(0, 1);
    lcd.print(m); 
    lcd.blink();
    if(soustraction == 1){
      jourMois = jourMois-1;
    }
    if(addition == 1){
      jourMois = jourMois+1;
    }
    if(jourMois == 32) jourMois=1;
    if(jourMois == 0) jourMois=31;  
  }

  if(type == 5){ // modifier mois
    String ms;
    ms = String(mois);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Modifier mois");  // write  modif
    lcd.setCursor(0, 1);
    lcd.print(ms); 
    lcd.blink();
    if(soustraction == 1){
      mois = mois-1;
    }
    if(addition == 1){
      mois = mois+1;
    }
    if(mois == 13) mois=1;
    if(mois == 0) mois=12;  
  }

  if(type == 6){ // modifier annee
    String a;
    a = String(annee);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Modifier annee");  // write  modif
    lcd.setCursor(0, 1);
    lcd.print(a); 
    lcd.blink();
    if(soustraction == 1){
      annee = annee-1;
    }
    if(addition == 1){
      annee = annee+1;
    }
    if(annee == 100) annee=1;
    if(annee == 0) annee=99;  
  }
    
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);
  Wire.write(decToBcd(secondes));
  Wire.write(decToBcd(minutes));
  Wire.write(decToBcd(heure));
  Wire.write(decToBcd(jourSemaine));
  Wire.write(decToBcd(jourMois));
  Wire.write(decToBcd(mois));
  Wire.write(decToBcd(annee));
  Wire.endTransmission();

  
}
BME280I2C bme(settings);
//-----------------------------------------------------------------------
void setup(){

byte secondess, minutes, heure, jourSemaine, jourMois, mois, annee;
  Wire.begin();
  lcd.begin(16, 2);
  //Serial.begin(9600);
  pinMode(6,INPUT);  // bouton - menu
  pinMode(5,INPUT);  // bouton - moins
  pinMode(4,INPUT);  // bouton - plus

Serial.begin(SERIAL_BAUD);
while(!Serial) {} // Wait

Wire.begin();

  while(!bme.begin())
  {
    Serial.println("Could not find BME280 sensor!");
    delay(1000);
  }

  switch(bme.chipModel())
  {
     case BME280::ChipModel_BME280:
       Serial.println("Found BME280 sensor! Success.");
       break;
     case BME280::ChipModel_BMP280:
       Serial.println("Found BMP280 sensor! No Humidity available.");
       break;
     default:
       Serial.println("Found UNKNOWN sensor! Error!");
  }
  Serial.print("Assumed outdoor temperature: "); Serial.print(outdoorTemp);
  Serial.print("°C\nAssumed reduced sea level Pressure: "); Serial.print(referencePressure);
  Serial.print("hPa\nAssumed barometer altitude: "); Serial.print(barometerAltitude);
  Serial.println("m\n***************************************");
}

//-------------------------------------------------------------
void loop()
 {
etatActuel=digitalRead(6);
  etatMoins=digitalRead(5);
  etatPlus=digitalRead(4);
  //Serial.println(etatActuel);
  if(etatActuel != etatUltime){
    if(etatActuel == HIGH){
      compteur = compteur +1;
      //Serial.println(compteur);
    }
  }
  
  if(compteur == 0){
    VoirDate();
    delay(1000);
  }else if(compteur == 1){
    modifier_temps(1);  // modifier l'heure
    delay(500);
  }else if(compteur == 2){
    modifier_temps(2);  // modifier les minutes 
    delay(500);
  }else if(compteur == 3){
    modifier_temps(3);  // modifier jour de la semaine
    delay(500);
  }else if(compteur == 4){
    modifier_temps(4);  // modifier jour du mois
    delay(500);
  }else if(compteur == 5){
    modifier_temps(5);  // modifier mois
    delay(500);
  }else if(compteur == 6){
    modifier_temps(6);  // modifier annee
    delay(500);
  }else if(compteur == 7){
    compteur = 0;
    delay(1000);
  }
}
//------------------------------Temperature display - Affichage de la température-----------------------------//
/*
  lcd.setCursor(0,1); 
  lcd.print("Temp 3231:");
  lcd.setCursor(11,1);
  lcd.print(rtc.getTemperature());
  lcd.setCursor(16,1);
  lcd.write((char)223);
  lcd.setCursor(17,1);
  lcd.print("C");
  lcd.setCursor(19,1);  
  lcd.print(char(0));
*/
  
   //printBME280(Data & Serial);
   //delay(500);
  
//////////////////////////////////////////////////////////////////////////////////

void printBME280Data
(
   Stream* client
)
{
   float temp(NAN), hum(NAN), pres(NAN);

   BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
   BME280::PresUnit presUnit(BME280::PresUnit_hPa);

   bme.read(pres, temp, hum, tempUnit, presUnit);

   client->print("Temp: ");
   client->print(temp);
   client->print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? "C" :"F"));
   client->print("\t\tHumidity: ");
   client->print(hum);
   client->print("% RH");
   client->print("\t\tPressure: ");
   client->print(pres);
   client->print(String(presUnit == BME280::PresUnit_hPa ? "hPa" : "Pa")); // expected hPa and Pa only

   EnvironmentCalculations::AltitudeUnit envAltUnit  =  EnvironmentCalculations::AltitudeUnit_Meters;
   EnvironmentCalculations::TempUnit     envTempUnit =  EnvironmentCalculations::TempUnit_Celsius;

   /// To get correct local altitude/height (QNE) the reference Pressure
   ///    should be taken from meteorologic messages (QNH or QFF)
   float altitude = EnvironmentCalculations::Altitude(pres, envAltUnit, referencePressure, outdoorTemp, envTempUnit);

   float dewPoint = EnvironmentCalculations::DewPoint(temp, hum, envTempUnit);

   /// To get correct seaLevel pressure (QNH, QFF)
   ///    the altitude value should be independent on measured pressure.
   /// It is necessary to use fixed altitude point e.g. the altitude of barometer read in a map
   float seaLevel = EnvironmentCalculations::EquivalentSeaLevelPressure(barometerAltitude, temp, pres, envAltUnit, envTempUnit);

   float absHum = EnvironmentCalculations::AbsoluteHumidity(temp, hum, envTempUnit);

   client->print("\t\tAltitude: ");
   client->print(altitude);
   client->print((envAltUnit == EnvironmentCalculations::AltitudeUnit_Meters ? "m" : "ft"));
   client->print("\t\tDew point: ");
   client->print(dewPoint);
   client->print("°"+ String(envTempUnit == EnvironmentCalculations::TempUnit_Celsius ? "C" :"F"));
   client->print("\t\tEquivalent Sea Level Pressure: ");
   client->print(seaLevel);
   client->print(String( presUnit == BME280::PresUnit_hPa ? "hPa" :"Pa")); // expected hPa and Pa only

   client->print("\t\tHeat Index: ");
   float heatIndex = EnvironmentCalculations::HeatIndex(temp, hum, envTempUnit);
   client->print(heatIndex);
   client->print("°"+ String(envTempUnit == EnvironmentCalculations::TempUnit_Celsius ? "C" :"F"));

   client->print("\t\tAbsolute Humidity: ");
   client->println(absHum);
   
      lcd.setCursor(0,1); 
   lcd.print("Temp int:");
   lcd.setCursor(10,1);
   lcd.print(bme.temp());
   lcd.setCursor(16,1);
   lcd.write((char)223);
   lcd.setCursor(17,1);
  lcd.print("C");
  lcd.setCursor(19,1);  
  lcd.print(char(0));
   
   
   
   lcd.setCursor(0,2); 
   lcd.print("Humidite:");
   lcd.setCursor(10,2);
   lcd.print(bme.hum());
   lcd.setCursor(16,2);
   lcd.print("%");
   
   
   lcd.setCursor(0,3); 
   lcd.print("Pres.Cor:");
   lcd.setCursor(10,3);
   lcd.print(seaLevel);
   lcd.setCursor(16,3);
   lcd.print("Hpa");
   /*
   lcd.setCursor(0,3); 
   lcd.print("Altitude:");
   lcd.setCursor(10,3);
   lcd.print(altitude);
   lcd.setCursor(16,3);
   lcd.print("Mtr");
   */

   delay(1000);
}

Merci pour votre retour
gilou91

Et BME280 et DS3231 seuls sans l'écran, avec affichage dans la console, ça fonctionne ?
Ils sont tous les deux branchés sur le même bus I2C ? Peux-tu décrire les connexions ?
Quelles sont leurs adresses ? As-tu fait une passe de scanner I2C ?

Bonjour ,
Merci pour ta réponse lesept.
je fait un scan de mes capteurs et je te fait un retour.

Re bonjour,
Ci joint le résultat du scan.
Pour moi il n'y a pas de soucis
Scanning...

I2C device found at address 0x27 !

I2C device found at address 0x57 !

I2C device found at address 0x68 !

I2C device found at address 0x76 !

Tu sais à quelle adresse correspond quel périphérique ?

Voir par ici:

I2C device found at address 0x27 : écran

I2C device found at address 0x57 : EEPROM ou FRAM (qui doit être sur le module DS3231)

I2C device found at address 0x68 : DS3231

I2C device found at address 0x76 : BME280

Je connais mal l'I2C, mais on trouve des tutos sur internet facilement.
On met souvent des résistances de tirage au bout du bus comme ceci :

Valeurs typiques : 2 à 10 kOhms
Certains capteurs sont montés sur des circuits qui ont ces résistances, je crois.

Ton LCD a bien 4 lignes de 20 caractères ?

Bonjour, :smiley:
Merci pour vos réponses (lesept et fdufnews)
J'ai trouvé mon problème et pour ça, j'ai du modifier ces lignes dans la boucle :
printBME280Data(&Serial); auparavant printBME280 (Data&Serial);
J'ai retirer une accolade sur les deux avant "Temperature display - Affichage de la température"
et j'ai également modifier lcd.begin (16,2); par (20,4);
j'inscrit bien sur le moniteur série et sur le lcd
Merci a vous, il me reste un petit soucis, c'est que l'horloge ne compte pas a la secondes mais plus suivant le délay que je met a la fin de la boucle.
Si je le diminue ou l'augmente, les 3 dernières lignes du lcd clignote a la fréquence du délay.
Y a t'il moyen que l'horloge compte a la seconde et que les 3 autres lignes en dessous ait un rafraichissement diffèrent. (toutes les 10 secondes ou plus)
Merci pour votre retour
Cordialement

Oui, c'est possible mais c'est un peu complexe. Ca peut demander de réécrire le code pour l'organiser autrement.
Il y a plusieurs méthodes, j'ai écrit un petit tuto ici (mais il y en a d'autres) :

Re bonjour,
Merci pour ta réponse.
je vais regarder ton lien et potasser un peu.
Merci encore

  • Ne pas effacer l'écran entièrement
  • N'effacer que ce qui à changé et ne mettre à jour que cette partie.

Bonjour,
Merci pour ton retour.
Je regarde cela et vous tiens informé, mais en ce moment je n'est pas trop de temps.
Ce Week end ou la semaine prochaine j aurai plus de temps

Bonjour,
Super, j'ai retirer le 1er lcd clear et remis le delay de la boucle à 500ms
Merci a vous

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.