Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Dioda 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
}
quiz iconSprawdź się

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()

Poćwicz samodzielnie: Edytor online Arduino