Anfänger Arduino Projekt

Gast #4380781
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 #4380790
Vielleicht noch angemerkt, greenLED und yellowLED gehen sofort 
zeitgleich an, danach bleibt er in der Schleife drin, selbst wenn der 
Taster losgelassen wird.
Gast #4380812
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
> 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
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.
Gast #4380825
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.