Problème pour activer / dèsactiver une boucle avec un pouton poussoir

Bonjour,
J’essaye de réaliser des girophares pour un camion de pompier avec 2 types de clignotement possible un par défaut et un autre activable et desactivable par un bouton poussoir.
Le problème que je recontre est que je n’arrive pas faire durer la boucle du clignotement secondaire. (J’utilise un Trinket d’Adafruit )

boolean etatBouton = 0;
int pinBouton = 2;
boolean clignotement_secondaire = 0;

void setup() {

  pinMode(1, OUTPUT);
  pinMode(0, OUTPUT);
  pinMode(2, INPUT);

}


void loop() {

  etatBouton = digitalRead(pinBouton);

  if (etatBouton == HIGH) {
    clignotement_secondaire = 1;
  }
  else {
    clignotement_secondaire = 0;
  }

  if (clignotement_secondaire == 1) {
    for (int t = 0; t < 7; t++) {               
      for (int t = 0; t < 3; t++) {
        digitalWrite(1, HIGH);  // Led Droite
        delay(25);
        digitalWrite(1, LOW);   // Led Droite
        delay(50);
      }

      for (int t = 0; t < 3; t++) {                           //Clignotement secondaire activable par bouton
        digitalWrite(0, HIGH);   // Led Gauche
        delay(25);
        digitalWrite(0, LOW);    // Led Gauche
        delay(50);
      }
    } // Fait On/off Droite et Gauche pendant 6 fois
      digitalWrite(1, HIGH);  // Led Droite
      digitalWrite(0, HIGH);   // Led Gauche
      delay(25);
      digitalWrite(1, LOW);   // Led Droite
      digitalWrite(0, LOW);    // Led Gauche
      delay(25);

    }
    for (int t = 0; t < 7; t++) {               
      for (int t = 0; t < 3; t++) {
        digitalWrite(1, HIGH);  // Led Droite
        delay(25);
        digitalWrite(1, LOW);   // Led Droite
        delay(50);
      }

      for (int t = 0; t < 3; t++) {
        digitalWrite(0, HIGH);   // Led Gauche
        delay(25);
        digitalWrite(0, LOW);    // Led Gauche
        delay(25);
      }
    }
  }

  else {

    digitalWrite(1, HIGH);  // Led Droite                   // Clignotement par defaut
    digitalWrite(0, HIGH);   // Led Gauche
    delay(100);
    digitalWrite(1, LOW);   // Led Droite
    digitalWrite(0, LOW);    // Led Gauche
    delay(100);


  }
}

Indentez avec ctrl-T votre code pour bien voir ce qui est dans le if (clignotement_secondaire) et ce qui doit être dans le else

Ne mettez pas le souk sur les pins du port série...

pinMode(1, OUTPUT);
  pinMode(0, OUTPUT);

Euh, la variable pinBouton (qui devrait être constante) sert à quoi alors???pinMode(2, INPUT); // pourquoi mettre 2 ???

clignotement_secondaire est un boolean, le mieux serait quand même de lui affecter true ou false plutôt que 0 ou 1... même si ça fonctionne ce n’est pas beau.

Ça ne serait pas un problème de rebond dans le traitement de l’action du bouton poussoir ?

  etatBouton = digitalRead(pinBouton);

  if (etatBouton == HIGH) {
    clignotement_secondaire = 1;
  }
  else {
    clignotement_secondaire = 0;
  }

Tel que c’est écrit, il faut que le bouton reste enfoncé pour activer le clignotement secondaire. Or cette animation dure plus d’une seconde.

Essaye peut-être avec cette bibliothèque : Arduino library to debounce button switches, detect presses, releases, and long presses

un truc comme ca serait plus judicieux

 if(digitalRead(pinBouton == HIGH){ // mettre LOW si cablage différent
             delay(500);
              etatBouton != etatBouton;
}  

  if (etatBouton == FALSE) {
    clignotement_secondaire = 1;
  }
  else {
    clignotement_secondaire = 0;
  }

comme indiqué, les pin 0-1 servent pour l'usb et debugger, donc utilises d'autres pins. mettre des noms est mieux aussi.

J’ai réussi avec cette bibliothèque https://github.com/JChristensen/Button Merci Lesept
Voilà mon programme , le problème que je rencontre est qu’il faut parfois appuyer plusieurs fois sur le boutton pour obtenir un résultat , je pense que c’est a cause des Delay, j’ai regarder comment les supprimer, je comprend le principe pour un seule led a intervalle régulier mais je ne sais pas comment l’appliquer dans mon cas.

#include <Button.h>
#define BUTTON_PIN 2
#define PULLUP false
#define INVERT true
#define DEBOUNCE_MS 20

Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS);
boolean mode;
int ledDroite = 3;
int ledGauche = 4;


void setup()
{

  pinMode(ledDroite, OUTPUT);
  pinMode(ledGauche, OUTPUT);
}

void loop()
{
  myBtn.read();

  if (myBtn.wasReleased()) {
    mode = !mode;
  }

  if (mode == 0) {
    digitalWrite(ledDroite, HIGH);
    digitalWrite(ledGauche, HIGH);
    delay(100);
    digitalWrite(ledDroite, LOW);
    digitalWrite(ledGauche, LOW);
    delay(100);
  }

  if (mode == 1) {

    for (int t = 0; t < 3; t++) {
      digitalWrite(ledDroite, HIGH);
      delay(25);
      digitalWrite(ledDroite, LOW);
      delay(50);
    }

    for (int t = 0; t < 3; t++) {                           //Clignotement secondaire activable par bouton
      digitalWrite(ledGauche, HIGH);
      delay(25);
      digitalWrite(ledGauche, LOW);
      delay(50);

    }
    digitalWrite(ledDroite, HIGH);
    digitalWrite(ledGauche, HIGH);
    delay(25);
    digitalWrite(ledDroite, LOW);
    digitalWrite(ledGauche, LOW);
    delay(25);


    for (int t = 0; t < 7; t++) {
      for (int t = 0; t < 3; t++) {
        digitalWrite(ledDroite, HIGH);
        delay(25);
        digitalWrite(ledDroite, LOW);
        delay(50);
      }

      for (int t = 0; t < 3; t++) {
        digitalWrite(ledGauche, HIGH);
        delay(25);
        digitalWrite(ledGauche, LOW);
        delay(25);
      }
    }
  }
}

Peux-tu préciser ton besoin ? Es-ce, par exemple (je mets des valeurs au hasard) :

  • Clignotement principal activé en permanence, période 1 seconde allumé puis 1 seconde éteint
  • Clignotement secondaire activé si bouton poussoir maintenu enfoncé, période 500 ms allumé puis 300 ms éteint Quand on saura ça, on pourra réfléchir à l'architecture du code, qui va devoir utiliser des millis...

Il est connecté comment ce bouton ?

Le bouton est connecté en pull-down sur la broche 2 du Trinket . Ce que je souhaite faire : Quand on clique une première fois sur le bouton , cela active le clignotement secondaire jusqu'a qu'on clique une seconde fois sur ce même bouton Donc quand on clique une seconde fois sur le bouton cela désactive le clignotement secondaire et remet le clignotement principal.

Le clignotement principal fait :

Leds droite et gauche allumées
100 ms 
Leds droite et gauche éteintes
100 ms

Le clignotement secondaire fait :

Led droite allumée pendant 25 ms             
puis Led droite éteinte pendant 50 ms     

Led droite allumée pendant 25 ms             
puis Led droite éteinte pendant 50 ms    
     

Led gauche allumée pendant 25 ms               
puis Led gauche éteinte pendant 50 ms     

Led gauche allumée pendant 25 ms               
puis Led gauche éteinte pendant 50 ms

Yann442: Ce que je souhaite faire : Quand on clique une première fois sur le bouton , cela active le clignotement secondaire jusqu'a qu'on clique une seconde fois sur ce même bouton Donc quand on clique une seconde fois sur le bouton cela désactive le clignotement secondaire et remet le clignotement principal.

Donc quand on clique une première fois sur le bouton, ça désactive aussi le clignotement principal ?

Pour le clignotement secondaire, les deux leds sont synchrones ou en opposition ?

lesept: Donc quand on clique une première fois sur le bouton, ça désactive aussi le clignotement principal ?

Oui , c'est uniquement le clignotement secondaire quand on clique pour la première fois et quand on clique une seconde fois le clignotement secondaire est complétement désactivé pour laisser la place au clignotement principal.

lesept: Pour le clignotement secondaire, les deux leds sont synchrones ou en opposition ?

Les leds sont en opposition pour le clignotement secondaire, il y a 2 impulsions à droite puis 2 impulsions à gauche et sa recommence jusqu’à un second appui sur le bouton

Pour millis() : deux choses à lire

Si tu comprends ces deux tutos, tu dois pouvoir les appliquer à ton besoin. Les questions que je t'ai posées servent à initier la réflexion pour appliquer à ton cas les infos de ces tutos.

Je verrais bien un truc comme ça :

boolean cligno_principal = true;
long chrono_principal = 0;
long chrono_secondaire = 0;
... définition des broches ...

void setup () {
... définitions des leds, bouton ...
}

void loop() {

if (cligno_principal) {

if (chrono_principal - millis() <= 100) {
... allumer les 2 leds }
else if (chrono_principal - millis() <= 200) {
... éteindre les 2 leds }
else { chrono_principal = millis(); }

} else {

if (chrono_secondaire - millis() < 25) {
... led droite allumée, led gauche éteinte ... }
else if (chrono_secondaire - millis() < 75) {
... 2 leds éteintes ... }
else if (chrono_secondaire - millis() < 100) {
... led droite allumée, led gauche éteinte ... }
else if (chrono_secondaire - millis() < 150) {
... 2 leds éteintes ... }
else if (chrono_secondaire - millis() < 175) {
... led gauche allumée, led droite éteinte ... }
else if (chrono_secondaire - millis() < 225) {
... 2 leds éteintes ... }
else if (chrono_secondaire - millis() < 250) {
... led gauche allumée, led droite éteinte ... }
else if (chrono_secondaire - millis() < 325) {
... 2 leds éteintes ... }
else  { chrono_secondaire = millis(); }

}
}

Ça devrait gérer les clignotements.
Teste en mettant true puis en mettant false pour cligno_principal pour voir si les deux marchent correctement.

Si c’est bon, il faudra ajouter le traitement du bouton poussoir qui va changer la valeur de cligno_principal.