Je suis débutant en électronique et je suis actuellement au tutoriel "Un Simple Bouton" que j'ai réussi à faire sans aucune difficulté.
Afin de pouvoir progresser, j'ai décidé de refaire le tutoriel "feu de signalisation routière" en y ajoutant un bouton.
J'aurais aimé que toutes les led s’éteignent quand le bouton est appuyé et que le feu redémarre quand le bouton est relâché.
Actuellement cela s'effectue parfaitement bien sauf que quand j’appuie sur le bouton, le feu termine son cycle ( si au moment où j’appuie c'est une led verte qui est allumée, je dois attendre que la led rouge s'allume pour que le feu s'éteigne )
Comment faire pour qu'au moment où j'appuie sur le bouton, toutes les leds s'éteignent tout de suite ?(sans attendre que la boucle se termine )
Voici mon code :
const int bouton = 9;
const int led_v_1 = 4;
const int led_j_1 = 3;
const int led_r_1 = 2;
const int led_v_2 = 8;
const int led_j_2 = 7;
const int led_r_2 = 6;
Ahhhh mes yeux !!! rajoutes une balise code pour le confort de lecture
Sinon pour répondre à ta question : Ce n'est pas possible avec une structure de code utilisant des "delay" qui sont des fonctions bloquantes. Pour changer cela tu peux utiliser un "switch case" avec une variable t'indiquant l'état ou tu te trouves et comparé le temps écoulé grace à la fonction millis...
Tu peux essayer, et j'afficherais une solution si tu trouves ca trop compliqué
Le code ci dessus est exactement le même que le tiens comportemenalement (à une toute petite différence près : je coupe les feux rouge avant de les allumer, à l'initialisation. C'est totalement invisible).
Quel est l'intérêt de monde code par rapport au tiens ? on voit en ligne 49 une boucle sur les feux et les couleurs. Plutôt que de faire tout d'un coup, il est possible de ne faire qu'un changement à la fois, en mémorisant où on en est dans la séquence, et le faire à chaque appel de loop(). Ainsi on n'attends plus que maximum 3 secondes pour prendre en compte l'appui du bouton. C'est trop long ? Si tu as cette solution, tu auras à chaque appel de loop() une incrémentation de la couleur ou du feu puis les instructions de la boucle, en finissant par un delay. Il suffit de retirer le delay, et de ne faire les incrémentations que quand il s'est passé suffisamment de temps depuis la précédente incrémentation (chose que tu peux savoir en utilisant la fonction millis indiquée par eskimon).
Etant donné que le programme utilise une seule séquence, ça me semble être une solution plus facile à maintenir (au cas où on souhaiterait modifier la séquence) que les switch d'eskimon. Cependant, sa méthode est plus générique et permet de traiter plus de cas. Il peut être intéressant pour toi de tenter d'écrire le programme avec les deux solutions.
Nathalya, aucun doute que ton code est correcte et que tu as de formidables compétences en info/algo, mais le copier coller vient du fait que ce code est un des premiers du tuto Arduino. Autrement dit on apprend les choses en douceur, s'en tout de suite se mettre à faire des doubles tableaux de broches et compagnie...
Le but du tuto n'est pas de se dire "C'est moi qui code le mieux et le plus compacte" mais plutot d'apprendre à son rythme...
Sinon pour répondre à ta question : Ce n'est pas possible avec une structure de code utilisant des "delay" qui sont des fonctions bloquantes. Pour changer cela tu peux utiliser un "switch case" avec une variable t'indiquant l'état ou tu te trouves et comparé le temps écoulé grace à la fonction millis...
Je suis pas tout as fait d'accord, car on a inséré une partie, dans ce même chapitre me semble-t-il, sur les interruptions matérielles. Donc en connectant son bouton sur la broche 2 ou 3, il peut géré le bouton et dès qu'il est appuyé éteindre les feux. Voilà toute l'astuce de cette partie sur les interruptions matérielles. Peut-être n'y avons-nous pas assez mis l'accent dessus ?
A tiens oui je n'y pensais pas... A tester ! (mais du coup il faudra conserver les feux éteint dans la boucle d'interruption (donc elle devient bloqué) ce qui n'est pas très propre...
6 ans plus tard, quelqu'un aurait un code approprié utilisant la fonction millis() à proposer
Merci d'avance
Arduino Feu tricolore + interupteur
× 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 !