Menu
CoddyTech

Przełączanie trybów przyciskiem

Część sekcji Odmierzanie czasu bez delay() ścieżki Arduino w Coddy. Lekcja 11 z 18.

Wiele gadżetów ma jeden przycisk, który przełącza tryby: lampka rowerowa gaśnie, świeci, miga, szybko miga, a potem znów gaśnie. To maszyna stanów, w której naciśnięcie przycisku, a nie zegar, powoduje przejście do następnego stanu.

Umieść ten krok we własnej funkcji. Instrukcja switch na podstawie bieżącego trybu ustawia następny, a ostatni tryb wraca do pierwszego:

void nextMode() {
  switch (mode) {
    case OFF:
      mode = ON;
      Serial.println("ON");
      break;
    // ... i tak dalej, aż FAST wróci do OFF
  }
}

Szkic wywołuje nextMode() raz po każdym naciśnięciu. Przycisk jest eliminowany z drgań styków w sposób poznany w sekcji Inputs: gdy odczyt się zmienia, zareaguj na to, a następnie odczekaj 20 ms, aż styki się ustabilizują. Druga instrukcja switch na podstawie mode ustawia diodę LED.

challenge icon

Wyzwanie

Średni

Przycisk i dioda LED są już przygotowane. Napisz nextMode(), aby każde naciśnięcie przełączało na kolejny tryb i wyświetlało jego nazwę: OFF, ON, BLINK, FAST, a następnie ponownie OFF.

Naciśnij Run, kilka razy naciśnij przycisk, a następnie Check.

Spróbuj swoich sił

const int ledPin = 13;
const int buttonPin = 2;

enum Mode { OFF, ON, BLINK, FAST };
Mode mode = OFF;

bool wasPressed = false;
unsigned long blinkPrevious = 0;
int ledState = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

// Przechodzi do następnego trybu i wypisuje jego nazwę.
void nextMode() {
  // jeden przypadek na każdy tryb: ustaw następny tryb, wypisz jego nazwę, break
}

// Przełącza diodę LED co interval ms.
void blinkEvery(unsigned long interval) {
  unsigned long now = millis();
  if (now - blinkPrevious >= interval) {
    blinkPrevious = now;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
  }
}

void loop() {
  // 1. naciśnięcie (po wyeliminowaniu drgań styków) wywołuje nextMode()
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      nextMode();
    }
    wasPressed = pressed;
    delay(20);   // poczekaj, aż styki przestaną drgać
  }

  // 2. tryb określa, co robi dioda LED
  switch (mode) {
    case OFF:
      digitalWrite(ledPin, LOW);
      break;
    case ON:
      digitalWrite(ledPin, HIGH);
      break;
    case BLINK:
      blinkEvery(500);
      break;
    case FAST:
      blinkEvery(100);
      break;
  }
}
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