Activer et désactiver avec push button

Bonjour,

je suis nouveau dans la programmation de cartes arduino et je voudrais allumer des LED pendant 2 secondes chacune de facon successive. jusque là tout va bien. mais en plus je veux rajouter un pushbotton au circuit. quand j'appuis 1 foi je demarre la sequence et je l'arrete en appuyant une foi de plus. je ne veux pas que ca marche quand c'est HIGH et que ca s'arrete quand c'est LOW.
je veux que HIGH active et desactive la sequence.

je suis arrivé avec ce code mais la sequence ne s'Arrete pas et le button n'a aucun effet.

merci

const int buttonPin = 2;

int ledState = HIGH;
int buttonState;
int lastButtonState = LOW;

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

void setup() {
pinMode(buttonPin, INPUT);
pinMode(12, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(4, OUTPUT);
pinMode(1, OUTPUT);
pinMode(13, OUTPUT);

digitalWrite(13, ledState);
digitalWrite(12, ledState);
digitalWrite(8, ledState);
digitalWrite(7, ledState);
digitalWrite(4, ledState);
digitalWrite(1, ledState);
}

void loop() {

int reading = digitalRead(buttonPin);

if (reading != lastButtonState) {

lastDebounceTime = millis();

}

if ((millis() - lastDebounceTime) > debounceDelay) {

if (reading != buttonState) {
  buttonState = reading;

  
  if (buttonState == HIGH) {
    ledState = !ledState;
  }
}

}

digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
digitalWrite(4, LOW);
digitalWrite(1, LOW);

delay(2000);

digitalWrite(13, LOW);
digitalWrite(12, HIGH );
digitalWrite(8, LOW);
digitalWrite(7, LOW);
digitalWrite(4, LOW);
digitalWrite(1, LOW);

delay(2000);

digitalWrite(13, LOW);
digitalWrite(12,LOW);
digitalWrite(8, HIGH );
digitalWrite(7, LOW);
digitalWrite(4, LOW);
digitalWrite(1, LOW);

delay(2000);

digitalWrite(13, LOW);
digitalWrite(12,LOW );
digitalWrite(8, LOW);
digitalWrite(7, HIGH);
digitalWrite(4, LOW);
digitalWrite(1, LOW);

delay(2000);

digitalWrite(13, LOW);
digitalWrite(12,LOW );
digitalWrite(8, LOW );
digitalWrite(7, LOW);
digitalWrite(4, HIGH);
digitalWrite(1, LOW);

delay(2000);

digitalWrite(13, LOW);
digitalWrite(12,LOW );
digitalWrite(8, LOW );
digitalWrite(7, LOW);
digitalWrite(4, LOW);
digitalWrite(1, HIGH);

delay(2000);

lastButtonState = reading;
}

votre post n'a rien à faire dans la catégorie International/Français/Réalisations et Projets Finis

➜ déplacé

De plus La rédaction de votre message ne répond pas aux critères attendus. Il n'aura sans doute pas de réponse tant que vous n'aurez pas pris en compte et mis en application les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

Tu as fait un code dit "bloquant", c'est à dire que les instructions delay bloquent le déroulement du code : le microcontrôleur ne fait strictement rien pendant ces deux secondes. En particulier, il ne lit pas le bouton. Et comme tu as une succession de 6 blocs avec des delay, ça fait 12 secondes pendant lesquelles le µC ne fait que jouer avec les leds...
Côté réactivité, on peut faire mieux.

Pour faire une code non bloquant, il faut changer complètement de point de vue : c'est à dire qu'il faut se centrer sur le bouton et allumer les leds comme une machine d'états. C'est un peu compliqué pour ce code.

Une solution plus simple est de changer les delay par une fonction qui va lire le bouton pendant 2 secondes et bloquer les leds en fonction de cet état. Exemple :

void lectureBouton() {
  static bool ledstate = true;
  do {
    unsigned long chrono = millis();
    while (millis() - chrono < 2000ul) {
      int reading = digitalRead(buttonPin);
      delay(30); // debounce
      if (reading == HIGH) { 
        ledstate = ! ledstate;
        break;
      }
    }
  } while (!ledstate);
}

C'est pas aussi simple que ça en a l'air lorsqu'on le décrit : j'ai tapé ça à la volée, je ne sais pas si ça marchera...
Tu remplaces ensuite tous les delay(2000); par lectureBouton();

Autre solution avec la bibliothèque MTobjects (on peut alors garder les delay() comme ils sont.

Comme c'est un appui qui active et désactive la séquence, il faut un MTchechButton. Le code devient (non testé):

#include "MTcheckButton.h" // Voir http://arduino.dansetrad.fr/MTobjects

const int buttonPin = 2;

MTcheckButton Bouton(buttonPin); // Déclaration du bouton, valeus par défaut

void setup() {
  pinMode(12, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  while (!Bouton.getSelect()); // On attend que le bouton soir "actif"
  
  digitalWrite(13, HIGH);
  digitalWrite(10, LOW);
  
  delay(200);
  
  digitalWrite(13, LOW);
  digitalWrite(12, HIGH );
  
  delay(200);
  
  digitalWrite(12,LOW);
  digitalWrite(8, HIGH );
  
  delay(200);
  
  digitalWrite(8, LOW);
  digitalWrite(7, HIGH);
  
  delay(200);
  
  digitalWrite(7, LOW);
  digitalWrite(4, HIGH);
  
  delay(200);
  
  digitalWrite(4, LOW);
  digitalWrite(10, HIGH);
  
  delay(200);
}

En faisant cela un appui sur le bouton bloquera le code quand il arrivera en début de séquence. On peut bien sûr modifier le comportement, mais "je veux que HIGH active et desactive la sequence" n'indique pas ce que l'on fait si la séquence est désactivée: on attend la fin de la séquence et on s'arrête? on éteint tout?...

J'ai supprimé des digitalWrite(?, LOW) qui ne servaient pour l'instant à rien (la sortie était déjà à LOW).
Pour les tests, j'ai aussi changé la sortie 1 en 10. La sortie 1, si elle est théoriquement utilisable, est à déconseiller, elle est utilisée pour charger le programme et pour l'affichage de la console.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.