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.
Desafío
IntermedioEl 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()enstartTimey 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
}
}
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