[ Résolu ] Problème switch / case

Bonsoir,
Je suis toujours sur mon projet d'études perso.

Voila, dans mon projet je doit afficher en boucle sur un lcd 2 lignes 7 blocs d'informations

Donc je les affichait 2 par 2 avec une tempo de 2 secondes pour chaque bloc d'info
Ca marchait bien mais ca utilisait des if et des delay blocant pour le reste du Programme.
J'ai testé les systèmes witch / case et les millis()
L'extrait du code

quelAffichage= millis();


void loop()
{
  dureAffichage=(millis()-quelAffichage) /1000; //convect millisecondes en secondes

switch (dureAffichage)
{
    case 14:   //do something when var equals 1  // if (millis()-quelAffichage>=14000)  //  superieur a 14 secondes
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Nbre de jours: ");
    lcd.setCursor(0,1);
    lcd.print(nombreDeJours);
    quelAffichage= millis();
    Serial.print("+ ");
    
     break;
  }
    case 12:  //if (millis()-quelAffichage>=12000)  //  superieur a 12 
secondes
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Nbre de Mesures: ");
  lcd.setCursor(0,1);
  lcd.print(nombreMesures);
  Serial.print("* ");
  
  break;
  }
  case 10:  //  if (millis()-quelAffichage>=10000)  //  superieur a 10 
secondes
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Nbre de Mesures: ");
    lcd.setCursor(0,1);
    lcd.print(nombreMesures);
    Serial.print("/ ");
    
    break;
  }
  case 8 :    //if (millis()-quelAffichage>=8000)  //  superieur a 8 
secondes
  {
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("temp maxi: ");lcd.print(maxTemperature);
    lcd.setCursor(0,0);
    lcd.print("temp mini: ");lcd.print(minTemperature);
    Serial.print("\ ");
    
      break;
  }
  case 6 :    //if (millis()-quelAffichage>=6000)  //  superieur a 6 
secondes
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Humi mini: ");lcd.print(minHumidite);
    lcd.setCursor(0,1);
    lcd.print("humi maxi: ");lcd.print(maxHumidite);
    Serial.print("^ ");
    
        break;
  }
      case 4 :   //if (millis()-quelAffichage>=4000)  // superieur a 4 
secondes
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("temp moy: ");lcd.print(totalTemperature/nombreMesures);
    lcd.setCursor(0,1);
    lcd.print("humi moy: ");lcd.print(totalHumidite/nombreMesures);
    Serial.print("~");
    
    break;
  }
  case 2 :   // if (millis()-quelAffichage>=2000)  //  superieur a 2 
secondes
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("temp: ");lcd.print(temperature);
    lcd.setCursor(0,1);
    lcd.print("humi: ");lcd.print(humidite);
    dureAffichage++;
    Serial.print("x");
    
    break;
  }
   default:
   {// if nothing else matches, do the default
             // default is optional
             if (dureAffichage >14) quelAffichage= millis(); //  on est hors des clous, on remet d équerre 
             Serial.print("  Z  ");Serial.print(dureAffichage); delay(100);
      break;
   }
}

Le code fonctionne, sauf qu'il passe des dizaines de fois dans le switch et tant que millis ne change pas de millier la selection du case passe et repasse.... du coup l'afficheur scintille (succession de lcd.clear et de lcd.print)

Comment faire pour etre sur qu'il n'y aura qu'un passage sans monter une usine a gaz?

Les serial.print sont là pour le débogage....

Merci

Dans l'idée, tu t'arranges pour quitter (return) loop avant le switch dans le cas ou dureAffichage à la même valeur qu'au tour précédent. Pour cela tu crée une variable lastDureAffichage que tu mets à jour à la fin de chaque tour de loop (et que tu initialises à une durée impossible).

Quelque chose du genre

If (dureAffichage > affichagePrecedent) switch (dureAffichage) .....// dureeAffichage changeant toutes les secondes
.
.
.
?

Merci

Le plus simple à mon sens c'est de découper en 2 parties.
L'affichage se déroule toutes les 2 secondes. Donc tu fais une boucle dans laquelle tu restes si 2 secondes ne se sont pas écoulées. Dans cette boucle tu utilises millis() comme ça le code n'est pas bloquant et tu peux exécuter du code en tâche de fond si tu le désires.
Lorsque 2 secondes se sont écoulées tu passes dans une routine d'affichage qui incrémente une variable contenant le numéro du bloc à afficher et tu lances la routine d'affichage. Et retour dans la boucle qui attend 2 secondes.

Voilà, jai modifié le code comme suit et ca marche impeccable.
Je met le code modifié

void loop()

{
  dureAffichage=(millis()-quelAffichage) /1000; //convect millisecondes
en secondes
  if ((millis()-dureeMinutes)>=20*1000) //60 secondes, x 1000 ms pour une lecture par minute;  la, 2 mesures par minute
   {
    litLesValeurs(); // lit les valeurs des sondes
   }
 if (dureAffichage!=dejaAffiche) switch (dureAffichage)  // la modif principale se situe ici
{
    case 12:   //do something when var equals 1  // if
(millis()-quelAffichage>=12000)  //  superieur a 12 secondes
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Nbre de jours: ");
    lcd.setCursor(0,1);
    lcd.print(nombreDeJours);
    quelAffichage= millis();
    dejaAffiche=dureAffichage;   //      
     break;
  }

  case 10:  //  if (millis()-quelAffichage>=10000)  // superieur a 10
secondes
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Nbre de Mesures: ");
    lcd.setCursor(0,1);
    lcd.print(nombreMesures);
     dejaAffiche=dureAffichage;
    break;
  }
  case 8 :    //if (millis()-quelAffichage>=8000)  // superieur a 8
secondes
  {
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("temp maxi: ");lcd.print(maxTemperature);
    lcd.setCursor(0,0);
    lcd.print("temp mini: ");lcd.print(minTemperature);
     dejaAffiche=dureAffichage;
      break;
  }
  case 6 :    //if (millis()-quelAffichage>=6000)  // superieur a 6
secondes
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Humi mini: ");lcd.print(minHumidite);
    lcd.setCursor(0,1);
    lcd.print("humi maxi: ");lcd.print(maxHumidite);
     dejaAffiche=dureAffichage;
        break;
  }

      case 4 :   //if (millis()-quelAffichage>=4000)  // superieur a 4
secondes
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("temp moy: ");lcd.print(totalTemperature/nombreMesures);
    lcd.setCursor(0,1);
    lcd.print("humi moy: ");lcd.print(totalHumidite/nombreMesures);
     dejaAffiche=dureAffichage;
    break;
  }
  case 2 :   // if (millis()-quelAffichage>=2000)  // superieur a 2
secondes
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("temp: ");lcd.print(temperature);
    lcd.setCursor(0,1);
    lcd.print("humi: ");lcd.print(humidite);
     dejaAffiche=dureAffichage;
    break;
  }
   default:
   {// if nothing else matches, do the default
             // default is optional
             if (dureAffichage >14)
             {
              quelAffichage= millis();

             }

      break;
   }
}

  if ((millis()-journee)>=dureeJour)
  {
    journee=millis();
    totalTemperature= totalTemperature/nombreMesures;
    totalHumidite=  totalHumidite/nombreMesures;
    nombreMesures=1;
    nombreDeJours++;
  }

}

Merci des conseils.

Tu peux raccourcir un peu. Actuellement tu as:

if(...) switch (...) {
   case ... : ...
                 dejaAffiche=dureAffichage;
                 break;
   case ... : ...
                 dejaAffiche=dureAffichage;
                 break;
   case ... : ...
                 dejaAffiche=dureAffichage;
                 break;
   ...
  case ... : ...
                 dejaAffiche=dureAffichage;
                 break;  
}

que tu peux remplacer par

if(...) {
   switch (...) {
      case ... : ...
                 break;
      case ... : ...
                 break;
      case ... : ...
                 break;
      ...
     case ... : ...
                 break;  
   }
 dejaAffiche=dureAffichage;
}

supercc:
Tu peux raccourcir un peu.

que tu peux remplacer par

if(...) {

switch (...) {
      case ... : ...
                break;
      case ... : ...
                break;
      case ... : ...
                break;
      ...
    case ... : ...
                break; 
  }
dejaAffiche=dureAffichage;
}

Exact! ca marche!!
merc!

bon, demain j'attaque le rtc et la sauvegarde des lecture sur l'eeprom

Bonne nuit!