#include "SevSeg.h"
// Instantiate SevSeg objects for each display
SevSeg sevsegA; // For Team A score
SevSeg sevsegB; // For Team B score
SevSeg sevsegQuarter; // For Quarter display
// --- Team A Score Buttons ---
const int buttonA1Pin = A0; // Team A: Increase by 1 point
const int buttonA2Pin = A1; // Team A: Increase by 2 points
const int buttonA3Pin = A2; // Team A: Increase by 3 points
const int buttonADownPin = A3; // Team A: Decrease by 1 point (or reset, as per original logic)
// --- Team B Score Buttons ---
const int buttonB1Pin = A4; // Team B: Increase by 1 point
const int buttonB2Pin = A5; // Team B: Increase by 2 points
const int buttonB3Pin = A6; // Team B: Increase by 3 points
const int buttonBDownPin = A7; // Team B: Decrease by 1 point (or reset, as per original logic)
// --- Quarter Buttons ---
const int buttonQuarterUpPin = 43; // Increase Quarter
const int buttonQuarterDownPin = 44; // Decrease Quarter
// --- Score Variables ---
int scoreA = 0;
int scoreB = 0;
int currentQuarter = 1;
// Debounce variables
unsigned long lastButtonAPress = 0;
unsigned long lastButtonBPress = 0;
unsigned long lastButtonQuarterPress = 0;
const long debounceDelay = 100; // milliseconds
void setup() {
// Common 7-segment display configuration
byte resistorsOnSegments = false;
byte hardwareConfig = COMMON_ANODE; // Adjust if you have COMMON_CATHODE displays
bool updateWithDelays = false;
bool leadingZeros = false;
bool disableDecPoint = false;
byte brightness = 90;
// --- Team A Display Setup ---
byte numDigitsA = 4;
byte digitPinsA[] = {2, 3, 4, 5};
byte segmentPinsA[] = {6, 7, 8, 9, 10, 11, 12, 13};
sevsegA.begin(hardwareConfig, numDigitsA, digitPinsA, segmentPinsA, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevsegA.setBrightness(brightness);
// --- Team B Display Setup ---
byte numDigitsB = 4;
byte digitPinsB[] = {22, 23, 24, 25}; // Using more digital pins on Mega
byte segmentPinsB[] = {26, 27, 28, 29, 30, 31, 32, 33};
sevsegB.begin(hardwareConfig, numDigitsB, digitPinsB, segmentPinsB, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevsegB.setBrightness(brightness);
// --- Quarter Display Setup ---
byte numDigitsQuarter = 1;
byte digitPinsQuarter[] = {34}; // Single digit for quarter
byte segmentPinsQuarter[] = {35, 36, 37, 38, 39, 40, 41, 42};
sevsegQuarter.begin(hardwareConfig, numDigitsQuarter, digitPinsQuarter, segmentPinsQuarter, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevsegQuarter.setBrightness(brightness);
// --- Button Pin Modes ---
pinMode(buttonA1Pin, INPUT_PULLUP);
pinMode(buttonA2Pin, INPUT_PULLUP);
pinMode(buttonA3Pin, INPUT_PULLUP);
pinMode(buttonADownPin, INPUT_PULLUP);
pinMode(buttonB1Pin, INPUT_PULLUP);
pinMode(buttonB2Pin, INPUT_PULLUP);
pinMode(buttonB3Pin, INPUT_PULLUP);
pinMode(buttonBDownPin, INPUT_PULLUP);
pinMode(buttonQuarterUpPin, INPUT_PULLUP);
pinMode(buttonQuarterDownPin, INPUT_PULLUP);
// Set initial display values
sevsegA.setNumber(scoreA);
sevsegB.setNumber(scoreB);
sevsegQuarter.setNumber(currentQuarter);
}
void loop() {
unsigned long currentTime = millis(); // Get current time for debouncing
// --- Team A Score Logic ---
if (digitalRead(buttonA1Pin) == LOW && (currentTime - lastButtonAPress > debounceDelay)) {
scoreA += 1;
lastButtonAPress = currentTime;
}
if (digitalRead(buttonA2Pin) == LOW && (currentTime - lastButtonAPress > debounceDelay)) {
scoreA += 2;
lastButtonAPress = currentTime;
}
if (digitalRead(buttonA3Pin) == LOW && (currentTime - lastButtonAPress > debounceDelay)) {
scoreA += 3;
lastButtonAPress = currentTime;
}
if (digitalRead(buttonADownPin) == LOW && (currentTime - lastButtonAPress > debounceDelay)) {
// Original code set to 0, changed to decrease by 1 for basketball logic
scoreA = max(0, scoreA - 1); // Ensure score doesn't go below 0
lastButtonAPress = currentTime;
}
// Cap Team A score
if (scoreA > 9999) { // Max for 4 digits
scoreA = 9999;
}
sevsegA.setNumber(scoreA);
// --- Team B Score Logic ---
if (digitalRead(buttonB1Pin) == LOW && (currentTime - lastButtonBPress > debounceDelay)) {
scoreB += 1;
lastButtonBPress = currentTime;
}
if (digitalRead(buttonB2Pin) == LOW && (currentTime - lastButtonBPress > debounceDelay)) {
scoreB += 2;
lastButtonBPress = currentTime;
}
if (digitalRead(buttonB3Pin) == LOW && (currentTime - lastButtonBPress > debounceDelay)) {
scoreB += 3;
lastButtonBPress = currentTime;
}
if (digitalRead(buttonBDownPin) == LOW && (currentTime - lastButtonBPress > debounceDelay)) {
scoreB = max(0, scoreB - 1); // Ensure score doesn't go below 0
lastButtonBPress = currentTime;
}
// Cap Team B score
if (scoreB > 9999) { // Max for 4 digits
scoreB = 9999;
}
sevsegB.setNumber(scoreB);
// --- Quarter Logic ---
if (digitalRead(buttonQuarterUpPin) == LOW && (currentTime - lastButtonQuarterPress > debounceDelay)) {
currentQuarter++;
if (currentQuarter > 4) { // Basketball typically has 4 quarters
currentQuarter = 1; // Loop back to 1st quarter
}
lastButtonQuarterPress = currentTime;
}
if (digitalRead(buttonQuarterDownPin) == LOW && (currentTime - lastButtonQuarterPress > debounceDelay)) {
currentQuarter--;
if (currentQuarter < 1) {
currentQuarter = 4; // Loop back to 4th quarter
}
lastButtonQuarterPress = currentTime;
}
sevsegQuarter.setNumber(currentQuarter);
// --- Refresh all displays ---
sevsegA.refreshDisplay();
sevsegB.refreshDisplay();
sevsegQuarter.refreshDisplay();
}
// Helper function to ensure score doesn't go below zero
int max(int a, int b) {
return (a > b) ? a : b;
}