Menu
CoddyTech

Fußgängersignal und Summer

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

Fußgänger bekommen eigene Ampeln: Rot an Pin 7 (warten) und Grün an Pin 6 (gehen). Während die Autos Rot haben, sehen Fußgänger Grün; die restliche Zeit sehen sie Rot.

Das Fußgängersignal wechselt nur zu zwei Zeitpunkten: wenn die Autos auf Rot wechseln und wenn sie die Rotphase verlassen. Schreibe eine Funktion für die Fußgängerampeln und rufe sie an diesen beiden Stellen auf:

void showWalk(bool walk) {
  if (walk) {
    digitalWrite(walkRedPin, LOW);
    digitalWrite(walkGreenPin, HIGH);
  } else {
    digitalWrite(walkGreenPin, LOW);
    digitalWrite(walkRedPin, HIGH);
  }
}

Übergänge geben außerdem einen Signalton aus, solange es sicher ist, die Straße zu überqueren, damit auch Menschen, die die Ampeln nicht sehen können, Bescheid wissen. tone() kann eine dritte Zahl entgegennehmen, die angibt, wie lange der Ton abgespielt wird: tone(buzzerPin, 1000, 100) spielt 1000 Hz für 100 ms ab und stoppt von selbst. Das Sketch wartet nicht darauf.

Damit nur während der Rotphase alle 500 ms ein Signalton ertönt, füge einen dritten millis()-Timer innerhalb von case RED: ein.

challenge icon

Aufgabe

Mittel

Füge das Fußgängersignal und den Signalgeber hinzu:

  • Fußgängerrot an Pin 7 und Fußgängergün an Pin 6, beides Ausgänge
  • während die Autos Rot haben: Fußgängergün an, Fußgängerrot aus und alle 500 ms ein 100 ms langer Signalton mit 1000 Hz an Pin 8
  • die restliche Zeit: Fußgängerrot an, Fußgängergün aus, kein Ton

Klicke auf Run und dann auf Check.

Probier es selbst

// Die Ampelleuchten für Autos
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Die boardeigene LED: die Statusleuchte des Controllers
const int statusPin = 13;
// Der Knopf für die Fußgängerüberquerung
const int buttonPin = 2;

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

bool statusOn = false;
unsigned long lastBlink = 0;

// Eine Leuchte einschalten und die anderen beiden ausschalten.
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);
  pinMode(buttonPin, INPUT_PULLUP);
  showLight(greenPin);
}

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

  switch (light) {
    case GREEN:
      // Ein Druck auf den Knopf für die Fußgängerüberquerung beendet die Grünphase vorzeitig.
      if (now - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
        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 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