Bonjour à tous, je suis actuellement en train de suivre le tuto Arduino et je cherchais par moi même comment créer un bouton à mémoire un bit, c'est à dire que lorsque l'on appuie sur le bouton la led s'allume et reste allumé puis lorsque l'on rappuie, la led s’éteint.
J'ai réalisé le même montage que l'on trouve sur cette page : http://www.siteduzero.com/sciences/tutoriels/arduino-pour-bien-commencer-en-electronique-et-en-programmation/recuperer-l-appui-du-bouton
Et voici mon code :
const int bouton = 2; //le bouton est connecté à la broche 2 de la carte Adruino
const int led = 13; //la LED à la broche 13
int etatBouton;
int etatLed;
void setup()
{
pinMode(led, OUTPUT); //la led est une sortie
pinMode(bouton, INPUT); //le bouton est une entrée
etatBouton = HIGH;
etatLed = HIGH;
}
void loop()
{
etatBouton = digitalRead(bouton); //Rappel : bouton = 2
if(etatBouton == LOW) //Si le bouton est appuyé
{
etatLed == !etatLed; //L'état de la Led change
}
else // Autrement
{
//Rien ne se passe
}
digitalWrite(led, etatLed);
}
- Edité par BlepBloupBlop 24 avril 2013 à 17:03:39
Il y a de l'idée, mais le problème de ce programme c'est qu'il ne prend pas en compte la variation d'état du bouton. Tu te contentes de vérifier uniquement qu'il est à l'état bas. Et comme ton programme fonctionne à une vitesse hallucinante (plusieurs milliers de fois par seconde), ta led va s'allumer et s'éteindre plusieurs fois par seconde et tu ne verras pas le changement.
As tu des idées comment résoudre ce problème (est-ce que je t'ai mis sur une piste ou juste embrouiller un peu plus ?)
Bin je ne vois pas trop non '^^ peut être mettre un timer dans la boucle pour bloquer l'état du bouton un moment histoire pouvoir enlever son doigt, genre 1 sec mais c'est tout, de plus en utilisant cette méthode, si l'utilisateur met trop de temps la led ne changera pas...
Il faudrait autrement réinitialiser la boucle quand le bouton pas de l'état Low à High
Pour modifier une valeur c’est = et non == (ligne 21).
Pour résoudre le problème du bouton, il y a deux méthodes, un flag ou une FSM (Finite State Machine = Machine à états).
Un flag (ou booléen) est une variable valant 0 ou 1 (faux ou vrai), tu pourrais faire un flag boutonAppuye, le mettre à 1 quand tu appuie sur le bouton, le mettre à 0 quand tu le relâches et changer l’état de la led si, lors de l’appui, le flag était à 0.
Une FSM permet d’implémenter un GRAFCET, sais-tu ce que c’est ?
Le concept est de repérer un changement d'état plutot qu'un état lui même. Comme le dit fscorpio, il faut utiliser un flag. Ainsi tu peux sauvegarder l'état du bouton au temps 't' et ensuite le comparé au temps 't-1' ou 't+1'. S'il y a eu le changement d'état que tu cherches (haut vers bas ou bas vers haut tu exécutes ton instruction, sinon tu ne fais rien !
Oui je vois ce qu'est un grafcet il n'y a pas de problème à ce niveau, et autrement pour le flag, je crée alors un booléen appelé EtatBouton par exemple et je compare la valeur du booléen à des valeurs antérieurs pour savoir si il y a eu changement d'état ?
J'ai essayé, mais je ne pense n'avoir réellement rien changé au programme d'origine et là j'ai plus trop d'idée :l
Si vous pouviez m'aider :
const int bouton = 2; //le bouton est connecté à la broche 2 de la carte Adruino
const int led = 13; //la LED à la broche 13
boolean x = 1;
int etatBouton; //variable qui enregistre l'état du bouton
int etatLed; //variable indiquand l'état de la LED
void setup()
{
pinMode(led, OUTPUT); //la led est une sortie
pinMode(bouton, INPUT); //le bouton est une entrée
etatBouton = HIGH; //on initialise l'état du bouton comme "relaché"
etatLed = HIGH;
}
void loop()
{
etatBouton = digitalRead(bouton); //Rappel : bouton = 2
if(etatBouton != x)
{
etatLed == !etatLed; //L'état de la Led change
x == etatBouton;
}
else // Autrement
{
//Rien ne se passe
}
digitalWrite(led, etatLed);
}
Arf, toujours bloqué mais j'ai l'impression de toucher au but, voici mon programme :
const int bouton = 2; //le bouton est connecté à la broche 2 de la carte Adruino
const int led = 13; //la LED à la broche 13
int memoire_bout = HIGH;
int etatBouton; //variable qui enregistre l'état du bouton
int etatLed; //variable indiquand l'état de la LED
void setup()
{
pinMode(led, OUTPUT); //la led est une sortie
pinMode(bouton, INPUT); //le bouton est une entrée
etatBouton = HIGH; //on initialise l'état du bouton comme "relaché"
etatLed = HIGH;
}
void loop()
{
etatBouton = digitalRead(bouton); //Rappel : bouton = 2
if((etatBouton != memoire_bout) && (etatBouton == LOW))
{
etatLed == !etatLed; //L'état de la Led change
}
memoire_bout == etatBouton;
digitalWrite(led, etatLed);
}
J'ai suivi le tuto et j'ai modifié la condition, je sais que mon programme ne marche pas comme il faut, mais normalement la Led devrai s'allumer si je reste appuyé sur le bouton, hors ce n'est pas le cas, si tu pouvais vite vérifier mon programme et me dire si je me suis de nouveau trompé ou non, cela serai utilse merci
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !