Menu
CoddyTech

Cronómetro con botón

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

Un cronómetro tiene dos estados, en marcha y detenido, y una pulsación lo mueve de uno al otro. Mide el tiempo de forma segura: guarda millis() al inicio y réstalo al final.

if (!running) {
  running = true;
  startTime = millis();
} else {
  running = false;
  Serial.println(millis() - startTime);
}

El botón se elimina el rebote igual que el botón de modo: actúa cuando la lectura cambia y después espera 20 ms. Ambas pulsaciones esperan los mismos 20 ms, así que el tiempo entre ellas sigue siendo correcto.

El LED muestra el estado: encendido mientras el cronómetro está en marcha.

challenge icon

Desafío

Intermedio

El botón ya se lee y se ha eliminado el rebote, y onPress() se ejecuta una vez por cada pulsación. Escribe onPress():

  • si el cronómetro no está en marcha: ponlo en marcha, guarda millis() en startTime y enciende el LED
  • si está en marcha: detenlo, apaga el LED e imprime el tiempo en milisegundos

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

Pruébalo tú mismo

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

bool wasPressed = false;
bool running = false;
unsigned long startTime = 0;

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

// Se llama una vez por cada pulsación.
void onPress() {
  // si no está en marcha: iniciar, guardar la hora, encender el LED
  // si está en marcha: detener, apagar el LED, imprimir el tiempo en ms
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      onPress();
    }
    wasPressed = pressed;
    delay(20);   // dejar que se estabilicen los contactos
  }
}
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