Simple Ampelsteuerung

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.

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)
  {
    do
    {
      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);
  }
}

Mein Problem ist, dass bei kurzem Tasterdrücken alle 3 LEDs sofort angehen und bei längerem Drücken rot durchgehend an ist und die anderen beiden im 1-2 Sekundentakt von HIGH auf LOW wechseln.

Folgende Änderung durchgeführt: Pin 2 als INPUT für den Taster verwendet, da Pin 1 für TX verwendet wird.

Schaltung funktioniert nun prinzipiell, nur werden die Schleifen noch nicht mit einer Zeiteinheit verarbeitet, sondern durch einen festen Wert.

Crossposting
Keine Hilfe mehr von mir.

do {
  digitalWrite(greenLED, HIGH);
   i++;
} while (i < 10000);

was schätzt du denn, wie lange dieser Code dauert?

Vermutlich nicht lang genug, dass du die LED überhaupt aufblitzen sehen würdest, wenn der Pin davor und danach auf LOW wäre...

Dein späteres delay(1000); dient dazu, dass der sketch nur selten auf Änderungen des Tasters reagiert.

Merke: loop() heisst loop, weil diese Funktion am liebsten andauernd neu aufgerufen würde.

Wenn einmal loop so lange dauert wie dein ganzer "Programmablauf", ist da nichts interaktives möglich.
So ähnlich wie eine Waschmaschine, die einmal gestartet, nur durch Stecker ziehen gestoppt werden kann. Willst du das? Wenn ja, kannst du delay() verwenden (aber richtig, bitte;) ).