Bonsoir a tous
Je rencontre un problème simple que je n'arrive pas à résoudre
J'ai passé l'après-midi sur internet, maintenant je ne sais plus ou j'en suis
je cherche à allumer une Led avec un BP pendant 5 secondes sans delay() mais avec millis()
Voici le code que j'ai réalisé mais la Led reste allumée
merci de votre aide
//le bouton est connecté à la broche 3 de la carte Adruino
const int BPM = 3;
//la sortie à la broche 4
const int SortieM = 4;
// variable temps en ms
unsigned long time;
void setup()
{
pinMode(SortieM, OUTPUT); //la sortie est une sortie......
pinMode(BPM, INPUT); //le bouton est une entrée
digitalWrite(BPM, HIGH); // turn on pullup resistors
pinMode(BPM, HIGH);
}
void loop()
{
//est-ce un appui
if ( digitalRead(BPM) == LOW ){
time = millis(), digitalWrite(SortieM,HIGH);
if (millis()-time >= 3000) {
digitalWrite(SortieM,LOW); //on éteint la led
}
}
}
bonjour,
normal, tu mets la condition dans la condition du bouton.
sors cette condition en dehors du if.
de plus tu utilise un nom de variable réservé time
remplace par temps par exemple
ca m'étonnerais en plus que ton code compile tel quel
Ça fonctionne très bien
Merci encore
Je mets le programme si ça peux intéressé quelqu'un
//le bouton est connecté à la broche 3 de la carte Adruino
const int BPM = 3;
//la sortie à la broche 4
const int SortieM = 4;
// variable temps en ms
unsigned long temps;
// variables anti-rebond
unsigned long TempsEcoule; // variable pour mémoriser le temps écoulé depuis le dernier changement
void setup()
{
pinMode(SortieM, OUTPUT); //la sortie est une sortie
pinMode(BPM, INPUT); //le bouton est une entrée
digitalWrite(BPM, HIGH); // turn on pullup resistors
pinMode(BPM, HIGH);
}
void loop()
{
//est-ce un appui
if ( digitalRead(BPM) == LOW )
{
TempsEcoule = millis();
temps = millis(); // on demarre le comptage
if (millis() - TempsEcoule >= 50)
{
digitalWrite(SortieM,HIGH); // on active la sortie
}
if (millis()-temps >= 150000) // 150000 = 2m30
{
digitalWrite(SortieM,LOW); //on éteint la led
}
}
}
si des fois il y a des améliorations à faire, je suis preneur
pinMode(BPM, INPUT); //le bouton est une entrée
digitalWrite(BPM, HIGH); // turn on pullup resistors
pinMode(BPM, HIGH);
par:
pinMode(BPM, INPUT_PULLUP);
Tu devrais aussi intégrer une méthode de debouncing pour ton bouton. Etudie le code à la fin de cette page (mais tiens compte du fait que ton bouton est branché en Active LOW tandis que celui dans la page est branché en Active HIGH).
C'est vrai qu'il y a souvent des subtilités dans l'utilisation des boutons.
Là, tel que le programme et codé, le délai de 3 secondes démarre APRES relâchement du bouton.
Par exemple, un appui sur le bouton pendant 5 secondes, va entraîner une led allumée pendant 8 secondes.
Et dans les 5 premières secondes, le programme va passer son temps à exécuter le premier if, et répéter de manière inutile l'instruction digitalWrite(...,HIGH).
Si c'est bien le mode de fonctionnement souhaité, alors pas de problème et pas besoin d'anti-rebond.
Par contre, si la led doit être allumée pendant 3 secondes à partir du début d'appui du bouton, puis s'éteindre même si myosotys60 s'est endormi sur le bouton, alors le code ne sera pas tout à fait le même, et là une gestion d'anti-rebond sera nécessaire.
Merci pour vos remarques très instructives.
En fait, cela ne dérange rien que le programme commence après relâchement du BP.
Mais cela ne coute rien d'y ajouter un "delay(100)"
Les modifications ont été apportées au post 4
Oui mais en général, quand on gère les temporisations par millis() au lieu de delay(), c'est pour que l'arduino puisse faire autre chose en parallèle.
Donc ajouter un delay(100) est rarement adéquat.
Tu peux également gérer cette petite temporisation via la fonction millis() + une ou deux variables d'état.
oui tout a fait, c'est le but fixé
j'ai mis delay pour faire rapide car pour l'instant le temps m'est compté
des que possible je fais le debounce avec millis()
Il m'est arrivé d'avoir un bouton qui était très sensible et qui parfois se fermait tout seul... depuis j'utilise toujours un debounce sur mes boutons, pour être sûr.
Un delay n'est pas une bonne solution de debouncing (dans un cas comme le mien, et plus généralement si ton programme doit gérer autre chose pendant ce temps).
je laisse ici le programme qui fonctionne sans le debounce
//le bouton est connecté à la broche 3 de la carte Adruino
const int BPM = 3;
//la sortie à la broche 4
const int SortieM = 4;
// variable temps en ms
unsigned long temps;
void setup()
{
pinMode(SortieM, OUTPUT); //la sortie est une sortie
pinMode(BPM, INPUT_PULLUP); //le bouton est une entrée
}
void loop()
{
//est-ce un appui
if ( digitalRead(BPM) == LOW )
{
temps = millis(); // on demarre le comptage
digitalWrite(SortieM,HIGH); // on active la sortie
}
if (millis()-temps >= 5000) // 150000 = 2m30
{
digitalWrite(SortieM,LOW); //on éteint la led
}
}