comment ne prendre en compte une info que si elle dure plus de x secondes
Vous lisez l'info de temps en temps (assez souvent). quand elle s'active vous notez l'heure (millis) et marquez que vous attendez maintenant une désactivation (phase de mesure de la durée)
Quand elle se désactive vous notez la nouvelle heure et marquez que vous êtes sorti de l'état "attente de désactivation" et passez à un état prise d'Action
la différence entre les deux temps vous donne le temps "activé" et vous utilisez cette information pour déclencher ou pas votre action
C'est donc une petite machine à états.
par exemple essayez ce code
const byte pinDuBouton = 2;
unsigned long debut, fin, duree;
enum {attente, mesure, action} etat;
void setup() {
Serial.begin(115200);
pinMode(pinDuBouton, INPUT_PULLUP);
etat = attente;
}
void loop() {
switch (etat) {
case attente:
if (digitalRead(pinDuBouton) == LOW) {
// bouton appuyé
debut = millis();
Serial.print(F("ON @")); Serial.println(debut);
delay(15); // petit hack pour ne pas avoir de rebond, OK si vous êtes intéressé par des appuis humains
etat = mesure;
}
break;
case mesure:
if (digitalRead(pinDuBouton) == HIGH) {
// bouton relâché
fin = millis();
Serial.print(F("OFF @")); Serial.println(fin);
duree = fin - debut;
etat = action; // ou on pourrait faire le test sur la durée ici ou au prochain tour de loop
}
break;
case action:
Serial.print(F("La duree d'appui sur le bouton est de "));
Serial.print(duree);
Serial.println(F(" ms"));
if (duree > 3000) {
Serial.print(F("ACTION !!! -> Plus de 3 secondes, wow !!"));
}
etat = attente;
break;
}
}
vous branchez un petit fil dans la pin 2 de votre Arduino et mettez l'autre bout à GND pour simuler l'appui sur le bouton et l'enlevez pour simuler le relâchement du bouton. ça vous donnera des petits messages sur la console série (réglée à 115200 bauds) expliquant ce qu'il se passe.
