Probleme de boucle avec IR

Bonsoir à tous, je bosse actuellement sur un projet pour mes études,
c'est un programme permettant l'auto-gestion de la luminosité dans une maison connectée, j'ai donc fait un programme qui permet de régler une valeur cible avec un potentiometre, et grace à un capteur, la led se regle automatiquement pour atteindre la valeur cible si celle si n,'est pas atteinte naturellement.
Ce programme marche, mais j'aimerai le regrouper avec un programme de mode manuel et pouvoir choisir entre les deux grace aux boutons 0 et 1 de ma telecommande IR, et c'est la que les choses se compliquent.

le programme marche très bien jusqu'à ce que l'on appuie sur la touche 0 (mode auto),
la, le programme rentre dans la boucle du mode auto et impossible d'en ressortir, étant donné que les valeurs IR ne sont pas " re-testées".

Après avoir lu énormement de pages de forum, Je suis passé par énormement de solution, créer une variable et la tester, avec if, j'ai meme testé avec du bolléen ( static bool flagAuto = true /false ) etc...
Mais aucune ne marche ( ayant pourtant l'air de fonctionner pour les autre, peut-être ne les utilise-je pas correctement).

pouvez-vous m'aider ?
Merci d'avance pour votre réponse

Voici mon programme

const int capteurLuminositePin = A0;
const int potentioPin = A1;
const int RECV_PIN = 11;
const int lumPin = 5;
const int verifPin = 7;
int iValue;
#include <Wire.h>
#include <IRremote.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//LiquidCrystal_I2C lcd(0x3F,16,2);
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  Serial.begin(9600);
  int valeurCible = analogRead(potentioPin);
  irrecv.enableIRIn();  // Start the receiver
  int valeurTot = 0;
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Bienvenue");
}

void loop() {

  if (irrecv.decode(&results)) {
    digitalWrite(verifPin, HIGH);
    delay(100);
    digitalWrite(verifPin, LOW);  // allume une led de vérification qui confirme la reception du signal IR
    switch (results.value) {
      case 0xB1EFBA9D:
        do {
          int ValeurT = 0;
          int valeurLum = analogRead(capteurLuminositePin);
          int valeurCible = analogRead(potentioPin);
          int valeurTot = valeurCible - valeurLum;
          lcd.backlight();
          lcd.setCursor(0, 0);
          lcd.print("mode auto");
          lcd.setCursor(0, 1);
          lcd.print("Cible:");
          lcd.setCursor(7, 1);
          lcd.print(valeurCible);
          ValeurT = map(valeurTot, 0, 1023, 0, 255);
          if ((valeurTot < 0)) {
            analogWrite(lumPin, 0);
          } 
          else {
            analogWrite(lumPin, ValeurT);
          }
        } while (irrecv.decode(&results) == 2985278109);
        break;


      case 0xDEE522C1:

        lcd.setCursor(0, 0);
        lcd.print("mode manuel");
        break;
    }
  }
}

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

la machine à état n'est pas très compliquée, les évènement sont les appuis sur la télécommande ou la variation du potentiomètre

Sur réception de la touche qui change de mode, vous basculez juste une variable qui dit si vous êtes en mode manuel ou automatique ➜ c'est une variable globale, un enum fait "propre"

enum {MANUEL, AUTOMATIQUE} mode = MANUEL; // Mode manuel par défaut au démarrage

votre loop teste s'il y a réception d'une commande ou une modification du potentiomètre et réagit différemment selon le mode

//vérifier si un événement est arrivé
...

// si quelque chose à traiter alors, réagir en fonction du mode
if (mode == MANUEL) {
  ...
}
else if (mode == AUTOMATIQUE) { // pas obligé de mettre le if car ici on n'a que 2 modes, donc si on n'est pas en manuel c'est qu'on est en auto
  ...
}

Merci beaucoup ! je vais tester ça, je dirai si ça fonctionne !
Si j'ai bien compris, je dois mettre un

 enum {MANUEL , AUTOMATIQUE}  mode = MANUEL; 

afin d'initier la variable globale
puis

 mode = MANUEL  
 mode = AUTOMATIQUE

a chaque fois que je veux changer son etat ?

oui c'est ça

et bien sûr ensuite faire le test

if (mode == MANUEL) {
  // gestion des commandes pour le mode manuel
  ...
} else {
  // gestion des commandes pour le mode auto + pilotage auto
  ...
}

Re-bonsoir !
J'ai donc testé, mais étant une technique copletement inconnue pour moi, je ne suis pas certain de l'avoir appliquée comme il faut car ce la ne fonction pas, j'entre, certes, dans la boucle manuelle, mais aucune réaction à l'appui des boutons, à part 1 ou 2 fois ( sur bien une 50aine voire une centaine) ou j'ai réussi à entrer dans AUTOMATIQUE mais jamais à en ressortir.
Il semble que ce soit encore un probleme de reception, une fois dans la boucle, le fait de changer la reception IR n'affecte rien car le switch n'est pas ré-éffectué
(pourtant il repasse bien dans la boucle case puisque la led de verification ne cesse de clignoter, les rares fois ou j'ai réussi à changer de mode)

Je suis donc encore et toujours à la rehcerche de conseils, :sob:
ou peut etre d'une meilleure façon d'appliquer la programmation par machine à états.

Merci, et bonne soirée !

voici le programme dans son état actuel :

const int capteurLuminositePin = A0;
const int potentioPin = A1;
const int RECV_PIN = 11;
const int lumPin = 5;
const int verifPin = 7;
int iValue;
enum {MANUEL, AUTOMATIQUE,} mode = MANUEL;
#include <Wire.h>
#include <IRremote.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//LiquidCrystal_I2C lcd(0x3F,16,2);
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  Serial.begin(9600);
  int valeurCible = analogRead(potentioPin);
  irrecv.enableIRIn();  // Start the receiver
  int valeurTot = 0;
  lcd.init();
  lcd.backlight();
  lcd.setCursor(3, 0);
  lcd.print("Bienvenue");
}

void loop() {
if (irrecv.decode(&results)) {
    switch (results.value) {
      case 0xB1EFBA9D:
        digitalWrite(verifPin, HIGH);
        delay(100);
        digitalWrite(verifPin, LOW);
        mode = AUTOMATIQUE;
        irrecv.resume();
        break;


      case 0xDEE522C1:
        digitalWrite(verifPin, HIGH);
        delay(100);
        digitalWrite(verifPin, LOW);
        mode = MANUEL;
        irrecv.resume();
        break;
    }
  }

else if (mode == MANUEL)
{ 
  lcd.setCursor(0, 0);
  lcd.print("Mode Manuel     ");
  irrecv.resume();
}
else {     
      int ValeurT = 0;
      int valeurLum = analogRead(capteurLuminositePin);
      int valeurCible = analogRead(potentioPin);
      int valeurTot = valeurCible - valeurLum;
      lcd.setCursor(0, 0);
      lcd.print("mode auto       ");
      lcd.setCursor(0, 1);
      lcd.print("Cible:");
      lcd.setCursor(7, 1);
      lcd.print(valeurCible);
      lcd.print("   ");
      ValeurT = map(valeurTot, 0, 1023, 0, 255);
      if ((valeurTot < 0)) {
        analogWrite(lumPin, 0);
         } 
      else {
         analogWrite(lumPin, ValeurT);
        }
        irrecv.resume();
 }
}

faites tourner cela

#include <IRremote.hpp>
#define RECV_PIN 11

void setup() {
  Serial.begin(115200); Serial.println();
  IrReceiver.begin(RECV_PIN);
}

void loop() {
  if (IrReceiver.decode()) {
    Serial.print("Commande = "); Serial.println(IrReceiver.decodedIRData.command);
    IrReceiver.resume();
  }
}

et appuyez sur les boutons qui servent à changer de mode et dites moi ce que ça imprime

Déjà fait, j'ai effectivement testé si la réception fonctionnait et ça fonctionne c'est ensuite que ça bloque

Dites moi ce que ça imprime.