Menu
CoddyTech

Modi mit einer Taste durchschalten

Teil des Abschnitts Timing ohne Delay der Arduino-Journey von Coddy. Lektion 11 von 18.

Viele Geräte haben eine Taste, mit der man die Modi durchschaltet: Ein Fahrradlicht ist aus, an, blinkt, blinkt schnell und ist dann wieder aus. Das ist eine Zustandsmaschine, bei der ein Tastendruck den nächsten Zustand auslöst, nicht die Uhr.

Packe den Schritt in eine eigene Funktion. Ein switch über den aktuellen Modus legt den nächsten fest, und nach dem letzten Modus geht es zurück zum ersten:

void nextMode() {
  switch (mode) {
    case OFF:
      mode = ON;
      Serial.println("ON");
      break;
    // ... und so weiter, bis FAST wieder zu OFF wechselt
  }
}

Das Sketch ruft nextMode() einmal pro Tastendruck auf. Die Taste wird entprellt, wie du es im Abschnitt „Eingaben“ gelernt hast: Wenn sich der Messwert ändert, reagiere darauf und warte dann 20 ms, bis sich die Kontakte beruhigt haben. Ein zweites switch über mode steuert die LED.

challenge icon

Aufgabe

Mittel

Die Schaltfläche und die LED sind für dich bereits programmiert. Schreibe nextMode(), sodass jeder Tastendruck zum nächsten Modus wechselt und dessen Namen ausgibt: OFF, ON, BLINK, FAST, dann wieder OFF.

Drücke Run, drücke die Schaltfläche ein paar Mal und anschließend Check.

Probier es selbst

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

// Wechselt zum nächsten Modus und gibt dessen Namen aus.
void nextMode() {
  // ein case pro Modus: den nächsten Modus setzen, seinen Namen ausgeben, break
}

// Schaltet die LED alle interval ms um.
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. ein Tastendruck (entprellt) ruft nextMode() auf
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      nextMode();
    }
    wasPressed = pressed;
    delay(20);   // den Kontakten Zeit geben, sich zu stabilisieren
  }

  // 2. der Modus bestimmt, was die LED tut
  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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Timing ohne Delay

Übe selbstständig: Arduino-Playground