#include <SPI.h>
#include <DMD2.h>
#include <TimerOne.h>
#define DISPLAYS_ACROSS 2
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
#define bt_startA A0
#define bt_startB A1
#define bt_startC A2
#define bt_stopA A3
#define bt_stopB A4
#define bt_stopC A5
#define bt_reset 12
int hh = 0, mm = 0, ss = 0, ms = 0;
bool timerStart = false;
bool displayWinner = false;
bool stopPressed = false;
char winner = ' ';
int final_hh = 0, final_mm = 0, final_ss = 0, final_ms = 0;
void ScanDMD()
{
dmd.scanDisplayBySPI();
}
void setup() {
pinMode(bt_reset, INPUT_PULLUP);
pinMode(bt_startA, INPUT_PULLUP);
pinMode(bt_startB, INPUT_PULLUP);
pinMode(bt_startC, INPUT_PULLUP);
pinMode(bt_stopA, INPUT_PULLUP);
pinMode(bt_stopB, INPUT_PULLUP);
pinMode(bt_stopC, INPUT_PULLUP);
dmd.setBrightness(10); // Set the brightness of the display
Timer1.initialize(1000); // Set the timer interrupt to occur every 1ms
Timer1.attachInterrupt(ScanDMD);
Serial.begin(9600); // For debugging, if needed
}
void loop() {
if (digitalRead(bt_startA) == LOW && !stopPressed) {
timerStart = true;
displayWinner = false;
dmd.clearScreen();
} else if (digitalRead(bt_startB) == LOW && !stopPressed) {
timerStart = true;
displayWinner = false;
dmd.clearScreen();
} else if (digitalRead(bt_startC) == LOW && !stopPressed) {
timerStart = true;
displayWinner = false;
dmd.clearScreen();
}
if (timerStart) {
if (digitalRead(bt_stopA) == LOW && !stopPressed) {
stopPressed = true;
timerStart = false;
winner = 'A';
dmd.clearScreen();
final_hh = hh;
final_mm = mm;
final_ss = ss;
final_ms = ms;
displayWinner = true;
} else if (digitalRead(bt_stopB) == LOW && !stopPressed) {
stopPressed = true;
timerStart = false;
winner = 'B';
dmd.clearScreen();
final_hh = hh;
final_mm = mm;
final_ss = ss;
final_ms = ms;
displayWinner = true;
} else if (digitalRead(bt_stopC) == LOW && !stopPressed) {
stopPressed = true;
timerStart = false;
winner = 'C';
dmd.clearScreen();
final_hh = hh;
final_mm = mm;
final_ss = ss;
final_ms = ms;
displayWinner = true;
}
}
if (digitalRead(bt_reset) == LOW) {
timerStart = false;
displayWinner = false;
stopPressed = false;
dmd.clearScreen();
ms = 0;
ss = 0;
mm = 0;
hh = 0;
}
if (displayWinner) {
dmd.drawString(0, 0, "WIN : ");
dmd.drawChar(40, 0, winner);
dmd.drawString(0, 12, "TIMER: ");
dmd.drawNumber(40, 12, final_hh);
dmd.drawChar(64, 12, ':');
dmd.drawNumber(72, 12, final_mm);
dmd.drawChar(96, 12, ':');
dmd.drawNumber(104, 12, final_ss);
dmd.drawChar(128, 12, '.');
dmd.drawNumber(136, 12, final_ms);
} else if (timerStart) {
dmd.drawString(0, 0, " STOPWATCH ");
dmd.drawNumber(24, 12, hh);
dmd.drawChar(48, 12, ':');
dmd.drawNumber(56, 12, mm);
dmd.drawChar(80, 12, ':');
dmd.drawNumber(88, 12, ss);
dmd.drawChar(112, 12, '.');
dmd.drawNumber(120, 12, ms);
} else {
dmd.drawString(0, 0, " ENGINE ON ");
dmd.drawString(0, 12, " LET'S START ");
}
}
ISR(TIMER1_COMPA_vect){
if (timerStart) {
ms++;
if (ms > 999) {
ms = 0;
ss++;
if (ss > 59) {
ss = 0;
mm++;
if (mm > 59) {
mm = 0;
hh++;
}
}
}
}
}