J'essaie d'écrire du code pour qu'une LED s'allume lorsqu'elle est éteinte et s'éteigne lorsqu'elle est allumée à l'aide d'un bouton-poussoir tactile. J'ai écrit ce que je pense être le bon code avec la bibliothèque de câblagePi, mais je ne peux le faire s'allumer que lorsqu'il est éteint et je ne peux pas le faire s'éteindre après cela. Dans de très rares cas et après de nombreuses pressions répétées, la LED s'éteint lorsqu'elle est allumée et j'appuie sur le bouton, mais je suis sûr que ce n'est pas comme cela que cela devrait fonctionner.
#include <wiringPi.h>
int main (void)
{
wiringPiSetup ();
pinMode (0, OUTPUT);
pinMode (1, INPUT);
digitalWrite (0, LOW);
for(;;)
{
if(digitalRead (1) == LOW)
{
if(digitalRead (0) == HIGH)
digitalWrite (0, LOW);
else if(digitalRead (0) == LOW)
digitalWrite (0, HIGH);
}
}
return 0;
}
J'ai joint une image de la façon dont le circuit est câblé.
Réponses:
Le câblage semble correct pour le code.
Le problème est que le code est dans une boucle très serrée. En théorie, lorsque le bouton est enfoncé, le corps de boucle allume et éteint la LED à plusieurs reprises. En théorie, il y aurait 50/50 de chances que la LED reste allumée (ou éteinte) lorsque le bouton est relâché. Avez-vous remarqué un changement de luminosité lorsque vous appuyez sur le bouton. Il n'y en a peut-être pas assez pour être remarqué.
En pratique, la raison de la tendance à laisser la LED allumée est la façon dont vous testez pour voir si elle est déjà allumée. L'écriture de la broche 0 HIGH applique 3,3 V à la sortie. Mais ce fil est connecté à la LED et la broche est configurée pour être une sortie. La LED baisse peut-être la tension suffisamment bas pour ne pas s'enregistrer comme ÉLEVÉE lorsqu'elle est lue, mais parfois c'est parce qu'elle est proche de la coupure.
En pratique, le code pour éteindre et rallumer la LED à chaque pression sur un bouton utiliserait une interruption déclenchée par un front descendant. Comme indiqué dans les commentaires, vous voudrez peut-être rebondir l'interruption dans ce cas. Vous pouvez également faire la même chose sans interruption en enregistrant l'état précédent du bouton et en ne modifiant la LED que lorsque l'état du bouton a changé. Débondir pendant l'écriture du code n'a plus de sens.
la source
Il est probablement plus simple de conserver "état" dans des variables normales plutôt que d'essayer de le déduire de l'état GPIO actuel.
De plus, la «boucle occupée» consommera chaque cycle de CPU que le système d'exploitation autorisera le processus; pour un processus aussi simple, vous verrez que votre charge CPU augmentera à 100%! Vous devez autoriser le processus à abandonner le CPU à d'autres tâches avec un
usleep()
appel par exemple. Le retard servira également à rebondir l'interrupteur.la source