Salut a tous!
Je travaille actuellement sur un code pour incrémenter ou décrémenter un afficheur 7 segments avec 2 boutons.
Quelqu'un saurait me' dire pourquoi cela ne fonctionne pas? Niveau montage ça doit aller car avec un code "Test" un peu différent j'arrive a allumer et éteindre des leds de l'afficheur avec mémoire de 1 à 4.
Voici le contenu du code qui ne fonctionne pas:
L'afficheur est complètement allumé et rien ne se passe lors de l'appui des boutons
si bouton_plus=1
donc on incrémente
si compteur>9
donc compteur = 9
si compteur<0
donc compteur = 0
si bouton moins=1
si bouton_plus et bouton_moins = 0
on fait rien
infobarquee:
c'est pas de l'électronique là, mais du bon sens
void loop()
{ etat_bouton = digitalRead(btn_plus);
if((etat_bouton != memoire_plus) && (etat_bouton == LOW))//ca veut rien dire memoire_plus est HIGH, donc pourquoi meetre etat bouton LOW en plus??????
{
chiffre++;
}
@infobarquee je pense que tu devrais te méfier de ton bon sens.
Dans la ligne en question, on teste une transition, si l'état actuel est différent de l'état précédent cela ne présume en rien de l'état du bouton. Donc on ajoute à la condition le test sur etat_bouton =low pour détecter un front descendant.
mémoire_plus est à high parce qu'on suppose qu'au démarrage le bouton est au repos et donc high lui aussi. Ensuite mémoire_plus est mis à jour à chaque passage dans la boucle.
mon bon sens est des plus logique je pense.
si on appuie sur un bouton, il passe de LOW à HIGH, non?
si on le relache, il passe de HIGH à LOW, non?
donc pourquoi se compliquer la vie a vérifier quelque chose qui est "logique" (high ou low) ?
d'ou ma logique plus haut, modifié pour plus de clareté
si bouton_plus=1 => compteur = compteur+1
si bouton_moins=1 => compteur = compteur -1
si bouton_plus et bouton_moins = 0 => on fait rien donc compteur=compteur
si compteur>4
donc compteur =4
si compteur<0
donc compteur = 0
sinon compteur = compteur
infobarquee:
mon bon sens est des plus logique je pense.
si on appuie sur un bouton, il passe de LOW à HIGH, non?
si on le relache, il passe de HIGH à LOW, non?
Déjà là cela dépend du câblage dudit bouton et de son type (normalement ouvert/normalement fermé).
Le programme tel qu'il était présenté donnait plutôt à penser que le bouton était actif à l'état bas.
infobarquee:
donc pourquoi se compliquer la vie a vérifier quelque chose qui est "logique" (high ou low) ?
d'ou ma logique plus haut, modifié pour plus de clareté
si bouton_plus=1 => compteur = compteur+1
si bouton_moins=1 => compteur = compteur -1
si bouton_plus et bouton_moins = 0 => on fait rien donc compteur=compteur
si compteur>4
donc compteur =4
si compteur<0
donc compteur = 0
sinon compteur = compteur
Parce que si on fait ça est que l'on tient le bouton le compteur s'incrémente tout seul.
En prenant en compte l'état précédent du bouton on détecte une transition et donc on ne prend en compte qu'une fois même si le bouton reste appuyé longtemps. A condition bien sur que le bouton ne rebondisse pas trop.
Déjà là cela dépend du câblage dudit bouton et de son type (normalement ouvert/normalement fermé).
Le programme tel qu'il était présenté donnait plutôt à penser que le bouton était actif à l'état bas.
en général, on part du principe que le bouton est NO dans 95% des cas.
mais ca ne change rien au pb.
Parce que si on fait ça est que l'on tient le bouton le compteur s'incrémente tout seul.
En prenant en compte l'état précédent du bouton on détecte une transition et donc on ne prend en compte qu'une fois même si le bouton reste appuyé longtemps. A condition bien sur que le bouton ne rebondisse pas trop.
c'est juste une logique pas un programme complet
je préfère utiliser la notion de temps (millis) pour définir la durée d'appuie sur le bouton afin de déterminer s'il est toujours "enfoncé" ou non, ca peut éviter aussi les appuies involontaires ou les rebonds possibles.
si temps_mini_appuie < 50 ou temps_maxi_appuie > 200 => on boucle (valeurs mises au pif )
avec la méthode de transition, s'il y a des rebonds, tout va passer de HIGH à LOW et vis versa en permanence, ce qui peut être critique dans certains cas.
ceci n'est que mon avis perso.
enfin chacun sa méthode, laquelle est la meilleure? je ne saurais le dire.