#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Define button pins
const int buttonStartPin = 15;
const int buttonStopPin = 2;
const int buttonResetPin = 4;
// Define display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Variables for stopwatch
unsigned long startTime = 0;
unsigned long elapsedTime = 0;
bool running = false;
void setup() {
pinMode(buttonStartPin, INPUT_PULLUP);
pinMode(buttonStopPin, INPUT_PULLUP);
pinMode(buttonResetPin, INPUT_PULLUP);
// Initialize display
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C is a common I2C address for SSD1306
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("Stopwatch");
display.display();
delay(2000);
display.clearDisplay();
}
void loop() {
// Check start button
if (digitalRead(buttonStartPin) == HIGH) {
if (!running) {
running = true;
startTime = millis() - elapsedTime;
}
}
// Check stop button
if (digitalRead(buttonStopPin) == HIGH) {
if (running) {
running = false;
elapsedTime = millis() - startTime;
}
}
// Check reset button
if (digitalRead(buttonResetPin) == HIGH) {
running = false;
elapsedTime = 0;
}
// Update display
if (running) {
elapsedTime = millis() - startTime;
}
display.clearDisplay();
display.setCursor(0, 0);
display.print("Time: ");
display.print(elapsedTime / 1000);
display.print(".");
display.print((elapsedTime % 1000) / 100);
display.display();
delay(100);
}