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.
Wyzwanie
ŚredniPrzepisz odmierzanie czasu bez użycia delay():
- utrzymuj zielone światło przez 3000 ms, żółte przez 1000 ms, a czerwone przez 3000 ms
- użyj
enumdla trzech stanów,switchimillis() - zapal zielone światło w
setup()i wywołujshowLight()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);
}
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