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
