Nazwane stany z enum
Część sekcji Odmierzanie czasu bez delay() ścieżki Arduino w Coddy. Lekcja 9 z 18.
Tryb o numerze 0, 1 i 2 działa, ale if (mode == 2) nie mówi, co oznacza 2. enum nadaje każdej liczbie nazwę:
enum State { READY, RUNNING, DONE };
State state = READY;Pierwsza linia tworzy nowy typ, State, którego jedynymi wartościami są READY, RUNNING i DONE. W rzeczywistości nadal są to 0, 1 i 2, ale nazwy mówią, co oznacza każda z nich. Druga linia tworzy zmienną tego typu.
enum i switch dobrze ze sobą współpracują: po jednym case dla każdego stanu.
switch (state) {
case READY:
// co robi READY i kiedy przechodzi dalej
break;
case RUNNING:
// ...
break;
}Aby przejść do nowego stanu, ustaw state i zapamiętaj, kiedy się rozpoczął: state = DONE; stateStart = millis();. Każdy stan mierzy następnie swój czas za pomocą millis() - stateStart. Ten sposób pisania szkicu nazywa się maszyną stanów.
Wyzwanie
ŚredniMaszyna ma trzy stany. Kod dla READY jest już napisany: zielona dioda LED świeci, a naciśnięcie przycisku uruchamia maszynę. Dodaj dwa pozostałe przypadki:
RUNNING: żółta dioda LED świeci. Po 2000 ms wyłącz ją i przejdź do stanuDONE.DONE: czerwona dioda LED świeci. Po 1000 ms wyłącz ją i wróć do stanuREADY.
Zapisuj stateStart przy każdej zmianie stanu. Naciśnij Run, naciśnij przycisk, a następnie Check.
Spróbuj swoich sił
const int buttonPin = 2;
const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;
enum State { READY, RUNNING, DONE };
State state = READY;
unsigned long stateStart = 0; // kiedy rozpoczął się bieżący stan
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(greenLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(redLed, OUTPUT);
}
void loop() {
unsigned long now = millis();
switch (state) {
case READY:
digitalWrite(greenLed, HIGH);
if (digitalRead(buttonPin) == LOW) {
digitalWrite(greenLed, LOW);
state = RUNNING;
stateStart = now;
}
break;
// dodaj przypadek RUNNING: włącz żółtą diodę; po 2000 ms wyłącz ją i przejdź do DONE
// dodaj przypadek DONE: włącz czerwoną diodę; po 1000 ms wyłącz ją i wróć do READY
}
}
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