Je suis nouveau sur ce forum et en programmation sur l’arduino, j’ai besoin que lorsque j’appuis sur un bouton poussoir faut que l’appui soit maintenus pendant 3 sec (par exemple) et au bout de se délais la une LED s’allume (par exemple).
J’ai passé un sacre temps a chercher des tuto sur internet mais jais rien trouver
Je m’en doute que faut que j’utilise la fonction Millis mais j’arrive vraiment pas a maitre au point la structure du programme.
const int APPUI=0; // Bouton apuiller
const int PAS_APPUI=1; //Bouton pas apuiller
int ETAT_BP; // Variable etat du bouton
char start;
void setup() {
pinMode(2, INPUT); // Button
digitalWrite(2, HIGH) ; // activation du pullup de la broche en entrée
pinMode(13, OUTPUT); // LED
}
void loop() {
ETAT_BP=digitalRead(2); // lit l'état du BP et met la valeur 0/1 dans la variable "ETAT_BP"
if (ETAT_BP==APPUI){ // si l'état du BP est appuyé
start=millis();
if (ETAT_BP==APPUI==millis()-start>=3000) {
digitalWrite (13 , HIGH); // allumer LED
}// fin 2eme if
}// fin 1 er if
else (ETAT_BP==PAS_APPUI);{ // si l'état du BP est pas appuyé
digitalWrite (13 , LOW); // eteint LED
} //fin de else if
} // fin dr void loop
Ca marche bien MERCI , par contre au démarrage de la carte il a y bien les 3 sec après l’appui sur le bouton , par contre comment je fait pour faire un reset de Millis ? , car après la LED s’allume normalement je suppose que Millis ne se remet pas a 0 après une boucle complété du programme :O.
Dans ta boucle, tu lis la valeur de millis() à chaque fois que tu passe et que bouton est appuyé.
Il est impossible que tu puisses alors mesurer une différence de 3 secondes.
Cela fonctionne une fois parce que ton test ETAT_BP==APPUI==Milis()-start>=3000 est faux également.
Il y a deux tests à faire : ETAT_BP==APPUI et Millis()-start >= 3000
Il faut donc modifier ton test et changer l'assignation de start afin qu'il ne soit assigné qu'au début de la période d'appui du bouton. (Tu pourrais utiliser une variable booléenne pour cela par exemple...
Voilà... Je te laisse plancher un peu sur la chose...
Bonjour, j'aimerais faire un clignotant temporisé 10s .
un appuie sur l'inter je lance la tempo clignotante si
aucune action la tempo s'arrête au bout de 10s et led ON.
si avant l'arrêt de la tempo j'appuie une nouvelle fois je dois
pouvoir l'arrêter celle si et led off.
et je dois pouvoir relancer le cycle.
j'ai fais un code mais il ne fonctionne pas comme ça.
un appuie sur l'inter la tempo clignotante se lance 10s ,
et puis s'arrête et led on.
si un autre appuie pendant la tempo cela arrête bien
celle si et led off. (enfin la led s'éteint mais je pense
que la tempo ne s'arrête pas ).
le problème est que je ne peux pas redémarrer le cycle
avec un autre appuie sur l'inter .
quand j'appuie une autre fois la led s'allume et reste
allumée fixe.
voila ou j'en suis .
merci de votre aide.
voici mon code
const int LED = 13 ;
const int BP = 2 ;
int etat_LED = 0 ;
int etat_BP = 0 ;
unsigned long ms_precedente = 0 ;
// variable qui stocke le dernier temps.
const long interval_clignot = 500 ;
void setup ()
{
pinMode ( LED , OUTPUT ) ;
pinMode ( BP , INPUT_PULLUP ) ;
}
void loop ()
{
etat_BP = digitalRead ( BP ) ;
if ( etat_BP == HIGH )
{
digitalWrite ( LED , LOW ) ;
}
if ( etat_BP == LOW )
{
unsigned long ms_actuelle = millis () ;
// on stocke le temps actuel dans une variable
// ms_actuelle.
if ( ms_actuelle - ms_precedente >= interval_clignot )
// si le temps actuel ( ms_actuelle ) - ( ms_précédente )
// est supérieur ou égal à ( interval_clignot )
// soit 1000s faire ---->
{
ms_precedente = ms_actuelle ;
// on stocke la nouvelle valeur de temps passé (ms_actuelle)
// dans la variable ms_precedente.
if ( etat_LED == LOW )
etat_LED = HIGH ;
else
etat_LED = LOW ;
digitalWrite ( LED , etat_LED ) ;
if ( ms_precedente > 10000 )
{
digitalWrite ( LED , HIGH ) ;
}}}}
Tu essaies de faire la gestion de la led quand le bouton est appuyé, ça ne peut pas fonctionner car le traitement de la led (en particulier le clignotement) doit être fait tout le temps.
Il faut que tu découpes ton programme en deux parties
traitement du bouton et détermination de l'état de la led
gestion de l'état de la led.
Par exemple comme ceci
const int LED = 13;
const int BP = 2;
enum {ETEINT, ALLUME, CLIGNOTANT} etat_LED = ETEINT;
const long interval_clignot = 500;
void setup ()
{
pinMode(LED , OUTPUT);
pinMode(BP , INPUT_PULLUP);
}
void loop ()
{
static int etat_BP_Prec=HIGH;
static unsigned long millisDebutClig=0;
static unsigned long millisLastClig=0;
int etat_BP = digitalRead (BP);
if (etat_BP!=etat_BP_Prec)
{
etat_BP_Prec=etat_BP;
delay(20); // anti rebond
if (etat_BP==LOW)
{
// on vient d'appuyer sur le bouton
switch (etat_LED)
{
case ETEINT:
etat_LED=CLIGNOTANT;
millisDebutClig=millis();
break;
case ALLUME:
case CLIGNOTANT:
etat_LED=ETEINT;
break;
}
}
}
switch (etat_LED)
{
case ALLUME:
digitalWrite(LED,HIGH);
break;
case ETEINT:
digitalWrite(LED,LOW);
break;
case CLIGNOTANT:
if (millis()-millisDebutClig<10000)
{
if (millis()-millisLastClig>=interval_clignot)
{
digitalWrite(LED,!digitalRead(LED));
millisLastClig=millis();
}
}
else
{
etat_LED=ALLUME;
}
break;
}
}