#include <U8g2lib.h>
// Pin definitions
#define BUTTON_PIN 2
// Display initialization
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
// Fonts
const uint8_t* GOOD_FONT = u8g2_font_VCR_OSD_mr;
const uint8_t* STOPWATCH_FONT = u8g2_font_inb30_mf;
// Debounce parameters
const uint16_t DEBOUNCE_DELAY = 50;
const uint8_t DEBOUNCE_THRESHOLD = 3;
// Stopwatch state
volatile bool stopwatchRunning = false;
volatile uint32_t startTime = 0;
volatile uint32_t stopTime = 0;
volatile float elapsedTime = 0.0f;
// Button debounce variables
volatile uint8_t debounceCounter = 0;
volatile bool buttonPressed = false;
volatile bool buttonReleased = false;
void setup() {
// Initialize button pin
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Initialize display
u8g2.begin();
u8g2.setFont(GOOD_FONT);
u8g2.clearBuffer();
u8g2.drawStr(0, 30, "Good");
u8g2.drawStr(0, 60, "Curling!");
u8g2.sendBuffer();
}
void loop() {
// Handle button debounce
if (digitalRead(BUTTON_PIN) == LOW) {
if (++debounceCounter >= DEBOUNCE_THRESHOLD) {
if (!buttonPressed) {
buttonPressed = true;
buttonReleased = false;
}
debounceCounter = 0;
}
} else {
if (++debounceCounter >= DEBOUNCE_THRESHOLD) {
if (buttonPressed) {
buttonPressed = false;
buttonReleased = true;
}
debounceCounter = 0;
}
}
// Handle button press
if (buttonReleased) {
buttonReleased = false;
if (!stopwatchRunning) {
// Start stopwatch
startTime = millis();
stopwatchRunning = true;
elapsedTime = 0.0f;
// Display stopwatch
u8g2.setFont(STOPWATCH_FONT);
u8g2.clearBuffer();
u8g2.setCursor(0, 40);
u8g2.print("0.000");
u8g2.sendBuffer();
} else {
// Stop stopwatch
stopTime = millis();
stopwatchRunning = false;
elapsedTime += (stopTime - startTime) / 1000.0f;
// Display elapsed time
u8g2.clearBuffer();
// u8g2.setCursor(0, 10);
// u8g2.print("Elapsed time:");
u8g2.setCursor(0, 40);
u8g2.print(elapsedTime, 3);
u8g2.sendBuffer();
}
}
// Update stopwatch
if (stopwatchRunning) {
// Calculate elapsed time
elapsedTime += (millis() - startTime) / 1000.0f;
startTime = millis();
// Display elapsed time
u8g2.clearBuffer();
// u8g2.setCursor(0, 10);
// u8g2.print("Elapsed time:");
u8g2.setCursor(0, 40);
u8g2.print(elapsedTime, 3);
u8g2.sendBuffer();
}
}