Anfänger Arduino Projekt

Gast #4380781
Lesenswert?

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.
Gast #4380812
Lesenswert?

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.
Gast #4380813
Lesenswert?

> 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"
Gast #4380822
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren