Menu
CoddyTech

Sygnalizacja świetlna z użyciem millis()

Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 2 z 24.

Podczas każdego delay(3000) płytka nie robi nic innego, więc nie mogłaby zauważyć przycisku dla pieszych, który zostanie dodany w następnym kroku. Odmierzanie czasu przechodzi na millis().

Światło działa jak maszyna stanów: zawsze znajduje się w jednym stanie (zielonym, żółtym lub czerwonym) i przechodzi do następnego, gdy dany stan trwał wystarczająco długo. enum nadaje nazwy stanom, jedna zmienna przechowuje bieżący stan, a druga — czas jego rozpoczęcia:

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;

Pierwszy stan to zielone światło, więc zapal zielone w setup(). Przy każdym przebiegu loop() instrukcja switch sprawdza, czy bieżący stan trwał wystarczająco długo, i dopiero wtedy przechodzi dalej oraz zmienia światła:

case GREEN:
  if (millis() - lightStart >= 3000) {
    light = YELLOW;
    lightStart = millis();
    showLight(yellowPin);
  }
  break;

Nic nie czeka, więc loop() może wykonywać inne zadania. Sprawdź to za pomocą lampki statusu: migaj wbudowaną diodą LED płytki, na pinie 13, co 500 ms.

challenge icon

Wyzwanie

Średni

Przepisz odmierzanie czasu bez użycia delay():

  • utrzymuj zielone światło przez 3000 ms, żółte przez 1000 ms, a czerwone przez 3000 ms
  • użyj enum dla trzech stanów, switch i millis()
  • zapal zielone światło w setup() i wywołuj showLight() tylko wtedy, gdy zmieni się stan
  • migaj pinem 13 co 500 ms (500 ms włączony, 500 ms wyłączony), przez cały czas

Naciśnij Run, a następnie Check.

Spróbuj swoich sił

// Światła samochodowe
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;

// Włącz jedno światło i wyłącz pozostałe dwa.
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);
}

void loop() {
  showLight(greenPin);
  delay(3000);
  showLight(yellowPin);
  delay(1000);
  showLight(redPin);
  delay(3000);
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Projekty

Poćwicz samodzielnie: Edytor online Arduino