Ich probiere gerade eine simple Ampelsteuerung zu realisieren. Nachdem der Taster "switchState" gedrückt wurde, soll für 10 Sekunden greenLED HIGH sein, dann soll greenLED auf LOW gehen und yellowLED für 3 Sekunden auf HIGH, danach soll yellowLED auf LOW und redLED für 10 Sekunden auf HIGH. Wenn der Taster losgelassen wird, sollen alle LEDs auf LOW. Hier der Code: const int greenTime = 10000; const int yellowTime = 3000; const int redTime = 10000; int greenLED = 3; int yellowLED = 4; int redLED = 5; int temp, i, j, k = 0; int switchState = 0; void setup() { pinMode(greenLED, OUTPUT); pinMode(yellowLED, OUTPUT); pinMode(redLED, OUTPUT); pinMode(1, INPUT); } void loop() { switchState = digitalRead(1); if(switchState == HIGH) { for(i = 0; i <= redTime; i++) { for(j = 0; j <= yellowTime; j++) { for(k = 0; k <= greenTime; k++) { digitalWrite(greenLED, HIGH); } digitalWrite(greenLED, LOW); digitalWrite(yellowLED, HIGH); } digitalWrite(yellowLED, LOW); digitalWrite(redLED, HIGH); } } else { digitalWrite(greenLED, LOW); digitalWrite(yellowLED, LOW); digitalWrite(redLED, LOW); } } Wo ist mein Denkfehler? Bitte keine fertigen Lösungen, sondern anstupser in die richtige Richtung.
Vielleicht noch angemerkt, greenLED und yellowLED gehen sofort zeitgleich an, danach bleibt er in der Schleife drin, selbst wenn der Taster losgelassen wird.
wie kommst du auf 10 bzw. 3 Sekunden, deine for-Schleifen zählen 10000 mal, aber keine Sekunden. Dann springt die Schleife direkt weiter, weil du auf gleich oder kleiner n-time abfragst. Was noch falsch ist, habe ich nicht geprüft.
> pinMode(1, INPUT); Pin 1 ist TxD der seriellen Schnittstelle Den solltest du nicht als Input verwenden. Denn der Bootloader nutzt ihn als Output. Mit dem Taster baust du eine Kurzschlussgefahr. > Wo ist mein Denkfehler? Du sprichst von: > Sekunden Tust aber nichts mit "Sekunden"
Ulrich F. schrieb: >> pinMode(1, INPUT); > Pin 1 ist TxD der seriellen Schnittstelle > Den solltest du nicht als Input verwenden. > Denn der Bootloader nutzt ihn als Output. > Mit dem Taster baust du eine Kurzschlussgefahr. Hab meinen Code nun wie folgt geändert (do-while Schleifen anstelle der for Schleife und den Eingang auf Pin 2 verlegt): const int greenTime = 10000; const int yellowTime = 3000; const int redTime = 10000; int greenLED = 3; int yellowLED = 4; int redLED = 5; int temp, i, j, k = 0; int switchState = 0; void setup() { pinMode(greenLED, OUTPUT); pinMode(yellowLED, OUTPUT); pinMode(redLED, OUTPUT); pinMode(2, INPUT); } void loop() { switchState = digitalRead(2); if(switchState == HIGH) { do { digitalWrite(redLED, LOW); digitalWrite(greenLED, HIGH); i++; } while(i <= greenTime); delay(1000); do { digitalWrite(greenLED, LOW); digitalWrite(yellowLED, HIGH); j++; } while(j <= yellowTime); delay(1000); do { digitalWrite(yellowLED, LOW); digitalWrite(redLED, HIGH); k++; } while(k <= redTime); delay(1000); } else { digitalWrite(greenLED, LOW); digitalWrite(yellowLED, LOW); digitalWrite(redLED, LOW); } } Ulrich F. schrieb: > Du sprichst von: >> Sekunden > Tust aber nichts mit "Sekunden" Stimmt an Kopf lang, jetzt muss ich nur herrausfinden, wie ich das implementiere.
Achso noch angemerkt, es funktioniert nun wie gedacht, lag also wirklich am Pin 1. Nun will ich das Ganze noch so realisieren, dass wirklich Sekunden runtergezählt werden.
schau mal da https://learn.adafruit.com/multi-tasking-the-arduino-part-1 wenn du das nachvollziehen kannst bist du schon zwei Schritte weiter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.