#include <LedControl.h>
// MAX7219 pin configuration
const int DIN_PIN = 11;
const int CLK_PIN = 13;
const int CS_PIN = 8;
// Button pin
const int BUTTON_PIN = 7;
// Display configuration
LedControl lc = LedControl(DIN_PIN, CLK_PIN, CS_PIN, 1);
// Stopwatch variables
unsigned long startTime = 0;
unsigned long elapsedTime = 0;
bool isRunning = false;
// Button handling variables
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
unsigned long pressStartTime = 0;
const unsigned long longPressDuration = 1000;
int lastButtonState = HIGH;
void setup() {
// Initialize display
lc.shutdown(0, false);
lc.setIntensity(0, 8);
lc.clearDisplay(0);
// Initialize button
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Show initial zero
updateDisplay(0);
}
void loop() {
handleButton();
if (isRunning) {
elapsedTime = millis() - startTime;
updateDisplay(elapsedTime);
}
}
void handleButton() {
int reading = digitalRead(BUTTON_PIN);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != lastButtonState) {
lastButtonState = reading;
if (lastButtonState == LOW) {
pressStartTime = millis();
} else {
unsigned long pressDuration = millis() - pressStartTime;
if (pressDuration >= longPressDuration) {
// Long press - reset
elapsedTime = 0;
isRunning = false;
updateDisplay(0);
} else {
// Short press - toggle start/stop
isRunning = !isRunning;
if (isRunning) {
startTime = millis() - elapsedTime;
}
}
}
}
}
}
void updateDisplay(unsigned long timeMs) {
unsigned long totalSeconds = timeMs / 1000;
int minutes = totalSeconds / 60;
int seconds = totalSeconds % 60;
int digits[4] = {
minutes / 10, // Minutes tens
minutes % 10, // Minutes ones (with colon)
seconds / 10, // Seconds tens
seconds % 10 // Seconds ones
};
// Set digits with colon on second position
for (int i = 0; i < 4; i++) {
bool dp = (i == 1); // Show colon on second digit
lc.setDigit(0, 3 - i, digits[i], dp);
}
}