Allumer un écran quelques secondes

Bonjour,
Je voudrais améliorer mon projet, en intégrant un BP pour allumer mon écran pendant 5s.
J'ai testé mon code avec une autre nano et une led à la place de l'écran: Test ok.
Mais après avoir intégré le nouveau code dans le premier, ça ne fonctionne pas !?
Nouvelles lignes suivies de //(nouveau)

[code]


#define SERIAL_SPEED  19200
#include "U8glib.h" // Librairie de l'ecran Oled ssd1306
#include <sSense-BMx280I2C.h> //librairie du capteur BME280
#include <Wire.h> //librairie I2C
int ecranPin = 5; //alim ecran (nouveau)
int buttonpin = 7;// bouton poussoir alim ecran (nouveau)


byte ecran = 0;


U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);  // Display which does not send AC



BMx280I2C::Settings settings(
   BME280::OSR_X1,
   BME280::OSR_X1,
   BME280::OSR_X1,
   BME280::Mode_Forced,
   BME280::StandbyTime_1000ms,
   BME280::Filter_Off,
   BME280::SpiEnable_False,
   0x76 // I2C address. I2C specific.
);

BMx280I2C ssenseBMx280(settings);

//////////////////////////////////////////////////////////////////
void draw() {
  
   

   BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
   BME280::PresUnit presUnit(BME280::PresUnit_Pa);
   float temp(NAN), hum(NAN), pres(NAN);// declaration des variables
   ssenseBMx280.read(pres, temp, hum, tempUnit, presUnit);//lire les données
    
   Stream* client;
  // graphic commands to redraw the complete screen should be placed here  
  u8g.setFont(u8g_font_unifont);
  //u8g.setFont(u8g_font_osb21);
  
  u8g.drawStr( 0, 22, "Temp:");
  u8g.setPrintPos (40,22);
   u8g.print(temp);
   u8g.print (" "+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'));
  u8g.drawStr(0,40, "Hum:");
  u8g.setPrintPos (40,40);
  u8g.print(hum);
  u8g.print("% RH");
  u8g.drawStr (0,60, "Pres:");
  u8g.setPrintPos(40,60);
  u8g.print(pres/100);
  u8g.print(" hPa");
}
void setup()
{
   
  delay(10000);
  DebugPort.begin(SERIAL_SPEED);

  while(!DebugPort) {} // Wait utile ?

  DebugPort.println("s-Sense BME/BMP280 I2C sensor.");

  Wire.begin();
  while(!ssenseBMx280.begin())
  {
    DebugPort.println("Could not find BME/BMP280 sensor!");
    delay(10000);
  }
  
  switch(ssenseBMx280.chipModel())
  {
     case BME280::ChipModel_BME280:
       DebugPort.println("Found BME280 sensor! Humidity available.");
       break;
     case BME280::ChipModel_BMP280:
       DebugPort.println("Found BMP280 sensor! No Humidity available.");
       break;
     default:
       DebugPort.println("Found UNKNOWN sensor! Error!");
  }
pinMode(ecranPin, OUTPUT);//(nouveau)
  pinMode(buttonpin, INPUT_PULLUP);//(nouveau)
   // Change some settings before using.
   settings.tempOSR = BME280::OSR_X4;

   ssenseBMx280.setSettings(settings);
}

//////////////////////////////////////////////////////////////////
void loop()
{
  if (digitalRead(buttonpin) == LOW)//(nouveau)
  {
    digitalWrite(ecranPin, HIGH);//(nouveau)
  }
  delay(5000);//(nouveau)
  if (digitalRead(buttonpin) == HIGH)  //(nouveau)                                                                                                             
  {
    digitalWrite(ecranPin, LOW);//(nouveau)
  }
  
   printBMx280Data(&DebugPort);
   delay(10000);
   // picture loop
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  //delay(50);
}

//////////////////////////////////////////////////////////////////
void printBMx280Data // pour afficher sur le moniteur série. a supprimer pour le code final?
(
   Stream* client
)
{
   float temp(NAN), hum(NAN), pres(NAN);

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

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

   client->print("Temp: ");
   client->print(temp);
   //client->print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'));
   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->println(" Pa");

   delay(10000);
}

[/code]

Les delay peuvent empêcher ton code de voir un appui sur le bouton. C’est peut-être ça qui ne marche pas. Il faut écrire ton code différemment, afin de faire un code non bloquant

Bonjour,
Il est préférable d'uuitiliser millis ()?

Utiliser millis est effectivement une solution.

Si tu as besoin d'un tutoriel, c'est celui que j'ai utilisé quand on m'a dit d'utiliser millis pour un projet. lien

oui et une programmation par machine à états pourrait simplifier la lecture du code (cf mon tuto éventuellement)

vous avez 2 états, un état ETEINT et un ALLUMÉ
vous démarrez ETEINT (dans le setup)

au début de la loop vous testez l'état.
si vous êtes ETEINT, vous regardez l'appui sur le bouton et si c'est le cas vous notez la valeur de millis() dans une variable globale (unsigned long t0;), allumez l'écran et changez l'état en ALLUMÉ
si vous êtes ALLUMÉ, vous regardez si (millis() - t0 >= 5000ul) est vrai, auquel cas vous éteignez l'écran et changez l'état en ETEINT

switch(etat) {
  case ETEINT:
    if (digitalRead(pinBouton) == LOW) {
      // .... ICI ALLUMER L'ECRAN ......
      t0 = millis();
      etat = ALLUME;
    }
    break;

    case ALLUME:
      if (millis() - t0 >= 5000ul) {
        // .... ICI ETEINDRE L'ECRAN ......
        etat = ETEINT;
      }
    break;
}

(code tapé ici - à vérifier)

Ce code est une petite machine à état. elle ne bloque rien donc après vous pouvez laisser votre code normal (non bloquant)

Il faudra aussi définir les valeurs de ETEINT et ALLUME, par exemple avec un enum

lesept:
Il faudra aussi définir les valeurs de ETEINT et ALLUME, par exemple avec un enum

oui ainsi que la variable etat (c'était pour voir s'il lisait le tuto :slight_smile: )

et relier D5 et D7 sur la nano et pas sur le BME280 :o

Bonjour,
Voici mon code, L'écran s'allume quand j'appuie sur le BP et s'éteins entre 3 et 5 secondes aléatoirement.
J'ai réglé sur 8s !
J'ai bien tout cablé sur la nano... :confused:
Je viens de découvrir vos messages, je regarde les différents tuto et conseils...
Merci à tous

[code]
const int ecranPin = 5;
const int buttonpin = 7;
int ecranState = LOW;
unsigned long previousMillis = 0;
const long interval = 8000;

void setup() 
{
  pinMode(ecranPin, OUTPUT);
  pinMode(buttonpin, INPUT_PULLUP);  
   
}

void loop() 
{
  if (digitalRead(buttonpin) == LOW)
  {
    digitalWrite(ecranPin, HIGH);
  }
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    if (ecranState ==LOW){
      ecranState = HIGH;}
      else{
        digitalWrite(ecranPin, LOW);
      }
     
    }
    
  }

[/code]
C'est bon, plus qu'a intégrer dans mon code "météo".

[code]
const int ecranPin = 5;
const int buttonpin = 7;
int ecranState = LOW;
int tempoActive = 0;
unsigned long tempoDepart = 0;
const long interval = 8000;

void setup() 
{
  pinMode(ecranPin, OUTPUT);
  pinMode(buttonpin, INPUT_PULLUP);  
   
}

void loop() 
{
  if (digitalRead(buttonpin) == LOW)
  
  {
    
    tempoActive=1;
   tempoDepart=millis();
      }
      unsigned long currentMillis = millis();
  if (tempoActive){
  digitalWrite(ecranPin, HIGH);
  if (currentMillis - tempoDepart >= interval)
  
  tempoActive = 0;
  
  
    
    if (ecranState ==LOW){
      ecranState = HIGH;}
      else{
        digitalWrite(ecranPin, LOW);
      }
     
    }
    
  }

[/code]