Menu
CoddyTech

Cambiar de modo con un botón

Parte de la sección Temporización sin delay del Journey de Arduino de Coddy. Lección 11 de 18.

Muchos dispositivos tienen un botón que va pasando por los modos: la luz de una bicicleta se apaga, se enciende, parpadea, parpadea rápidamente y después se apaga de nuevo. Eso es una máquina de estados en la que una pulsación, no el reloj, pasa al siguiente estado.

Pon el paso en su propia función. Un switch sobre el modo actual establece el siguiente, y el último modo vuelve al primero:

void nextMode() {
  switch (mode) {
    case OFF:
      mode = ON;
      Serial.println("ON");
      break;
    // ... y así sucesivamente, hasta que FAST vuelva a OFF
  }
}

El programa llama a nextMode() una vez por pulsación. El botón se elimina el rebote como aprendiste en la sección Entradas: cuando la lectura cambia, actúa en consecuencia y después espera 20 ms para que los contactos se estabilicen. Un segundo switch sobre mode establece el LED.

challenge icon

Desafío

Intermedio

El botón y el LED están escritos por ti. Escribe nextMode() para que cada pulsación avance al siguiente modo e imprima su nombre: OFF, ON, BLINK, FAST y después OFF otra vez.

Pulsa Run, pulsa el botón unas cuantas veces y después Check.

Pruébalo tú mismo

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

// Pasa al siguiente modo e imprime su nombre.
void nextMode() {
  // un caso por modo: establece el siguiente modo, imprime su nombre, break
}

// Cambia el estado del LED cada 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 pulsación (con antirrebote) llama a nextMode()
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      nextMode();
    }
    wasPressed = pressed;
    delay(20);   // deja que los contactos se estabilicen
  }

  // 2. el modo determina qué hace el 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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Temporización sin delay

Practica por tu cuenta: Playground de Arduino