Wie kann ich brechen diese Schleife auf eine Taste drücken?
Ich versuche zu erstellen, einen countdown-timer in der Arduino gestartet wird auf Knopfdruck, und das wird auch Abbruch bei drücken der gleichen Taste. Der Wert wird zwischen 0 - 60 und eingestellt durch ein potentiometer. Ich habe das problem bisher ist, dass ich nicht beenden Sie die Schleife, nachdem es beginnt. Ich weiß, dass es getan werden kann, mit der 'Pause', aber ich kann nicht herausfinden, wo zu setzen, dass das Ergebnis wie gewünscht. Dies ist, was ich habe, so weit:
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;
}
Wenn ich zum Beispiel einstellen, das potentiometer auf 5 und drücken Sie die Taste sehe ich 5, 4, 3, 2, 1, 0, aus, aber ich kann nicht brechen aus ihm heraus, wenn ich drücken Sie die Taste erneut, bis es abgeschlossen ist. Wie kann ich aus diesem loop auf Knopfdruck?
InformationsquelleAutor skamsie | 2013-06-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem code haben, erstellen Sie die folgende Schleife:
Es ist im inneren eine Funktion, die aufgerufen wird, wenn die Taste gedrückt wird. Brechen aus der Schleife,
Sie einfach hinzufügen ein
break;
- Anweisung innerhalb dieser Schleife. Aber das problem ist, wieüberprüfen der Bedingung, dass wird Ihnen helfen, brechen aus der Schleife heraus?
Würden Sie brauchen, um zu überprüfen, wieder der pin Eingabe (über die
digitalRead
) innerhalb der Schleife. Aberwarum schauen Sie zwei mal den Zustand von einem einzigen button in einem einfachen Algorithmus?
Dass der Grund, warum ich schlage vor, Sie ein anderes nehmen auf Ihr problem, mit einer einzigen
loop
,die
loop()
- Funktion, verwenden Sie einen Satz von drei Variablen:last_button_state
für die Erkennung des übergangs Zustände der Schaltflächecount_down
zu wissen, ob wir in ein count-down-oder nichtcount_down_value
den tatsächlichen Wert der countdownDen letzten beiden Werte können zusammengefasst werden (z.B. durch setzen
count_down
zu-1
zu sagendass wir uns nicht in eine count-down-Zustand), aber ich habe diese beiden Variablen aus, für Klarheit.
Da würde ich erwarten, dass die folgende Ausgabe:
So, jetzt gibt es nur zwei mögliche Szenarien:
Wenn das potentiometer auf 0, ist die Schaltfläche deaktiviert.
oh sorry, war der Grund meiner Kommentare. In der Tat, wenn ich
count_down
Zustand auf-Taste loslassen, wird es nicht funktionieren, wie erwartet 🙂 ich zog, um die Taste drücken Zustand, so dass ein kippen Staat aufcount_down
.zmo Leider jetzt ist das Ergebnis genau so hatte ich es von Anfang an. Der countdown startet, aber das betätigen einer Taste nicht stoppen...ich denke, die Lösung wäre zu überprüfen, ob die Bedingung noch wahr ist während der countdown-Wiederholung, nach jedem Punkt gedruckt wird. Leider hat mein C-wissen ist fast 0, da ich es nicht verwenden, bevor Sie beginnen, Geige mit arduino 🙂 Also ich zähle auf jede Antwort die ich bekomme. nochmals vielen Dank
fügen Sie Ausdrucke überall der Zustand ändert, afaict die Logik scheint gut zu mir. Siehe meine edits. Ich habe auch Feste die Tippfehler.
Ja es funktioniert jetzt, wahrscheinlich arbeitete, bevor, aber Sie müssen nur die Taste gedrückt halten, ein wenig mehr. Aber jetzt gibt es ein problem...Die poti-Werte sind nicht mehr korrekt(dass es bei maximaler zeigt nur 14...). Irgendwelche Ideen, warum? Dank
InformationsquelleAutor zmo
Merke ich, der post ist hier schon seit einem Jahr, aber nur im Falle das jemand noch auf der Suche nach einer Antwort...
Breakout von loop(){}? Haben Sie versucht, Sie anzurufen,
Wo immer Sie es wollen zu beenden, dass die Schleife? wie:
Können Sie immer setzen-delay code am Anfang der Methode zu vermeiden, Wiederholungen von Codes und vermeiden Sie versehentlich überspringen es aufgrund der frühen break aus der Schleife.
InformationsquelleAutor m4sterblaster
Ich weiß, es ist schon eine Weile, da diese aktiv war, aber ein großes Problem, mit dem ich sehen kann mit der vorhergehenden Antwort ist die Verwendung von Verzögerungen, bei denen, wenn ich lese es richtig, es gibt 1,5 Sekunden zählt, statt 1 Sekunde.
Eine bessere Antwort würde die Zeit berechnen, die seit der letzten runtergezählt und dann ein count-down, wenn es 1 Sekunde oder höher. Es ist vielleicht etwas off, aber es ist viel näher an der 1 Sekunde.
Es löst auch ein weiteres Problem, dass der button kann nur bestehen zwischen diesen Verzögerungen, was eine kurze Zeit alle 1,5 Sekunden oder so, so könnten Sie müssen halten Sie die Taste für 1,5 Sekunden, um es zu stoppen, anstatt schieben Sie es einfach, um es zu stoppen.
Würde ich tun so etwas wie dieses:
Diese Weise wird die Schaltfläche aktiviert ist jede Schleife und die Schleife wird kontinuierlich laufen eher als Pause für das zweite zu warten, für Sie zu zählen, und er zählt jede Sekunde.
InformationsquelleAutor Jeffrey Black