[Résolu] Télécommande infrarouge et boucle do ..while

Bonjour,

Je suis entrain de réaliser une climatisation maison et j'aimerais la contrôler à l'aide de l'Arduino et une télécommande infrarouge.
J'utilise la télécommande pour contrôler à distance trois relais.

J'utilises 5 boutons pour :

  • Bouton 1- enclencher le relais1 qui contrôle mon ventilateur,
  • Bouton 2- enclencher le relais1 et le relais2 qui contrôle un des modules Peltier,
  • Bouton 3- enclencher le relais1 et le relais3 qui contrôle le second module Peltier,
  • Bouton ON- éteindre l'ensemble des relais
  • Bouton 4- enclencher un mode automatique qui activera les relais en fonction de la température de la pièce.
    Les quatre premières utilisations citées ci-dessus fonctionne parfaitement avec mon code mais le mode automatique pose problème.
    J'ai fais en sorte que le bouton 4 enclenche un do ... while mais je n'arrive pas à trouver la bonne condition dans le "while" qui ferait que la boucle continue de s’exécuter jusqu'à l'appui sur un autre bouton.

En résumé, j'arrive à activer le mode automatique et rester dans la boucle mais la réception infrarouge est alors délaissée.

Une idée de la condition que je pourrais utiliser dans le "while" pour arrêter la boucle lorsqu'un bouton est appuyé ?

Merci d'avance pour votre aide :slight_smile:

PS: Le code en pièce jointe (quota dépassé)

void loop() {
  
  if (irrecv.decode(&resultat))       // Vérifie si un code est stocké dans "resultat"
  {
    switch (resultat.value)           // Éteint ou allume les différents modules selon le bouton de la télécommande
    {
      case 0xFF10EF:     // Le bouton 4 active le mode automatique

        do
        {
          float temperature = dht.readTemperature();      // Mesure de température
          float humidite = dht.readHumidity();            // Mesure d'humidité

          if (isnan(temperature) || isnan(humidite)) {
          }

          else {
            lcd.setCursor(0, 0);            // Place le curseur sur la première ligne de l'écran
            lcd.print("Temp: ");            // Affiche "Temp:"
            lcd.print(temperature);         // Affiche la valeur de la temperature
            lcd.print(" C");                // Affiche " C" (degré celsius)
            lcd.setCursor(0, 1);            // Place le curseur sur la deuxième ligne de l'écran
            lcd.print("Humi: ");            // Affiche "Humi:"
            lcd.print(humidite);            // Affiche la valeur de l'humidité
            lcd.print(" %");                // Affiche " %"
          }
          delay(500);                      // Attente avant rafraichissement des mesures

          if (temperature > 20)    // Si la température est supérieure à 20, on :
          {
            digitalWrite(relais1, LOW);
            digitalWrite(relais3, LOW);       // Allume le ventilateur et le peltier froid
            ventilateur = 1;
            peltierfr = 1;
          }

          if (temperature < 12)    // Si la température est inférieure à 12, on :
          {
            digitalWrite(relais1, LOW);
            digitalWrite(relais2, LOW);       // Allume le ventilateur et le peltier chaud
            ventilateur = 0;
            peltierch = 0;
            peltierfr = 0;
          }

          if ((temperature <= 20) && (temperature >= 12))    // Si la température se trouve entre .. et .. :
          {
            digitalWrite(relais1, HIGH);
            digitalWrite(relais2, HIGH);        // On éteint tout
            digitalWrite(relais3, HIGH);
            ventilateur = 1;
            peltierch = 1;
          }

        } while (irrecv.decode(&resultat) != 0);    // ?? Rester dans la boucle while tant qu'on appuie pas sur un bouton de la télécommande
        break;
  } irrecv.resume();              // Il se prépare à recevoir le prochain code.
}

Off.ino (7.74 KB)

Bonjour,

Il faut que tu positionnes un flag quand tu reçois la touche auto. Ce flag est resetté par les autres touches.
Ensuite tu fais le traitement auto quand ce flag est positionné.

void loop() {
  static bool flagAuto = false;

  if (irrecv.decode(&resultat))       // Vérifie si un code est stocké dans "resultat"
  {
    switch (resultat.value)           // Éteint ou allume les différents modules selon le bouton de la télécommande
    {
      case 0xFF10EF:     // Le bouton 4 active le mode automatique
        flagAuto = true;
        break;
      case 0x?????? :     // traitement des autres touches
          flagAuto = false;
        break;
    }
  }
  if (flagAuto)
  {
    float temperature = dht.readTemperature();      // Mesure de température
    float humidite = dht.readHumidity();            // Mesure d'humidité

    if (isnan(temperature) || isnan(humidite)) {
    }

    else {
      lcd.setCursor(0, 0);            // Place le curseur sur la première ligne de l'écran
      lcd.print("Temp: ");            // Affiche "Temp:"
      lcd.print(temperature);         // Affiche la valeur de la temperature
      lcd.print(" C");                // Affiche " C" (degré celsius)
      lcd.setCursor(0, 1);            // Place le curseur sur la deuxième ligne de l'écran
      lcd.print("Humi: ");            // Affiche "Humi:"
      lcd.print(humidite);            // Affiche la valeur de l'humidité
      lcd.print(" %");                // Affiche " %"
    }
    delay(500);                      // Attente avant rafraichissement des mesures

    if (temperature > 20)    // Si la température est supérieure à 20, on :
    {
      digitalWrite(relais1, LOW);
      digitalWrite(relais3, LOW);       // Allume le ventilateur et le peltier froid
      ventilateur = 1;
      peltierfr = 1;
    }

    if (temperature < 12)    // Si la température est inférieure à 12, on :
    {
      digitalWrite(relais1, LOW);
      digitalWrite(relais2, LOW);       // Allume le ventilateur et le peltier chaud
      ventilateur = 0;
      peltierch = 0;
      peltierfr = 0;
    }

    if ((temperature <= 20) && (temperature >= 12))    // Si la température se trouve entre .. et .. :
    {
      digitalWrite(relais1, HIGH);
      digitalWrite(relais2, HIGH);        // On éteint tout
      digitalWrite(relais3, HIGH);
      ventilateur = 1;
      peltierch = 1;
    }
  }
}

remarque: il manque le irrecv.resume() dans ton code.

Un petit oubli lors de la copie :confused: J'ai édité mon premier message.

Un grand merci pour cette réponse aussi rapide !

Eh bien, c'était efficace. Tout fonctionne parfaitement !

Malgré toutes mes recherches je n'étais jamais tombé sur ce type d'utilisation des valeurs booléennes.
Cela fonctionne comme l'appelle à une fonction ?

Encore merci :slight_smile:

Forum.ino (6.53 KB)

Content que ça fonctionne.
Je ne vois pas très bien ce que tu veux dire quand tu dis "Cela fonctionne comme l'appel à une fonction ?", un booléen est généralement utiliser pour mémoriser une valeur vrai faux et la tester ensuite.

J'utilise peut-être pas les bons termes mais je comprenais ça comme une condition qui, si respectée, renvoie faire une "fonction" (ou plutôt un bout de code).

En tout cas, c'est fort pratique je tacherais de m'en souvenir.