Menu
CoddyTech

Überquerungstaster

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

Menschen zu Fuß brauchen eine Möglichkeit, die Straße anzufordern. Die blaue Taste an Pin 2 ist die Fußgängerampeltaste: Ein Druck während der Grünphase beendet das Grün sofort, sodass die Autos Gelb und dann Rot bekommen.

Da die Ampeln mit millis() laufen, durchläuft loop() den Grünzustand tausende Male pro Sekunde und kann jedes Mal sowohl die Taste als auch die Uhr abfragen. Die Grünphase endet, sobald eine der beiden Bedingungen erfüllt ist. Genau das bedeutet || (oder):

case GREEN:
  if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
    // zu Gelb wechseln
  }
  break;

Die Taste verbindet Pin 2 mit Masse. Stelle den Pin also auf INPUT_PULLUP: Er liest HIGH, bis die Taste ihn auf LOW zieht.

Nur im Grünzustand wird die Taste abgefragt. Bei Gelb und Rot halten die Autos bereits an, und die Gelbphase dauert ihre volle Sekunde, damit die Fahrer Zeit zum Anhalten haben.

challenge icon

Aufgabe

Mittel

Füge den Taster für den Fußgängerüberweg an Pin 2 hinzu:

  • setze Pin 2 auf INPUT_PULLUP
  • während die Ampel grün ist, beendet ein Tastendruck die Grünphase sofort (die Ampel schaltet auf Gelb)
  • Gelb und Rot behalten ihre Zeiten bei, unabhängig davon, ob der Taster gedrückt wird oder nicht

Klicke auf Run, warte auf Grün, drücke den blauen Taster und klicke dann auf Check.

Probier es selbst

// Die Ampelleuchten für die Autos
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Die integrierte LED des Boards: die Statusleuchte des Controllers
const int statusPin = 13;

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;  // als die aktuelle Leuchte eingeschaltet wurde

bool statusOn = false;
unsigned long lastBlink = 0;

// Schalte eine Leuchte ein und die beiden anderen 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);
  pinMode(statusPin, OUTPUT);
  showLight(greenPin);
}

void loop() {
  unsigned long now = millis();

  switch (light) {
    case GREEN:
      if (now - lightStart >= 3000) {
        light = YELLOW;
        lightStart = now;
        showLight(yellowPin);
      }
      break;
    case YELLOW:
      if (now - lightStart >= 1000) {
        light = RED;
        lightStart = now;
        showLight(redPin);
      }
      break;
    case RED:
      if (now - lightStart >= 3000) {
        light = GREEN;
        lightStart = now;
        showLight(greenPin);
      }
      break;
  }

  // Die Statusleuchte blinkt alle 500 ms, unabhängig davon, was die Ampelleuchten für die Autos tun.
  if (now - lastBlink >= 500) {
    lastBlink = now;
    if (statusOn) {
      statusOn = false;
      digitalWrite(statusPin, LOW);
    } else {
      statusOn = true;
      digitalWrite(statusPin, HIGH);
    }
  }
}
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