Maszyna stanów sygnalizacji świetlnej
Część sekcji Odmierzanie czasu bez delay() ścieżki Arduino w Coddy. Lekcja 10 z 18.
Sygnalizacja świetlna to maszyna stanów: zawsze znajduje się w jednym stanie (zielonym, żółtym lub czerwonym), każdy stan trwa określony czas i każdy stan wie, który następuje po nim:
- GREEN: zielone światło włączone; po 2 s przejdź do YELLOW
- YELLOW: żółte światło włączone; po 1 s przejdź do RED
- RED: czerwone światło włączone; po 2 s przejdź do GREEN
Każdy wiersz staje się jednym case:
case GREEN:
setLights(HIGH, LOW, LOW);
if (now - lightStart >= 2000) {
light = YELLOW;
lightStart = now;
}
break;Przy użyciu delay(2000) światła również działałyby poprawnie, ale nic innego nie mogłoby się uruchomić. Przy użyciu millis() każde przejście przez loop() zajmuje mikrosekundy, więc płytka ma czas na inne zadania: tutaj dioda LED sygnalizująca stan miga przez cały czas, aby pokazać, że kontroler działa.
Wyzwanie
ŚredniDioda LED stanu na pinie 13 już miga, a enum i lightStart są gotowe. Napisz program sygnalizacji świetlnej jako switch (light) z jednym case dla każdego światła:
- zielone 2 s, żółte 1 s, czerwone 2 s, a potem ponownie zielone
- jedna dioda LED naraz, za pomocą
setLights() - bez
delay(), aby dioda LED stanu nadal migała
Naciśnij Run, a następnie Check.
Spróbuj swoich sił
const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;
const int statusLed = 13; // dioda LED wbudowana w płytkę
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0; // kiedy zapaliło się aktualne światło
unsigned long statusPrevious = 0;
int statusState = LOW;
void setup() {
pinMode(greenLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(statusLed, OUTPUT);
}
void setLights(int green, int yellow, int red) {
digitalWrite(greenLed, green);
digitalWrite(yellowLed, yellow);
digitalWrite(redLed, red);
}
void loop() {
unsigned long now = millis();
// dioda LED stanu zmienia swój stan co 250 ms, aby pokazać, że sterownik działa
if (now - statusPrevious >= 250) {
statusPrevious = now;
if (statusState == LOW) {
statusState = HIGH;
} else {
statusState = LOW;
}
digitalWrite(statusLed, statusState);
}
// sygnalizacja świetlna: instrukcja switch (light) z jednym przypadkiem dla każdego światła
// zielone 2 s, żółte 1 s, czerwone 2 s, potem znów zielone
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Odmierzanie czasu bez delay()
1millis()
Zegar millis()Czas w typie unsigned longMiganie bez opóźnieniaDwie diody LED, dwa tempaMiganie podczas przełączania przyciskiemŚwiatło na czas4Precyzyjne odmierzanie czasu
Pomiar za pomocą micros()Gdy licznik millis() się przepełniaStoper z przyciskiem2Maszyny stanów
Zapamiętywanie trybuWybór za pomocą switchNazwane stany z enumMaszyna stanów sygnalizacji świetlnejPrzełączanie trybów przyciskiemPoćwicz samodzielnie: Edytor online Arduino