Menu
CoddyTech

Cambiare modalità con un pulsante

Fa parte della sezione Temporizzazione senza delay del percorso Arduino di Coddy. Lezione 11 di 18.

Molti gadget hanno un solo pulsante che scorre tra le modalità: la luce di una bicicletta si spegne, si accende, lampeggia, lampeggia velocemente, poi si spegne di nuovo. È una macchina a stati in cui è una pressione, non l'orologio, a passare allo stato successivo.

Metti il passaggio in una funzione dedicata. Uno switch sulla modalità corrente imposta quella successiva, e l'ultima modalità torna alla prima:

void nextMode() {
  switch (mode) {
    case OFF:
      mode = ON;
      Serial.println("ON");
      break;
    // ... e così via, finché FAST non torna a OFF
  }
}

Lo sketch chiama nextMode() una volta per pressione. Il pulsante viene sottoposto ad antirimbalzo nel modo che hai imparato nella sezione Inputs: quando la lettura cambia, agisci di conseguenza, poi attendi 20 ms affinché i contatti si stabilizzino. Un secondo switch su mode imposta il LED.

challenge icon

Sfida

Medio

Il pulsante e il LED sono già pronti. Scrivi nextMode() in modo che ogni pressione passi alla modalità successiva e ne stampi il nome: OFF, ON, BLINK, FAST, poi di nuovo OFF.

Premi Run, premi il pulsante alcune volte, poi Check.

Provalo tu

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

// Passa alla modalità successiva e ne stampa il nome.
void nextMode() {
  // un case per ogni modalità: imposta la modalità successiva, stampa il suo nome, break
}

// Commuta il LED ogni 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. una pressione (con antirimbalzo) chiama nextMode()
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      nextMode();
    }
    wasPressed = pressed;
    delay(20);   // lascia stabilizzare i contatti
  }

  // 2. la modalità determina cosa fa il 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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Temporizzazione senza delay

Esercitati da solo: Playground Arduino