volatile bool running = false; // Stopwatch running state
volatile unsigned long elapsedTime = 0; // Time in milliseconds
unsigned long previousMillis = 0; // Stores last update time
unsigned long lastToggleTime = 0; // For debounce on Start/Stop button
unsigned long lastResetTime = 0; // For debounce on Reset button
void setup() {
Serial.begin(9600); // Initialize Serial communication
pinMode(5, INPUT_PULLUP); // Start/Stop button with internal pull-up
pinMode(8, INPUT_PULLUP); // Reset button with internal pull-up
// Attach interrupts
attachInterrupt(digitalPinToInterrupt(5), toggleStopwatch, FALLING);
attachInterrupt(digitalPinToInterrupt(8), resetStopwatch, FALLING);
Serial.println("Stopwatch Ready");
}
void loop() {
if (running) {
unsigned long currentMillis = millis();
elapsedTime += currentMillis - previousMillis; // Update elapsed time
previousMillis = currentMillis;
// Print elapsed time to Serial Monitor
Serial.print("Time: ");
Serial.print(elapsedTime / 1000); // Convert milliseconds to seconds
Serial.println(" s");
delay(1000); // Update every second
}
}
void toggleStopwatch() {
unsigned long currentMillis = millis();
// Debounce logic for Start/Stop button
if (currentMillis - lastToggleTime > 200) { // 200 ms debounce time
running = !running; // Toggle running state
if (running) {
previousMillis = millis(); // Reset previousMillis when starting
}
lastToggleTime = currentMillis; // Update last toggle time
}
}
void resetStopwatch() {
unsigned long currentMillis = millis();
// Debounce logic for Reset button
if (currentMillis - lastResetTime > 200) { // 200 ms debounce time
running = false; // Stop the stopwatch
elapsedTime = 0; // Reset elapsed time
Serial.println("Stopwatch Reset");
lastResetTime = currentMillis; // Update last reset time
}
}
Restart