Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Maszyna 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 stanu DONE.
  • DONE: czerwona dioda LED świeci. Po 1000 ms wyłącz ją i wróć do stanu READY.

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
  }
}
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