Menu
CoddyTech

Ampel mit millis()

Teil des Abschnitts Projekte der Arduino-Journey von Coddy. Lektion 2 von 24.

Während jedes delay(3000) tut das Board nichts anderes, daher könnte es den Taster am Fußgängerüberweg, den der nächste Schritt hinzufügt, nicht bemerken. Die Zeitmessung wird auf millis() umgestellt.

Die Ampel ist eine Zustandsmaschine: Sie befindet sich immer in einem Zustand (grün, gelb oder rot) und wechselt zum nächsten, wenn sie lange genug in diesem Zustand war. Ein enum benennt die Zustände, eine Variable enthält den aktuellen Zustand und eine weitere speichert, wann er begonnen hat:

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;

Der erste Zustand ist grün, also schalte das grüne Licht in setup() ein. Bei jedem Durchlauf von loop() prüft ein switch, ob der aktuelle Zustand lange genug gedauert hat, und wechselt erst dann zum nächsten Zustand und schaltet die Lichter um:

case GREEN:
  if (millis() - lightStart >= 3000) {
    light = YELLOW;
    lightStart = millis();
    showLight(yellowPin);
  }
  break;

Es gibt keine Wartezeit, daher ist loop() frei für andere Aufgaben. Beweise es mit einer Statusleuchte: Lass die boardeigene LED an Pin 13 alle 500 ms blinken.

challenge icon

Aufgabe

Mittel

Schreibe die Zeitsteuerung ohne delay() neu:

  • grün 3000 ms, gelb 1000 ms und rot 3000 ms eingeschaltet lassen
  • ein enum für die drei Zustände, ein switch und millis() verwenden
  • die grüne LED in setup() einschalten und showLight() nur aufrufen, wenn sich der Zustand ändert
  • Pin 13 die ganze Zeit alle 500 ms blinken lassen (500 ms ein, 500 ms aus)

Klicke auf Run und dann auf Check.

Probier es selbst

// Die Autoampel
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;

// Schalte eine Leuchte ein und die anderen beiden aus.
void showLight(int pin) {
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(pin, HIGH);
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
}

void loop() {
  showLight(greenPin);
  delay(3000);
  showLight(yellowPin);
  delay(1000);
  showLight(redPin);
  delay(3000);
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Arduino-Playground