Comment sortir d'une boucle

Une solution possible

void loop()
{
char touche= clavier.getKey();
	if (touche == NO_KEY)
	{
	// ici le code que tu veux exécuter lorsqu'il n'y a pas de touche appuyée
	}
	else if (touche == '1')
	{
	 croissance();
	}
	else if (touche == '2')
	{
	floraison();
	}
	else if (touche == '3')
	{
	sechage();
	}

}

Encore merci à tous de m'accorder un peu de votre temps.

J'ai essayé ce code , mais il ne fonctionne pas

void loop()
{
   char touche= clavier.getKey();
   
  if (0 == compteur) {
    dht.begin();
}
compteur = (compteur +1) % X; 

 
  if (touche == '1')croissance();
  else if (touche == '2') floraison();
  else if (touche == '3') sechage();


 
 
}

J'avais pensé, pourquoi ne pas faire ce genre de code, mais ca reviens au problème du début je n'arrive plus à sortir de la boucle for.

void loop()
{
   char touche= clavier.getKey();
   
 

 
  if (touche == '1')
{
for(;;)
{
croissance();
}
}
  else if (touche == '2') 

{
for(;;)
{
floraison();
}
}
  else if (touche == '3') 

{
for(;;)
{
sechage();
}
}


 
 
}

Avec ce dernier code, vu que c'est dans une boucle for a chaque tour de boucle la température est mise à jour.
Mais ou et comment placé ce fichu break ?

Que c'est dur d'être un noob :slight_smile:

dht.begin() ne peut pas servir à rafraîchir les mesures. Il devrait être appelé une fois pour toutes dans le setup.

La solution de dfufnews est brillante, car elle permet, pour sortir d'une boucle, de retirer la boucle (et le break...).

Et je maintiens que vous avez deux boucles: la fonction loop est appelée dans un programme qui vous est caché...
il a donc comme structure simplifiée

void main() {
 setupsarduino();
 setup();
 while (1 == 1) loop; // dès que loop s'arrêter, elle est relancée tant que le monde sera monde

Donc, il suffit, dans cette boucle infinie, de regarder ce que l'on a à faire, et , si besoin (appui boutons, temps) , de le faire... (il n'y a pas lieu de s'ennuyer avec une boucle supplémentaire)

la solution de dfufnews je l'ai faite, je peux naviguer entre les différent programme mais par exemple sur l'appuie de la touche 1 la fonction croissance se lance et une fois lu cela reviens au début de la loop.

Avec le for les mesures se mettent à jour sans appuie bouton et c'est ce que je veux.

J'arrive soit à faire prendre les mesures toutes les 5 secondes OU faire une sorte de menu, mais les 2 réunis je n'y arrive pas...

Tu as essayé ce que j'ai proposé à la réponse 35 ? (EDIT : 19 !!! :frowning: )

Le problème est qu'on ne sait pas quelle bibliothèque tu utilises pour ton DHT. Des dht.h il en existe plusieurs avec le même nom (un peu comme pour les LCD) mais les instructions sont différentes.

Si c'est celle-ci, tu fais

float temp = readTemperature();
Serial.println(temp);

et bien sûr comme dit plus haut, ceci va dans le setup

dht.begin();

Oui ton bout de code je l'ai essayé et c'est le suivant

void loop()
{
   char touche= clavier.getKey();

 
  if (touche == '1') for(;;)
  {
 croissance();
    if(touche =='0') break;
  }
  else if (touche == '2') for(;;)
  {
 floraison();
    if(touche =='0') break;
  }
  else if (touche == '3') for(;;)
  {
 sechage();
    if(touche =='0') break;
  }


 
 
}

Mais il ne fonctionne pas non plus, je pense que je dois très mal m'y prendre.

"Le problème est qu'on ne sait pas quelle bibliothèque tu utilises pour ton DHT. "

C'est vraiment une source de désordre, qu'une URL (si elle est bien écrite, un exemple des demos peut indiquer l'auteur) pourrait règler.

Le DHT que j'utilise c'est un DHT 22 avec la librairie DHT-sensor-library.

Comme celle de lesept? (les commentaires des exemples disent "written by ladyada" dans les toutes premières lignes... pour permettre de se dépatouiller)

Oui c'est bien çà ^^

Alors, après le scrutation des touches, vous devriez lire la température (comme lesept vous l'indique en post 24) , avec les ossatures de lespt en post 19 et fdufnews en post 21
et l'humidité....
Essayez de ne pas trop dévier d'une de ces deux ossatures (elles sont identiquement brillantes) et, avant de les coder/copier coller, de les comprendre....

Roms629:
Oui ton bout de code je l'ai essayé et c'est le suivant

void loop()

{
  char touche= clavier.getKey();

if (touche == '1') for(;:wink:
  {
croissance();
    if(touche =='0') break;
  }
  else if (touche == '2') for(;:wink:
  {
floraison();
    if(touche =='0') break;
  }
  else if (touche == '3') for(;:wink:
  {
sechage();
    if(touche =='0') break;
  }

}




Mais il ne fonctionne pas non plus, je pense que je dois très mal m'y prendre.

Non, ce n'est pas ce que je t'ai proposé :

unsigned long chrono = 0;
unsigned long period = 5000ul;  // mise à jour toutes les 5 secondes 

void loop()
{
  char touche= clavier.getKey();
  if (touche == '1') croissance();
  else if (touche == '2') floraison(); 
  else if (touche == '3') sechage();
 
  if (millis () - chrono > period) {
    chrono = millis () ;
    float temp = readTemperature();
    Serial.println(temp);
  } 
}

Ceci scrute ton clavier, agit en cas d'appui sur les touches 1, 2 ou 3, et affiche la température toutes les 5 secondes. Bien sûr, il faut les initialisations dans le setup aussi.

Lesept, j'ai essayé ton bout de code qui fonctionne parfaitement, mais au final cela ne fait pas ce que je veux.
J'ai du mal m'exprimer... :confused:

Par exemple sur l'appuie de la touche 3 lance le void sechage qui est comme çà

void sechage()
{
 for(;;)
 {     
    
            
            digitalWrite(brasseur, HIGH);
            
            

              heure = RTC.get(DS1307_HR,true);                              // Récupération de l'heure
              minut = RTC.get(DS1307_MIN,false);
              seconde = RTC.get(DS1307_SEC,false);
              date = RTC.get(DS1307_DATE,false);
              mois = RTC.get(DS1307_MTH,false);
              annee = RTC.get(DS1307_YR,false);
              temps_perso = (heure * 100) + minut;  //creation temps_perso
              int h = dht.readHumidity();
              int t = dht.readTemperature();

                if(t > extracteur_on_sec)                                       // Mise en route des Relais en mode croissance
                {
                  digitalWrite(extracteur, HIGH);
                }
                if(t < extracteur_off_sec)
                {
                  digitalWrite(extracteur, LOW);
                }
                if(t > intracteur_on_sec){
                  digitalWrite(intracteur, HIGH);
                }
                if(t < intracteur_off_sec){
                  digitalWrite(intracteur, LOW);
                }
                
                digitalWrite(lampe, LOW);
               

            lcd.setCursor(0,0);                                                       // Début affichage page 1 LCD
            lcd.print("  MODE SECHAGE  ");
            lcd.setCursor(0,1);
            lcd.print("TEMPERATURE ");
            lcd.print(t); 
            lcd.print(" C");
            lcd.setCursor(0,2);
            lcd.print("HYGROMETRIE ");
            lcd.print(h); 
            lcd.print(" %");
            lcd.setCursor(7,3);
                if(digitalRead(lampe) == HIGH)
                {
                    lcd.print("LAMPE ALLUMEE");
                }
                else
                {
                    lcd.print("LAMPE ETEINTE");
                }

            lcd.setCursor(0,3);
                if (heure < 10)
                {
                   lcd.print("0");
                } 
            lcd.print(RTC.get(DS1307_HR,true)); 
            lcd.print("H");
                 if (minut < 10)
                {
                  lcd.print("0");
                }
            lcd.print(RTC.get(DS1307_MIN,false));
            lcd.print(" ");
            delay(5000);            
            lcd.clear();
            lcd.setCursor(0,0);                                                // début page 2 de l'écran LCD
            lcd.print("EXTRA  ");
            lcd.setCursor(7,0);
              if(digitalRead(extracteur) == HIGH)
              {
            lcd.print("ON ");
              }
              else
              {
            lcd.print("OFF");
              }
            lcd.setCursor(0,1);
            lcd.print("INTRA  ");
            lcd.setCursor(7,1);
              if(digitalRead(intracteur) == HIGH)
              {
            lcd.print("ON ");
              }
               else
              {
            lcd.print("OFF");
              }    
            lcd.setCursor(0,2);
            lcd.print("BRASS ");
            lcd.setCursor(7,2);
              if(digitalRead(brasseur) == HIGH)
              {
            lcd.print("ON ");
              }
              else
              {
            lcd.print("OFF");
              }
              lcd.setCursor(0,3);
                if (heure < 10)
                {
                   lcd.print("0");
                } 
            lcd.print(RTC.get(DS1307_HR,true)); 
            lcd.print("H");
                 if (minut < 10)
                {
                  lcd.print("0");
                }
            lcd.print(RTC.get(DS1307_MIN,false));
            lcd.print(" ");
            lcd.setCursor(11,0);
            lcd.print("TEMP ");
            lcd.print(t); 
            lcd.print("C");
            lcd.setCursor(11,1);
            lcd.print("HYGR ");
            lcd.print(h); 
            lcd.print("%");
            delay(5000);                                                                                 // Fin page 2 de l'écran LCD
            
}
}

Avec la boucle For infini mon programme s'execute sans problème, ce que j'aimerais c'est que par l'appuie d'une touche je peux changer programme et le balancer sur le void croissance par exemple.

Pour cela j'ai coder mon loop comme cela.

void loop()
{
  char touche= clavier.getKey();
  
  

 if(touche)  // Check for a valid key.
  {
    
    
    switch (touche)
    {
      
      case '1' :
        croissance();
        break;
      case '2':
        floraison();
        break;
        case '3':
        sechage();
        break;
      default:
        Serial.println(touche);
      }
  }
  else menu();
 
}

Même codé comme cela je n'arrive pas à sortir de la boucle for...

Il faut supprimer les boucles for dans tes fonctions puisque ce sont elles qui bloquent tout.
Il faut coder ça en utilisant une machine à états

Roms629:

  croissance();

floraison();
  sechage();

Et alors, finalement ... une fois séchée ... elle est bonne ? :wink: :wink: :wink:

Faudrait que çà fonctionne déjà ;D :stuck_out_tongue:

Effectivement je viens de lire quelques article sur les machines à état, je pense que la clé de ma solution est là.

Voir là

fdufnews:
Voir là

Justement c'est ce que je lisais.

Roms629:
Lesept, j'ai essayé ton bout de code qui fonctionne parfaitement, mais au final cela ne fait pas ce que je veux.
J'ai du mal m'exprimer... :confused:

Je confirme, je n'y comprends rien à ce que tu veux.

Déjà, pourquoi mettre une boucle infinie dans une fonction ? Si la fonction est appelée, tu n'en sortiras jamais. Est-ce ce que tu veux faire ? Si oui, il y a plus simple, mais je ne vois pas l'intérêt...

Donc explique bien ton besoin : que se passe-t-il lorsque tu appuies sur une touche ? Et ensuite que veux-tu faire, après l'exécution de la fonction appelée lors de l'appui sur la touche ?

Roms629:
Oui j'avais compris çà :slight_smile:

Je me demande ce que vous avez compris