Schleife über Taster starten und stoppen

Ich will mit einem Taster eine Blink Schleife starten, wenn ich ihn einmal drücke.
Wenn der Taster nochmal gedrückt wird, soll die Schleife gestoppt werden.

Ich habe es damit versucht:

#define WAIT 500 // delay festlegen

void setup() {
pinMode(5, INPUT_PULLUP); // Pin 5 als Input mit Pullup
pinMode(13, OUTPUT); // Pin 13 als Output
digitalWrite(13,LOW); // LED ausschalten
}

// ***** LOOP *****
void loop() {
// Solange Pin 9 == HIGH ist ...
while(digitalRead(5)==HIGH){} // ...passiert nichts
// Sobald Pin 9 == LOW ist wird geschaltet
if(digitalRead(13)==LOW)
{
digitalWrite(13,LOW); //R1 ON
delay(WAIT);
digitalWrite(13,HIGH); //R1 OFF
delay(WAIT);
}
else {
digitalWrite(13,LOW);
}
delay(200); // Taste entprellen
}

Was allerdings passiert ist, dass die Schleife nur läuft solange der Taster gedrückt ist
und stehen bleibt, wenn man ihn los lässt.

Wo liegt das Problem?

Mach das mit einer zusätzlichen Statusvariable.
Den Zustand der Variable änderst du über die Taster und fragst den in der Blinkroutine ab.

Ist bestimmt blöd gefragt, aber wie mache ich eine zweite Variable?

Ich bin da noch vom Kenntnisstand recht weit am Anfang und habe mir diesen Code auch nur aus zwei bestehenden zusammen gehauen.

Leider komme ich mit englischen Tutorials nicht sonderlich weiter.

Könntest du mir da mal ein kurzes Beispiel geben?

Könnte ich dann ja für meinen Bedarf anpassen.

Weißt du was eine Variable ist ?
Wenn nicht, dann lerne bitte die nötigen Grundlagen.

Wie sollen wir dir helfen, wenn die fehlen ?

Beispiel:
int variablenname = 0;

Diese per Taster setzen und in der Blinkroutine per if-Abfrage abfragen.

Du hast in loop() schon eine Schleife. Entweder machst du darin was oder nicht. Abhängig davon in welchen Zustand zu durch den Tastendruck gerade bist. Extra Schleifen braucht man da nicht und machen auch oft nur Probleme

Ich verstehe ja noch nicht mal, wie das geht.

Wie gesagt, ich habe das aus fertigen Teilen zusammengebaut.

Daher müsste ich wissen, wie ich die Tastendrücke hoch zähle, wie ich
die Variable mittels if Abfrage einbinde und wie ich die Variable sobald
sie 3 erreicht zurück auf 1 setze.

Ich habe mit dem Board vor 3 Jahren mal ein bisschen was gemacht, mehr
auch nicht.

Und ich hatte in Info eine 5 und habe es abgewählt.

Das kannst du alles in Büchern nachlesen.

Oder sollen wir dir jetzt einen Grundlagenkursus geben ?
Ein wenig musst du schon mitarbeiten, auch wenn du es in der Schule wohl nicht gebraucht hast.
Das können wir nicht für dich nachholen.

Habe mich erst mal an den Zähler gewagt und zumindest einen hinbekommen, der schon mal aufwärts zählt:

const int buttonPin = 12;

int buttonState = 0;
int counter = 0;
int buttonStateHIGH = 0;

void setup() {
 Serial.begin(9600);
 pinMode(buttonPin, INPUT);    
}

void loop(){
 buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH)
 {    
   buttonStateHIGH = 1;
 }
 if (buttonState == LOW && buttonStateHIGH == 1)
 {
   counter++;
   buttonStateHIGH = 0;
 }
 Serial.println(counter);
}

Das funktioniert, nur habe ich manchmal Doppelzählungen, soll heißen bei einem
Tasten zählt er gleich zweimal. Und ich bekomme ihn bei 3 nicht wieder auf 1.

Das ist doch schon mal super.

Jetzt musst du die Taster noch entprellen. Das geht mit bounce oder debounce.
Oder zum Testen einfach en kurzes delay(20); hinter die Tastenauswertung setzen.
Mit der Zeit in delay kannst du auch experimentieren.

Wo bringe ich so ein debounce am besten ein?

Im Setup oder in der Loop Funktion.

Und ich bekomme es nicht resettet.

Habe es schon mit

if (counter == 3)
{
counter == 1;
}

versucht, aber der zählt einfach weiter.

== ist ein Vergleich. Die Zuweisung ist =

Da macht sich das Fehlen der einfachsten Grundlagen stark bemerkbar.

Gruß Tommy

Oh, ein so nahe liegendes Problem und ich sehe es nicht!

Damit hätte ich das schon mal behoben.

Jetzt muss nur noch die Schleife laufen.

Und aus irgendeinem Grund funktioniert das mit dem Zähler wieder nicht.

Der wechselt random zwischen 1 und 2

Also ich verstehe gerade gar nichts mehr.

Ich habe den Zähler so, dass er zwischen 1 und 2 wechselt.

Aber der Wert ändert sich willkürlich obwohl ich nicht taste.

Und ich bekomme diese blöde Schleife nicht ans laufen.

Dann musst du einen Pulldown-Widerstand einbauen.
Oder du nimmst den internen Pullup und fragst auf Low ab.

Also ich verstehe gerade gar nichts mehr.

Das ist gut!

Genau der richtige Nährboden für neue Erkenntnisse.

Habe den Widerstand per digitalWrite (buttonPin, HIGH); aktiviert.

Das nervöse flimmern ist damit weg, genau wie das Doppeltasten.

Jetzt möchte ich das ganze gerne in eine While Schleife packen.

Um ein Relais zu schalten (oder Lampe zu blinken) würde ich dies benutzen wollen:

while (counter == 1)
{
digitalWrite(RELAY1,LOW); //R1 ON
delay(WAIT);
digitalWrite(RELAY1,HIGH); //R1 OFF
delay(WAIT);
}

Spricht das formell was gegen oder habe ich was vergessen?

Spricht das formell was gegen

Nöö...

oder habe ich was vergessen?

Ja!

Ok, habe es jetzt so:

#define RELAY1  13
#define WAIT 500
const int buttonPin = 2;

int buttonState = 0;
int counter = 0;
int buttonStateHIGH = 0;

void setup() {
 Serial.begin(9600);
 pinMode(buttonPin, INPUT);  
 digitalWrite(buttonPin, HIGH);       // aktiviert den Pull- Up- Widerstand 
 while (counter == 1)
{
digitalWrite(RELAY1,LOW);  //R1 ON
delay(WAIT);
digitalWrite(RELAY1,HIGH); //R1 OFF
delay(WAIT);
}
}

void loop(){
 buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH)
 {   
   buttonStateHIGH = 1;
 }
 if (buttonState == LOW && buttonStateHIGH == 1)
 {
   counter++;
   buttonStateHIGH = 0;
 }
 if (counter == 3)
 {
 counter = 1;
 }
 Serial.println(counter);
}

Der Counter geht, der Monitor gibt es auch aus, nur die Schleife läuft nicht.

Was fehlt mir noch?

Welche Schleife geht nicht ?

Marino_needing_help:
Jetzt möchte ich das ganze gerne in eine While Schleife packen.

Warum? Du hast doch mit loop() schon eine Schleife. Und so wie Du das vorhast wird das eine saubere Endlosschleife ... Ersetze das 'while' lieber durch ein 'if' :wink:

Edit: ...und wieso steht das jetzt auf einmal im setup()?