Flash led et bouton poussoir

Bonjour,
Je suis novice, j'aimerai faire un truc simple mais je bloque.
Je m'explique, quand j'appuie sur un bouton poussoir, j'aimerai 1 seul flash de 1 seconde sur une Led puis elle s’éteint et ne se rallume plus même si le bouton reste enfoncé. Le prochain flash sera au prochain appui.
Avec mon code ci-dessous la led reste allumée tant que le bouton est enfoncé puis s’éteint 1 seconde plus tard. Je ne trouve pas mon problème.
Par avance merci beaucoup.

const int bouton = 8;  // la broche 8 devient bouton
const int led = 13;    // la broche 13 devient led
int etat;
void setup()
{
    pinMode(bouton, INPUT); // Initialise la broche 8 comme entrée
    pinMode(led, OUTPUT);   // Initialise la broche 13 comme sortie 
}
void loop()
{
    while ((digitalRead(bouton) == 1) && (etat == 1))   
           {
        etat = 0;
        digitalWrite(led, HIGH);  // allume la LED
        delay(1000);
        digitalWrite(led, LOW);  // éteint la LED
        etat = 0;

    } 
    if ((digitalRead(bouton) == 0) && (etat == 0))  
    {
       etat = 1; 
    }
}

avez vous une résistance de pull down externe ? votre bouton a-t-il des rebonds ?

PS: pourquoi avoir mis deux fois etat = 0; dans le while ?

Bonjour skyzo-boy

J'ai essayé ton programme, il fonctionne très bien, comme le fait remarquer @J-M-L, as tu mis une résistance de PULL_DOWN, j'ai mis 10k.

Cordialement
jpbbricole

Attention aussi, si le bouton a du rebond au relâchement, la led peut se rallumer quand on relâche le bouton. Y a-t-il un condensateur entre le 5V ou la masse et l'entrée?

Oui d’où ma question

Il peut aussi ajouter un petit délai avant la ligne
etat = 0;
genre
delay(30);

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

Le diagramme d'état est assez simple :

l'utilisation d'une bibliothèque de boutons vous simplifiera la vie (cf Button dans easyRun ou OneButton ou encore Toggle)

le code en utilisant OneButton (cf Tuto bibliothèque OneButton) donnerait quelque chose comme cela


#include <OneButton.h>

const byte pinBbouton = 8;
const byte pinLled = 13;

OneButton bouton(pinBbouton);
unsigned long debut;

enum {LED_OFF, LED_ON} etat = LED_OFF;

void allumer()  {
  digitalWrite(pinLled, HIGH);
  debut = millis();
  etat = LED_ON;
}

void eteindre() {
  digitalWrite(pinLled, LOW);
  etat = LED_OFF;
}

bool tempsEcoule() {
  return millis() - debut >= 1000ul;
}

void appui() {
  if (etat == LED_OFF) allumer();
}

void setup() {
  pinMode(pinLled, OUTPUT);   // Initialise la broche 13 comme sortie
  bouton.attachClick(appui);
}

void loop() {
  switch (etat) {
    case LED_OFF: bouton.tick(); break;
    case LED_ON: if (tempsEcoule()) eteindre(); break;
  }
}

Merci les gars pour vos conseils
, je viens de rajouter une résistance de 10k entre le +5v et modifier le programme et tout fonctionne.

Super
La broche était flottante donc ça faisait un peu n’importe quoi

Vous pouvez économiser la résistance en utilisant INPUT_PULLUP

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