étudiez ce code
J'AI MIS 2 BUG DANS LE CODE
A VOUS DE LES TROUVER POUR COMPRENDRE LA LOGIQUE
le délai pour tenir le bouton enfoncé est de 5 secondes pour le test car pas la patience d'attendre 20 secondes. c'est réglable dans le define DELAI_PRESSION
// NOTE j'utilise le bouton pour connecter la pin au GROUND avec un INPUT_PULLUP.
// donc quand la pin voit HIGH c'est que le bouton n'est PAS appuyé
// quand la pin voit LOW c'est que le bouton est appuyé
// la "logique" est inversée
const int bpPin = 8; // le bouton est connecté sur la pin 8 configurée en PULLUP.
#define BOUTON_ENFONCE LOW // pour la lisibilité du code
#define DELAI_PRESSION 5000UL // le UL pour dire unsigned Long (j'ai mis 5 secondes pour tester, mettre 20000UL pour 20 secondes)
boolean boutonAppuye; // vrai si le bouton est appuyé
unsigned long tempsDebut; // pour mesurer le temps d'appui
boolean enCoursDeDecompte; // vrai si le bouton a été appuyé plus de DELAI_PRESSION ms
#define DUREE_DECOMPTE 20000UL // on va décompter 20 secondes
long compteur; // la variable qui contient le nombre de secondes restantes quand on décompte
unsigned long debutTempsDecompte; // le moment de démarrage du décompte
void setup() {
Serial.begin(115200);
pinMode(bpPin, INPUT_PULLUP);
boutonAppuye = false ;
enCoursDeDecompte = false;
}
void testAppuiLong()
{
byte positionDuBouton = digitalRead(bpPin);
if (( positionDuBouton == BOUTON_ENFONCE) && (!boutonAppuye)) { // le ! veut dire NOT
// le bouton est enfoncé et ne l'était pas avant, donc c'est un appui
boutonAppuye = true;
tempsDebut = millis();
// CODE DE DEBUG ----------------------------------------------
Serial.print("\n\nBouton appuye tps =");
Serial.print(tempsDebut);
Serial.println(" ms");
// ------------------------------------------------------------
} else if (( positionDuBouton != BOUTON_ENFONCE) && (boutonAppuye) ) {
// le bouton n'est plus enfoncé et l'était avant, donc c'est un relachement. boutonAppuye = false;
// CODE DE DEBUG ----------------------------------------------
Serial.println("bouton off");
// ------------------------------------------------------------
}
if ((!enCoursDeDecompte) && boutonAppuye && (millis() - tempsDebut >= DELAI_PRESSION)) {
enCoursDeDecompte = true;
debutTempsDecompte = millis();
compteur = (DUREE_DECOMPTE / 1000UL);
// CODE DE DEBUG ----------------------------------------------
Serial.print("Bingo - bouton appuye assez longtemps (");
Serial.print(millis() - tempsDebut);
Serial.println(" ms)\n\n");
// ------------------------------------------------------------
}
}
void effectuerDecompte()
{
static unsigned long dernierMomentAffichage = 0UL;
if (millis() - dernierMomentAffichage >= 1000UL) { // une seconde s'est elle écoulée?
// on affiche quelque chose toutes les secondes et on met à jour le dernierMomentAffichage avec millis()
dernierMomentAffichage = millis();
if (compteur > 0) {
// CODE DE DEBUG ----------------------------------------------
Serial.print("Temps restant = ");
Serial.print(compteur);
Serial.println(" s");
// ------------------------------------------------------------
// on décrémente le temps restant d'une seconde compteur--;
} else {
// CODE DE DEBUG ----------------------------------------------
if (compteur == 0) Serial.println("BOUM!"); else Serial.print(".");
// ------------------------------------------------------------
compteur--; // le compteur passe négatif et contient le nombre de secondes depuis l'expiration du délai
}
}
}
void loop() {
if (enCoursDeDecompte) {
// faire ici le décompte
effectuerDecompte();
} else {
// on regarde s'il y a un long appui
testAppuiLong();
}
}
Pour tester, chargez le code sur votre arduino, connectez la console à 115200, connectez un bout de fil sur la pin 8 et touchez la masse (connectez à une pin ground) pour simuler l'appui sur le bouton.
quand vous aurez compris le code et enlevé les 2 bugs; vous pourrez voir cela (j'ai appuyé 1 fois pas assez longtemps et suffisamment longtemps la 2ème fois)
Bouton appuye tps =12692 ms
bouton off
Bouton appuye tps =15979 ms
Bingo - bouton appuye assez longtemps (5000 ms)
Temps restant = 20 s
Temps restant = 19 s
Temps restant = 18 s
Temps restant = 17 s
Temps restant = 16 s
Temps restant = 15 s
Temps restant = 14 s
Temps restant = 13 s
Temps restant = 12 s
Temps restant = 11 s
Temps restant = 10 s
Temps restant = 9 s
Temps restant = 8 s
Temps restant = 7 s
Temps restant = 6 s
Temps restant = 5 s
Temps restant = 4 s
Temps restant = 3 s
Temps restant = 2 s
Temps restant = 1 s
BOUM!
.................