Comment puis-je briser cette boucle sur un bouton de la presse?
Je suis en train de créer un compte à rebours dans Arduino qui va commencer à la simple pression d'un bouton, et d'annuler en appuyant sur le même bouton. La valeur est comprise entre 0 - 60 et réglé par un potentiomètre. Le problème que j'ai est que je ne peut pas sortir de la boucle après son démarrage. Je sais que cela peut être fait à l'aide de la "casser", mais je ne vois pas où le mettre que le résultat sera comme souhaité. C'est ce que j'ai à ce jour:
const int buttonPin = 2; //The pin that the pushbutton is attached to
int buttonState = 0; //Current state of the button
int lastButtonState = 0; //Previous state of the button
void setup() {
//initialize serial communication:
Serial.begin(9600);
}
void timer(){
int pot_value = analogRead(A0); //read potentiometer value
if (pot_value > 17) { //i set it so, that it doesn't start before the value
//isn't greater than the 60th part of 1023
int timer_value = map(pot_value, 0, 1023, 0, 60); //Mapping pot values to timer
for (int i = timer_value; i >= 0; i--){ //Begin the loop
Serial.println(i);
delay(1000);
}
}
}
void loop() {
//Read the pushbutton input pin:
buttonState = digitalRead(buttonPin);
//Compare the buttonState to its previous state
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
//If the current state is HIGH then the button
//went from off to on:
timer(); //run timer
}
else {
//If the current state is LOW then the button
//went from on to off:
Serial.println("off");
}
}
//Save the current state as the last state,
//for next time through the loop
lastButtonState = buttonState;
}
Par exemple, si j'ai mis le potentiomètre 5 et appuyez sur le bouton je vois 5, 4, 3, 2, 1, 0, mais je ne peut pas sortir de il si j'appuie sur le bouton de nouveau jusqu'à la fin. Comment puis-je échapper à cette boucle sur la simple pression d'un bouton?
Vous devez vous connecter pour publier un commentaire.
Dans votre code, vous créez la boucle suivante:
Il est à l'intérieur d'une fonction qui est appelée lorsque le bouton est enfoncé. Pour sortir de la boucle,
il vous suffit d'ajouter un
break;
déclaration à l'intérieur de cette boucle. Mais le problème est de savoir commentpour vérifier l'état qui va vous aider à sortir de la boucle?
Vous auriez besoin de vérifier à nouveau la broche d'entrée (à l'aide de la
digitalRead
) à l'intérieur de la boucle. Maispourquoi vérifier deux fois l'état d'un bouton unique à l'intérieur d'un algorithme simple?
C'est pourquoi je vous suggère une autre de prendre sur votre problème, en utilisant un seul
loop
,le
loop()
fonction, l'utilisation d'un ensemble de trois variables d'état:last_button_state
pour détecter les états de transition de la touchecount_down
pour savoir si nous sommes dans un compte à rebours ou pascount_down_value
la valeur réelle du compte à reboursLes deux dernières valeurs pourraient être fusionnés en un seul (par exemple, définir
count_down
à-1
à direque nous ne sommes pas dans un compte à rebours de l'état), mais j'ai laissé ces deux variables d'état pour plus de clarté.
Là je m'attends à la sortie suivante:
Alors maintenant, il y a seulement deux scénarios possibles:
Si le potentiomètre est à 0, le bouton est désactivé.
count_down
de l'état sur le bouton de libération, il ne fonctionnera pas comme prévu 🙂 j'ai déplacé qu'à appuyez sur le bouton de l'état, de faire un retournement de l'état surcount_down
.loop
" (troisième alinéa, après le premier exemple de code)?Je remarque que le post est ici depuis un an maintenant, mais juste au cas où quelqu'un est toujours à la recherche d'une réponse...
À l'évasion de la boucle(){}? Avez-vous essayé d'appeler
Où vous le souhaitez pour sortir de cette boucle? comme:
Vous pouvez toujours mettre en retard de code en haut de la méthode pour éviter la répétition de code et d'éviter accidentellement de sauter en raison de pause au début de la boucle.
Je sais qu'il a été un moment depuis que cela a été actif, mais un gros problème que je peux voir avec la réponse précédente est l'utilisation de retards, où si je suis le lire correctement, il donne de 1,5 seconde compte, au lieu de 1 seconde.
Une meilleure réponse serait de calculer le temps écoulé depuis la dernière compté puis si elle est de 1 seconde ou plus. Il pourrait être un peu hors sujet, mais il est beaucoup plus proche du 1 seconde.
Elle résout également un autre problème est que le bouton ne peut exister entre ces retards, donnant un court laps de temps toutes les 1,5 seconde ou deux, de sorte que vous pourriez avoir besoin pour maintenir enfoncé le bouton pendant 1,5 secondes pour l'arrêter, plutôt que de simplement pousser à arrêter.
Je voudrais faire quelque chose de plus comme ceci:
De cette façon, le bouton est coché chaque boucle et la boucle est exécuté en permanence plutôt que de la pause pour la deuxième attente du compte à rebours et le calcul de chaque seconde.