Difficultés à arrêter une fonction

Bonjour à tous,
Plongé sur un projet de modification gestion éclairage vélo, j'ai créé une fonction buzzer double finalité, d'une part lors d'un signalement danger (tous feux clignottants) et de l'autre en rappel en cas d'oubli d'arret des clignotants au terme de 90 secondes.
Je suis parti d'un feu arrière vélo ( Aliexpress) piloté par télécommande au guidon. l'ennui était que le buzzer original beepait dès n'impore quel demande, j'ai souhaité faire un montage plus abouti. De plus , en annexe de la carte Nano V3 utilisée, différentes tensions sont à gérer. (36V,12V,5V). Quasi tout fonctionne dans mon application, exepté de pouvoir arrêter le buzzer par un ré-appui sur la même touche, lorsque qu'il a été activé par un dépassement des 90 secondes de rappel clignottant.
Je peux l'arrêter, mais par la touche Phare, ce que je ne trouve pas pratique. De plus ce vélo est prévu pour mon épouse,elle va me reprocher que c'est trop compliqué!
Je bloque donc en fin de code, ayant tout essayé, imbriquant des variables comme pour le phare, la fatigue aidant, je m'y perd totalement. Vous allez certainement rapidement me guider vers la machine à état, laquelle j'ai beaucoup de mal à interpréter. Alors , j'aurais une préférence pour un codage plus primaire. Merci à ceux qui aurons l'amabilité de me mettre sur la voie.
Preform
atted text

int ingauche = 2;         // entrée clignotant gauche
int indroit = 3;          // entrée clignotant droit
int outphare = 5 ;            // sortie phare avant et leds blanches poignées
int outgauche = 6;        // sortie clignotant vers poignée gauche
int inphare = 7;             // entrée info feu central arrière Fx actif
int outdroit = 8;         // sortie clignitant vers poignée droite
const byte outbuzzer = 9;           // sortie buzzer en direction du phare avant
int inBfg = 11;              // entrée info demande phare issue de l'afficheur Bafang
int outFx = 12;              // sortie activation feu central rouge Fx arrière seulement si intensionFx est absente ou faible
int etatlumiere = 4;         // entrée indication état d'activation sortie lumière phare / 
 servant à la remise à zéro variable phare3


unsigned long tempsBuzzer;
unsigned long topdepart = 0;
unsigned long topchrono = 0;

bool memostop2 = false;
bool memostop1 = false;
bool phare1 = false;           // variable d'activation phare lorsque l'entrée Bafang est à 1
bool phare2 = false;           // idem ------------------------------ inphare est LOW suite feu rouge Biker actif
bool phare3 = false;           // variable de mémoire combinaison simultanée clignottement et sortie phare active
bool phare4 = false;           // variable d'activation phare lorsque phare3 est vraie et le clignottement actif
bool clignotte = false;
bool multicondition1 = false;                  // mémoire d'entrée ingauche active pour la condition multiplr buzzer
bool multicondition2 = false;                  // ---------------- indroit  ----------------------------------------
bool multicondition3 = false;                  // ----------------  phare    ----------------------------------------


void setup() {
  pinMode (ingauche, INPUT_PULLUP);             // entrée issue du clignottant gauche Biker
  pinMode (indroit, INPUT_PULLUP);              // --------------------------- droit  -----
  pinMode (outphare, OUTPUT);                   // sortie vers phare Biker
  pinMode (outgauche, OUTPUT);                  // sortie vers clignottant poignée gauche
  pinMode (inphare, INPUT_PULLUP);              // entrée issue du feu rouge central Biker
  pinMode (outdroit, OUTPUT);                   // sortie vers clignottant poignée droite
  pinMode (inBfg, INPUT);                       // entrée commande phare et feu rouge arrière issue de l'afficheur Bafang ( Secours ou Tlc HS )
  pinMode (outFx, OUTPUT);                      // sortie vers feu rouge arrière activée uniquement par la commande Bafang
  pinMode(etatlumiere, INPUT );                 // entrée D4 issue de la sortie lumière D5 de contrôle de la variable phare3
  tone(outbuzzer, 1000, 500);                   // sortie vers buzzer active uniquement par la multicondition Biker clignottant tous feux.
}


void loop() {

  if (digitalRead(inBfg) == HIGH)               // cde Bafang active
  { phare1 = true;                              // phare actif
    digitalWrite(outFx, HIGH);                  // feu rouge arrière actif
  }
  else
  { phare1 = false;                             // phare déactivé
    digitalWrite(outFx, LOW);                   // feu rouge arrière désactivé
  }

  if (digitalRead(ingauche) == LOW)             // clignottant Biker gauche actif
  { digitalWrite (outgauche, HIGH);             // clignottant poignée gauche rendu à son tour actif
    clignotte = true;                           // mémoire état clignottement pour la condition maintien phare vraie
    multicondition1 = true;                     // -------------------------------------------- buzzer vraie
  }
  else
  { digitalWrite(outgauche, LOW);               // sortie clignottant gauche poignée désactivée
    multicondition1 = false;                    // mémoire clignottement multicondition buzzer rendue fausse
  }

  if (digitalRead(indroit) == LOW)              // clignottant Biker droit actif
  { digitalWrite (outdroit, HIGH) ;             // clignottant poignée droite rendu à son tour actif
    clignotte = true;                           // mémoire état clignottement pour la condition maintien phare vraie
    multicondition2 = true;                     // mémoire clignottement multicondition buzzer rendue vraie
  }
  else
  { digitalWrite (outdroit , LOW);              // sortie clignottant poignée droite désactivée
    multicondition2 = false;                    // mémoire clignottement multicondition buzzer rendue fausse
  }

  if (digitalRead(inphare) == LOW)              // entrée phare issue du feu rouge central Biker
  { phare2 = true;                              // variable d'activation du phare
    multicondition3 = true;                     // mémoire  multicondition buzzer rendue vraie
    clignotte = false;
  }
  else
  { phare2 = false;                             // variable activation phare annulée
    multicondition3 = false;                    // mémoire  multicondition buzzer rendue fausse
  }


  if ((digitalRead(etatlumiere) == HIGH) && (clignotte)) // condition d'activation mémoire maintien phare, si phare allumé lors des clignottements
    phare3 = true;                                        // mémoire maintien vrai
  else
    phare3 = false;                                       // mémoire maintien fausse



  if ((phare3 == true) && (clignotte == true))         // condition d'activation sortie phare en présence mémoire maintien et clignottements
    phare4 = true;                                     // phare et feux blancs poignées activés
  else
    phare4 = false;                                     // phare et feux blancs poignées désactivés


  if ((phare1) || (phare2) || (phare4))                // condition allumage phare fonction de ses 3 variables d'activation possibles
    digitalWrite(outphare, HIGH);                      // phare allumé
  else
    digitalWrite(outphare, LOW);                       // phare éteint


  if ((multicondition1) && (multicondition2) && (multicondition3))   // multicondition activation Buzzer lorsque Biker est tous feux allumés
    gererBuzzer();                                                // démarrage fonction buzzer, sortie buzzer activée

  if (!clignotte)
    topdepart = millis();                            //  condition de rappel cligottant actif

  if (millis() - topdepart >= 90000)              // si plus de 90 secondes de clignottement ( oubli)

    gererBuzzer();                            // le buzzer emet une alarme de rappel


  // !!!!! le problème est ici, comment arrêter l'alarme rappel clignottant lorsque le clignottant est désactivé?


}

void gererBuzzer()                                                   // déclaration fonction buzzer
{
  if (millis() - tempsBuzzer >= 1000) {                // départ chrono largeur impulsion globale 1 seconde (1/2 on, 1/2 off)
    tone(outbuzzer, 1000, 500);                        // sortie buzzer activée, signal carré de 1000hz durant 1/2 seconde
    tempsBuzzer = millis();                            // boucle du chrono
  }
}te code here

Bonsoir

Un conseil : pour augmenter la probabiliét que le code soit pris en compte, voir la partie "Utilisation de quelques Outils' dans les Bonnes Pratiques du Forum Francophone

Outre le manque de balises de code (à rajouter en éditant votre premier post) effectivement réaliser une machine à états serait sans doute approprié… le code ressemble à un plat de spaghetti…

Peux-tu indiquer le lien vers le produit ?

je reviens sur mon commentaire après avoir lu le code bien formaté (merci) - ce n'est pas si spaghetti que cela mais on se perd un peu dans toutes ces variables d'état.

Le challenge est que l'on ne sait pas quand commence une action versus quand elle se poursuit (détection de changement d'état) ce qui empêche pour le moment cette gestion des 90 secondes

voici le lien demandé du Biker:

https://fr.aliexpress.com/item/1005002740926702.html?gatewayAdapt=glo2fra&spm=a2g0o.9042311.0.0.7a406c37opRae8

j'ai récupéré les entrées carte Nano depuis les diodes du Biker par liaison filaire.
2 modules gèrent le 12 volts et le 5 volts en aval de la batterie 36 volts
j'ai associé le phare avant à l'allumage du feu rouge central du Biker, ainsi soit le tout est fixe, soit l'ensemble clignote.
j'ai associé les indicateurs de direction intégrés en bout de guidon (12v) réciproquement aux clignottants gauche et droite arrières. ( et éliminé le buzzer qui beepait systématiquement avec les clignottants, trop agaçant)
Lorsque tous les feux du biker clignotent ( 3 appuis bouton phare) simulant un genre Warning, le buzzer fonctionne. Un nouvel appui sur le bouton phare, tout s'arrête comme prévu.
Si les phares sont allumés, et je lance un des deux clignotants, le code est composé de telle façon que le phare reste allumé. j'explique ce détail, parce que j'ai été obligé d'associer au phare les 2 parties distinctes du feu rouge central pour bien me distinguer des clignotants. En effet, avec chaque clignotant, soit la moitié gauche ou droite du feu rouge central s'allume avec également. Dès arrêt clignotement, les deux moitiés se rétablissent. D'où ce " spaghetti" pour les phare!!
Honnêtement, tout ça fonctionne à merveille. Même le buzzer en mode warning, s'arrête dès un ré-appui sur le bouton phare, faisant ainsi passer à une phase de veille.
Tel quel, le code gère bien également le lancement de l'alarme dépassement de 90 secondes de clignotement, en cas d'oubli de l'arrêter. Le problème est l'arrêt de cette alarme, pour l'heure c'est possible avec le bouton phare. Je souhaite rendre cela plus logique, en devant ré-appuyer sur le même bouton clignotant qui ai servi préalablement, d'autant que c'est par lui que je dois déjà passer pour désactiver la commande et le voyant bleu rappel intégré dans la télécommande. De jour, ce voyant est moins visible d'où l'alarme en cas d'oubli.
Info utile: les entrées de la carte Nano reçoivent des impulsions carrées du Biker dû au clignottement et non un signal continu , d'où la complexité du traitement.

En retravaillant le projet aujourd'hui, j'ai obtenu un certain résultat.
Cette fois, j'ai juste à rappuyer directement sur le bouton clignotant initial, et j'arrête l 'alarme 90 secondes rappel clignotant.
Reste un souci de qualité d'alarme différente du buzzer warning. Sans avoir pour autant modifié la gestion buzzer, lequel est parfait en warning, ici il est entrecoupé de petits arrets en cours de fonctionnement. un imprévu qui peut être intéressant, car moins dérangeant mais efficace tout de même. Juste pour comprendre ce dernier phénomène, j'aimerais connaître votre avis. Voici le nouveau code


int ingauche = 2;         // entrée clignotant gauche
int indroit = 3;          // entrée clignotant droit
int outphare = 5 ;            // sortie phare avant et leds blanches poignées
int outgauche = 6;        // sortie clignotant vers poignée gauche
int inphare = 7;             // entrée info feu central arrière Fx actif
int outdroit = 8;         // sortie clignitant vers poignée droite
const byte outbuzzer = 9;           // sortie buzzer en direction du phare avant
int inBfg = 11;              // entrée info demande phare issue de l'afficheur Bafang
int outFx = 12;              // sortie activation feu central rouge Fx arrière seulement si intensionFx est absente ou faible
int etatlumiere = 4;         // entrée indication état d'activation sortie lumière phare / servant à la remise à zéro variable phare3


unsigned long tempsBuzzer;
unsigned long topdepart = 0;
unsigned long topchrono = 0;


bool phare1 = false;           // variable d'activation phare lorsque l'entrée Bafang est à 1
bool phare2 = false;           // idem ------------------------------ inphare est LOW suite feu rouge Biker actif
bool phare3 = false;           // variable de mémoire combinaison simultanée clignottement et sortie phare active
bool phare4 = false;           // variable d'activation phare lorsque phare3 est vraie et le clignottement actif
bool clignotte = false;
bool multicondition1 = false;                  // mémoire d'entrée ingauche active pour la condition multiplr buzzer
bool multicondition2 = false;                  // ---------------- indroit  ----------------------------------------
bool multicondition3 = false;                  // ----------------  phare    ----------------------------------------

bool memo1 = true;
bool memo2 = false;
bool memo3 = true;
bool memo4 = false;

bool lancerBuzzer1 = false;
bool lancerBuzzer2 = false;

void setup() {
  pinMode (ingauche, INPUT_PULLUP);             // entrée issue du clignottant gauche Biker
  pinMode (indroit, INPUT_PULLUP);              // --------------------------- droit  -----
  pinMode (outphare, OUTPUT);                   // sortie vers phare Biker
  pinMode (outgauche, OUTPUT);                  // sortie vers clignottant poignée gauche
  pinMode (inphare, INPUT_PULLUP);              // entrée issue du feu rouge central Biker
  pinMode (outdroit, OUTPUT);                   // sortie vers clignottant poignée droite
  pinMode (inBfg, INPUT);                       // entrée commande phare et feu rouge arrière issue de l'afficheur Bafang ( Secours ou Tlc HS )
  pinMode (outFx, OUTPUT);                      // sortie vers feu rouge arrière activée uniquement par la commande Bafang
  pinMode(etatlumiere, INPUT );                 // entrée D4 issue de la sortie lumière D5 de contrôle de la variable phare3
  tone(outbuzzer, 1000, 500);                   // sortie vers buzzer active uniquement par la multicondition Biker clignottant tous feux.
}


void loop() {

  if (digitalRead(inBfg) == HIGH)               // cde Bafang active
  { phare1 = true;                              // phare actif
    digitalWrite(outFx, HIGH);                  // feu rouge arrière actif
  }
  else
  { phare1 = false;                             // phare déactivé
    digitalWrite(outFx, LOW);                   // feu rouge arrière désactivé
  }

  if (digitalRead(ingauche) == LOW)             // clignottant Biker gauche actif
  { digitalWrite (outgauche, HIGH);             // clignottant poignée gauche rendu à son tour actif
    clignotte = true;                           // mémoire état clignottement pour la condition maintien phare vraie
    topchrono = 0;                              // remise à zéro chrono extinction alarme tant que le clignotement est en cours  
    memo1 = false;                              // mémoire état entrée clignotant gauche fausse à l'état bas
    memo2 = true;                               // mémoire action en cours clignotant gauche pour la condition chrono 2 secondes avec memo1
    multicondition1 = true;                     // -------------------------------------------- buzzer vraie
  }
  else
  { digitalWrite(outgauche, LOW);               // sortie clignottant gauche poignée désactivée
    multicondition1 = false;                    // mémoire clignottement multicondition buzzer rendue fausse
  }

  if (digitalRead(ingauche) == HIGH)
    memo1 = true;                               // mémoire état entrée clignotant gauche
  else
    memo1 = false;

  if (digitalRead(indroit) == LOW)              // clignottant Biker droit actif
  { digitalWrite (outdroit, HIGH) ;             // clignottant poignée droite rendu à son tour actif
    clignotte = true;                           // mémoire état clignottement pour la condition maintien phare vraie
    topchrono = 0;                              // remise à zéro chrono extinction alarme tant que le clignotement est en cours
    memo3 = false;                              // mémoire état clignotant droit fausse à l'état bas
    memo4 = true;                               // mémoire action en cours clignotant droit pour la condition chrono 2 secondes avec memo3
    multicondition2 = true;                     // mémoire clignottement multicondition buzzer rendue vraie
  }
  else
  { digitalWrite (outdroit , LOW);              // sortie clignottant poignée droite désactivée
    multicondition2 = false;                    // mémoire clignottement multicondition buzzer rendue fausse
    memo3 = true;
  }
  if (digitalRead(indroit) == HIGH)
    memo3 = true;                               // mémoire état entrée clignotant droit
  else
    memo3 = false;

  if (digitalRead(inphare) == LOW)              // entrée phare issue du feu rouge central Biker
  { phare2 = true;                              // variable d'activation du phare
    multicondition3 = true;                     // mémoire  multicondition buzzer rendue vraie
    clignotte = false;
    lancerBuzzer1 = false;                      // remise à zéro enclenchement buzzer
  }
  else
  { phare2 = false;                             // variable activation phare annulée
    multicondition3 = false;                    // mémoire  multicondition buzzer rendue fausse
  }


  if ((digitalRead(etatlumiere) == HIGH) && (clignotte)) // condition d'activation mémoire maintien phare, si phare allumé lors des clignottements
    phare3 = true;                                        // mémoire maintien vrai
  else
    phare3 = false;                                       // mémoire maintien fausse



  if ((phare3 == true) && (clignotte == true))         // condition d'activation sortie phare en présence mémoire maintien et clignottements
    phare4 = true;                                     // phare et feux blancs poignées activés
  else
    phare4 = false;                                     // phare et feux blancs poignées désactivés


  if ((phare1) || (phare2) || (phare4))                // condition allumage phare fonction de ses 3 variables d'activation possibles
    digitalWrite(outphare, HIGH);                      // phare allumé
  else
    digitalWrite(outphare, LOW);                       // phare éteint


  if ((multicondition1) && (multicondition2) && (multicondition3))   // multicondition activation Buzzer lorsque Biker est tous feux allumés
    lancerBuzzer1 = true;                                              // démarrage fonction buzzer, sortie buzzer activée
  else
    lancerBuzzer1 = false;               //  première variable déclenchement buzzer en mode warning

  if (!clignotte)
    topdepart = millis();                            //  condition de rappel cligottant actif

  if (millis() - topdepart >= 90000)              // si plus de 90 secondes de clignottement ( oubli)

    lancerBuzzer2 = true;                // deuxième variable déclenchement buzzer, émission d'une alarme de rappel clignotant

  if (((memo1) && (memo2)) || ((memo3) && (memo4)))   // mémoires de gestion fin d'alarme clignotant
    topchrono = millis();

  if (millis() - topchrono >= 2000)    // chrono revenant à attendre un état 1 au moins 2 secondes aux entrées clignotant carte Nano 
  {
    lancerBuzzer2 = false;             // seconde variable déclenchement buzzer, ici le force à l'arrêt
    memo2 = false;
    memo4 = false;
  }


  if ((lancerBuzzer1) || (lancerBuzzer2))

    gererBuzzer();
}


void gererBuzzer()                                                   // déclaration fonction buzzer
{
  if (millis() - tempsBuzzer >= 1000) {                // départ chrono largeur impulsion globale 1 seconde (1/2 on, 1/2 off)
    tone(outbuzzer, 1000, 500);                        // sortie buzzer activée, signal carré de 1000hz durant 1/2 seconde
    tempsBuzzer = millis();                            // boucle du chrono
  }
}