inzwischen ist mein StarterKit da und ich habe ein wenig rum gefummelt.
Habe mir jetzt was gebaut, aber es geht noch nicht 100 % wie ich es will.
Hardware Arduino Uno
2 LED´s
2 Taster
4 Widerstände
wenn ich den linken Taster drücke blinkt es links und wenn ich den rechten Taster drücke blinkt es rechts.
Nur wenn ich mich mal verdrückt habe, kann ich es nicht unterbrechen.
Wie bekomme ich das hin, dass wenn ich links gedrückt habe und rechts will die Led auf hört zu blinken wenn ich rechts drücke?
int BlinkerLinks = 9;
int tasterLinks = 11;
int BlinkerRechts = 12;
int tasterRechts = 8;
void setup(){
pinMode(BlinkerLinks,OUTPUT);
pinMode(tasterLinks,INPUT);
pinMode(BlinkerRechts,OUTPUT);
pinMode(tasterRechts,INPUT);
}
void loop(){
if (digitalRead(tasterLinks)==HIGH)
for (int zaehler=1; zaehler<=5; zaehler = zaehler+1){
digitalWrite(BlinkerLinks, HIGH);
delay(400);
digitalWrite(BlinkerLinks, LOW);
delay(400);
}
if (digitalRead(tasterRechts)==HIGH)
for (int zaehler=1; zaehler<=5; zaehler = zaehler+1){
digitalWrite(BlinkerRechts, HIGH);
delay(400);
digitalWrite(BlinkerRechts, LOW);
delay(400);
}
delay(20);
}
Wie bekomme ich das hin, dass wenn ich links gedrückt habe und rechts will die Led auf hört zu blinken wenn ich rechts drücke?
du blockierst dich aktuell in deiner For-Anweisung.
Du siehst ja selber, dass die For-Schleife erst nach hartem Ablauf der 5 Durchgänge beendet wird. Der andere Button wird da drinnen nicht abgefragt. Es wäre imho auch schmutzig, da jetzt ein if AndererButton dann break zu ergänzen.
Du sollst dir das Beispiel "BlinkWithoutDelay" ansehen, wie man derartige Blockaden vermeidet, dann eine Statemaschine schreiben die entweder die eine oder andere LED blinken lässt.
Ja, wenn der Sketch richtig aufgebaut ist, durchläuft er ständig die Loop, heißt ja auch Schleife.
Somit macht die Statemachine immer etwas und reagiert weiterhin auf Anweisungen. Nach deren Durchführung (z.B. Blinken) durchläuft er weiterhin die Loop.
Damit das alles ohne Probleme und Verzögerungen läuft, sollten delays vermieden werden.
Die blockieren diesen Ablauf und stören dadurch.
Baue erstmal anhand des Beispiels "BlinkWithoutDelay" einen Sketch in dem du 2 unabhängige Leds blinken lässt.
Die Leds schaltest du dann mittels Statusvariablen auf blinken oder nicht blinken.
Auch wenn sich bei einem solchen Mini-Lernprojekt der Sinn vlt. nicht gleich erschießt ... versuche dir (für die Zukunft) folgenden modularen Programmier-Stil anzugewöhnen: "EVA". Das steht für "Eingabe", "Verarbeitung" und "Ausgabe". Das sorgt Übersichtlichkeit und Wartbarkeit (leichte Änderungen)
Bezogen auf dein Projekt heisst das, dass du weitgehend getrennte Prorammteile (Funktionen) anlegst, die unabhängig von eineander arbeiten und nutzbar sind. Also ...
du liest den Zustand der Taster ein und legst diese Infos in globalen Variablen (Skalare oder Arrays) ab
du führst die einsprechende Verarbeitung durch (Logik, Kombinatorik), legst die Ergebnisse wiederum ab
du machst die Ausgaben (z.B. Pins setzen, an denen LEDs, Relais oder andere "Verbraucher" hängen)
gehe zu 1
Es wird bestimmt gleich Kritiker geben, die hier schreiben, dass sei altmodisch oder zumindest völlig übertrieben. Hör' nicht darauf. Diese Methode ist die einzige, mit der man auch größere Projekte im Überblick behält und je eher man sich daran gewöhnt, umso einfacher hat man es später ...
Dacapo:
Leider nur Beispiele an Hand von Ampeln gefunden.
Zugegeben liebe ich diese Beispiele! Kennst Du auch die Ampel mit "Fußgänger-Anforderung"? Da gibt es eine Variante von RudiDL5 und eine prozedurale von mir. Bei meiner gibt es case WARTEN, wo auf den Druck auf den "Bettelknopf" gewartet wird.
Im Thema Wieder bewässerung gibt es ein Beispiel, wo nicht auf einen Knopfdruck, aber auf Trockenheit gewartet wird. Schaue Dir da nur die Methode run() an, denn case MESSEN wartet.