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.