Ü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.
Aufgabe
MittelFü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);
}
}
}
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