Przycisk dla pieszych
Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 3 z 24.
Osoby piesze potrzebują sposobu, by poprosić o możliwość przejścia przez jezdnię. Niebieski przycisk podłączony do pinu 2 to przycisk dla pieszych: naciśnięcie go podczas zielonego światła natychmiast kończy zielone, dzięki czemu samochody dostają żółte, a potem czerwone światło.
Ponieważ światła działają w oparciu o millis(), loop() przechodzi przez stan zielonego światła tysiące razy na sekundę i za każdym razem może odczytywać przycisk, a także zegar. Zielone światło kończy się, gdy którykolwiek z tych warunków jest spełniony, co oznacza || (lub):
case GREEN:
if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
// zmień na żółty
}
break;Przycisk łączy pin 2 z masą, więc ustaw pin jako INPUT_PULLUP: odczyt to HIGH, dopóki przycisk nie ściągnie go do LOW.
Przycisk jest odczytywany tylko w stanie zielonego światła. Podczas żółtego i czerwonego samochody już się zatrzymują, a żółte światło trwa pełną sekundę, żeby kierowcy mieli czas się zatrzymać.
Wyzwanie
ŚredniDodaj przycisk przejścia dla pieszych do pinu 2:
- ustaw pin 2 na
INPUT_PULLUP - gdy światło jest zielone, naciśnięcie przycisku natychmiast kończy zielone światło (światło zmienia się na żółte)
- żółte i czerwone światło świecą przez taki sam czas niezależnie od tego, czy przycisk jest naciśnięty
Naciśnij Run, poczekaj na zielone światło, naciśnij niebieski przycisk, a następnie Check.
Spróbuj swoich sił
// Światła samochodowe
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Wbudowana dioda LED płytki: kontrolka stanu sterownika
const int statusPin = 13;
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0; // kiedy zapaliło się aktualne światło
bool statusOn = false;
unsigned long lastBlink = 0;
// Włącz jedno światło, a pozostałe dwa wyłącz.
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;
}
// Kontrolka stanu miga co 500 ms, niezależnie od działania świateł samochodowych.
if (now - lastBlink >= 500) {
lastBlink = now;
if (statusOn) {
statusOn = false;
digitalWrite(statusPin, LOW);
} else {
statusOn = true;
digitalWrite(statusPin, HIGH);
}
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Projekty
1Sygnalizacja świetlna
Cykl sygnalizacji świetlnejSygnalizacja świetlna z użyciem millis()Przycisk dla pieszychSygnał przejścia dla pieszych i brzęczykPoćwicz samodzielnie: Edytor online Arduino