Menu
CoddyTech

Cronômetro com botão

Parte da seção Temporização sem delay do Journey de Arduino da Coddy. Lição 18 de 18.

Um cronômetro tem dois estados, em funcionamento e parado, e um pressionamento o alterna de um para o outro. Ele mede o tempo da maneira segura: armazene millis() no início e subtraia no final.

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

O botão é tratado com antirrepique da mesma forma que o botão de modo: aja quando a leitura mudar e, em seguida, aguarde 20 ms. Os dois pressionamentos aguardam os mesmos 20 ms, então o intervalo entre eles permanece correto.

O LED indica o estado: aceso enquanto o cronômetro está em funcionamento.

challenge icon

Desafio

Médio

O botão já é lido e tratado contra repiques, e onPress() é executada uma vez a cada pressionamento. Escreva onPress():

  • se o cronômetro não estiver em execução: inicie-o, armazene millis() em startTime e acenda o LED
  • se estiver em execução: pare-o, apague o LED e imprima o tempo em milissegundos

Pressione Run, pressione o botão duas vezes e, em seguida, Check.

Experimente você mesmo

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

// Chamada uma vez a cada pressionamento.
void onPress() {
  // não está em execução: iniciar, guardar o horário, acender o LED
  // em execução: parar, apagar o LED, imprimir o tempo em ms
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      onPress();
    }
    wasPressed = pressed;
    delay(20);   // deixar os contatos estabilizarem
  }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Temporização sem delay

Pratique por conta própria: Playground de Arduino