Forum: Mikrocontroller und Digitale Elektronik Anfänger Arduino Projekt


von Maik (Gast)


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.

von Maik (Gast)


Lesenswert?

Vielleicht noch angemerkt, greenLED und yellowLED gehen sofort 
zeitgleich an, danach bleibt er in der Schleife drin, selbst wenn der 
Taster losgelassen wird.

von Dieter S. (Gast)


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.

von Ulrich F. (Gast)


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"

von Maik (Gast)


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.

von Maik (Gast)


Lesenswert?

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.

von Walter S. (avatar)


Lesenswert?

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
Noch kein Account? Hier anmelden.