#include <SevSeg.h>
// Pin configuration
const int g = 12;
const int f = 14;
const int e = 27;
const int d = 26;
const int c = 25;
const int b = 33;
const int a = 32;
const int d1 = 23; // Display for Participant A
const int d2 = 22; // Display for Participant B
const int d3 = 21; // Display for Participant C
// Button configuration
const int buttonA = 2;
const int buttonB = 4;
const int buttonC = 5;
const int buttonReset = 15;
const int buttonCorrect = 18;
const int buttonWrong = 19;
bool buttonPressed[3] = { false, false, false };
bool canPressButton = true;
int scoreA = 0;
int scoreB = 0;
int scoreC = 0;
unsigned long lastButtonPressTime = 0;
unsigned long debounceDelay = 300; // Adjust as necessary
bool resetTriggered = false;
unsigned long participantDisplayStartTime = 0;
bool showParticipant = false;
void setup() {
Serial.begin(115200);
// Pin initialization
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(buttonA, INPUT_PULLUP);
pinMode(buttonB, INPUT_PULLUP);
pinMode(buttonC, INPUT_PULLUP);
pinMode(buttonReset, INPUT_PULLUP);
pinMode(buttonCorrect, INPUT_PULLUP);
pinMode(buttonWrong, INPUT_PULLUP);
displayInitialNames();
resetButtons();
clearr();
angka(0); // Display initial number
}
void loop() {
if (millis() - lastButtonPressTime > debounceDelay) {
checkButtonReset();
checkParticipantButtons();
checkAnswerButtons();
}
// Check if participant name should still be displayed or return to scores
if (showParticipant) {
if (millis() - participantDisplayStartTime > 3000) { // 3 seconds
showParticipant = false;
}
} else {
displayScoresSimultaneously();
}
}
void checkButtonReset() {
if (digitalRead(buttonReset) == LOW && !resetTriggered) {
Serial.println("Juri Reset Buttons");
resetButtons();
displayInitialNames();
canPressButton = true;
resetTriggered = true;
lastButtonPressTime = millis();
} else if (digitalRead(buttonReset) == HIGH) {
resetTriggered = false;
}
}
void checkParticipantButtons() {
if (canPressButton && !resetTriggered) {
if (digitalRead(buttonA) == LOW && !buttonPressed[0]) {
buttonPressed[0] = true;
handleParticipant('A');
}
if (digitalRead(buttonB) == LOW && !buttonPressed[1]) {
buttonPressed[1] = true;
handleParticipant('B');
}
if (digitalRead(buttonC) == LOW && !buttonPressed[2]) {
buttonPressed[2] = true;
handleParticipant('C');
}
}
}
void handleParticipant(char participant) {
displayParticipant(participant);
showParticipant = true;
participantDisplayStartTime = millis();
Serial.print("peserta ");
Serial.print(participant);
Serial.println(" click button");
canPressButton = false;
lastButtonPressTime = millis();
}
void checkAnswerButtons() {
if (digitalRead(buttonCorrect) == LOW && !canPressButton) {
Serial.println("jawaban benar");
updateScore(true);
lastButtonPressTime = millis();
}
if (digitalRead(buttonWrong) == LOW && !canPressButton) {
Serial.println("jawaban salah");
updateScore(false);
lastButtonPressTime = millis();
}
}
void displayInitialNames() {
Serial.println("Display initial names");
digitalWrite(d1, HIGH);
angka('A');
delay(1000);
digitalWrite(d1, LOW);
digitalWrite(d2, HIGH);
angka('B');
delay(1000);
digitalWrite(d2, LOW);
digitalWrite(d3, HIGH);
angka('C');
delay(1000);
digitalWrite(d3, LOW);
clearr();
}
void displayParticipant(char participant) {
clearr();
Serial.println("display participant");
if (participant == 'A') {
digitalWrite(d1, HIGH);
angka('A');
} else if (participant == 'B') {
digitalWrite(d2, HIGH);
angka('B');
} else if (participant == 'C') {
digitalWrite(d3, HIGH);
angka('C');
}
}
void displayScoreA() {
// Display score A on d1
digitalWrite(d1, HIGH);
clearr();
angka(scoreA); // Display score A
digitalWrite(d1, LOW);
}
void displayScoreB() {
// Display score B on d2
digitalWrite(d2, HIGH);
clearr();
angka(scoreB); // Display score B
digitalWrite(d2, LOW);
}
void displayScoreC() {
// Display score C on d3
digitalWrite(d3, HIGH);
clearr();
angka(scoreC); // Display score C
digitalWrite(d3, LOW);
}
void displayScoresSimultaneously() {
displayScoreA();
displayScoreB();
displayScoreC();
}
void updateScore(bool correct) {
Serial.println("update score");
// Update score based on which button was pressed
if (buttonPressed[0]) {
scoreA += correct ? 1 : 0;
displayScoreA();
}
if (buttonPressed[1]) {
scoreB += correct ? 1 : 0;
displayScoreB();
}
if (buttonPressed[2]) {
scoreC += correct ? 1 : 0;
displayScoreC();
}
// Display scores after updating
Serial.print("score A: ");
Serial.println(scoreA);
Serial.print("score B: ");
Serial.println(scoreB);
Serial.print("score C: ");
Serial.println(scoreC);
}
void resetButtons() {
Serial.println("Reset buttons & seven segment");
for (int i = 0; i < 3; i++) {
buttonPressed[i] = false;
}
clearr();
canPressButton = true;
}
void clearr() {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void angka(byte i) {
switch (i) {
case 'A':
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 'B':
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 'C':
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case 0:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case 1:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 2:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case 3:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case 4:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 5:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 6:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 7:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 8:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 9:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
}
}