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.
Wyzwanie
ŚredniPrzycisk 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;
}
}
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