unsigned long TempsDebut;
boolean boutonAppuye; // vrai si le bouton est appuyé
Initialiser boutonAppuye = false ; dans le setup()
Dans la loop()
vous regardez l'état du bp
S' il est enfoncé (lire digitalRead(bpPin) == LOW ou == HIGH // (suivant si vous utilisez un pull up ou pas) et qu'il n'était pas enfoncé juste avant (boutonAppuye == false) vous enregistrez millis() TempsDebut = millis(); et mettez le booléen "bouton enfoncé" à vrai boutonAppuye = true;
S'il est relâché alors boutonAppuye = false ;
Si boutonAppuye ET si (millis()-TempsDebut >= 20000UL) alors 20 secondes se sont écoulées, mettre l'état actif
Quel est votre niveau d'expérience avec du code? Le principe du forum est d'aider à améliorer du code ou faire des suggestions - pas de coder à votre place
ben mon experience avec le code et minim par ex: digitalWrite , assembler des code simple facile a déchiffrer mais je ne comprend pas tout les variable ,Boolean ,char ,millis etc ...
Tu télécharge le tuto d'Eskimon et tu réalise les exemples basiques.
Tu n'apprendra jamais en voulant tout faire en même temps : apprendre à programmer et faire un produit.
Procède calmement par étape, perdre un peu de temps au début est la méthode la plus sûre pour atteindre rapidement son objectif.
Merci b@tto ,
mais ce n'est pas ce que je recherche ,moi je recherche comment faire pour que pour lancer mon compte a rebours il faut appuyer sur le bouton poussoir pendant exemple 10 secondes
Coco62131:
Merci b@tto ,
mais ce n'est pas ce que je recherche ,moi je recherche comment faire pour que pour lancer mon compte a rebours il faut appuyer sur le bouton poussoir pendant exemple 10 secondes
Si tu prenais la peine d'essayer de comprendre tu te rendrais qu'à un digitalRead() près c'est la même chose ...
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!
.................