Menu
CoddyTech

Cronometro con pulsante

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

Un cronometro ha due stati, in esecuzione e fermo, e una pressione lo fa passare dall'uno all'altro. Misura il tempo nel modo sicuro: memorizza millis() all'inizio, sottrai alla fine.

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

Il pulsante viene sottoposto a debounce come per il pulsante di modalità: intervieni quando la lettura cambia, poi attendi 20 ms. Entrambe le pressioni attendono gli stessi 20 ms, così il tempo tra loro rimane corretto.

Il LED mostra lo stato: è acceso mentre il cronometro è in esecuzione.

challenge icon

Sfida

Medio

Il pulsante viene già letto e il rimbalzo viene già gestito, e onPress() viene eseguita una volta per ogni pressione. Scrivi onPress():

  • se il cronometro non è in funzione: avvialo, memorizza millis() in startTime e accendi il LED
  • se è in funzione: fermalo, spegni il LED e stampa il tempo in millisecondi

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

Provalo tu

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

// Chiamata una volta per ogni pressione.
void onPress() {
  // running è false: avvia, memorizza l'istante, accendi il LED
  // running è true: ferma, spegni il LED, stampa il tempo in ms
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      onPress();
    }
    wasPressed = pressed;
    delay(20);   // lascia stabilizzare i contatti
  }
}
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