#include <Servo.h>
Servo myservo;
// Used pins = 4,5,6,9,2 for circuit 1
int ledPin[] = {4,5,6};
int playerOneButton = 2;
int whiteLED = 9;
// declare variables
int delayTime = 1500; // time delay between lights on/off
int whiteLEDOn;
volatile int score = 0;
bool finished = false;
bool done = false;
// Used pins = 13,12,11,10,3 for circuit 2
int ledPin2[] = {12, 11, 10};
int playerTwoButton = 3;
int whiteLED2 = 13;
int whiteLEDOn2;
volatile int score2 = 0;
volatile unsigned long lastTimeButtonPressed = 0;
volatile unsigned long currentTime;
volatile unsigned long lastTimeButtonPressed2 = 0;
volatile unsigned long currentTime2;
//setup interrupt, button input and LED outputs
void setup() {
attachInterrupt(digitalPinToInterrupt(2), playerOneInput, FALLING); // specify interrupt routine
attachInterrupt(digitalPinToInterrupt(3), playerTwoInput, FALLING);
myservo.attach(8);
for (int i=0; i<3; i++){
pinMode(ledPin[i], OUTPUT);
pinMode(ledPin2[i], OUTPUT);
}
pinMode(playerOneButton, INPUT);
pinMode(playerTwoButton, INPUT);
pinMode(whiteLED, OUTPUT);
pinMode(whiteLED2, OUTPUT);
Serial.begin(9600);
}
//run main program loop
void loop() {
if (score < 10 && score2 < 10) {
delay(delayTime);
int randNumber = random(3);
randomSeed(analogRead(A0)); // Generate a new random seed using the floating value from an unused analog pin
int randNumber2 = random(3);
digitalWrite(ledPin[randNumber], HIGH);
digitalWrite(ledPin2[randNumber2], HIGH);
delay(delayTime);
digitalWrite(ledPin[randNumber], LOW);
digitalWrite(ledPin2[randNumber2], LOW);
whiteLEDOn = digitalRead(whiteLED);
whiteLEDOn2 = digitalRead(whiteLED2);
if (whiteLEDOn == HIGH) {
delay(300);
digitalWrite(whiteLED, LOW);
}
if (whiteLEDOn2 == HIGH){
delay(300);
digitalWrite(whiteLED2, LOW);
}
if ((score == 5 || score2 == 5) && !done){
done = true;
int x = random(3);
myservo.write(90*x);
delay(500);
}
} else {
if (!finished) {
for (int i = 0; i < 3; i++) {
digitalWrite(ledPin[i], HIGH);
digitalWrite(ledPin2[i], HIGH);
}
digitalWrite(whiteLED, HIGH);
digitalWrite(whiteLED2, HIGH);
delay(2000);
finished = true;
} else {
for (int i = 0; i < 3; i++) {
digitalWrite(ledPin[i], LOW);
digitalWrite(ledPin2[i], LOW);
}
digitalWrite(whiteLED, LOW);
digitalWrite(whiteLED2, LOW);
}
}
}
// Servo:
// When either player's score reaches 5
// Point to either player
// Randomly add 1 or minus 1
void playerTwoInput() {
currentTime2 = millis();
if (score2 < 10) {
if (digitalRead(ledPin2[0]) == HIGH || digitalRead(ledPin2[1]) == HIGH || digitalRead(ledPin2[2]) == HIGH) {
digitalWrite(whiteLED2, HIGH);
digitalWrite(ledPin2[0], LOW);
digitalWrite(ledPin2[1], LOW);
digitalWrite(ledPin2[2], LOW);
score2 += 1;
lastTimeButtonPressed2 = millis();
} else if (currentTime2 - lastTimeButtonPressed2 >= 300) {
score2 -= 1;
lastTimeButtonPressed2 = millis();
}
}
Serial.println(score2);
}
void playerOneInput() {
currentTime = millis();
if (score < 10) {
if (digitalRead(ledPin[0]) == HIGH || digitalRead(ledPin[1]) == HIGH || digitalRead(ledPin[2]) == HIGH) {
digitalWrite(whiteLED, HIGH);
digitalWrite(ledPin[0], LOW);
digitalWrite(ledPin[1], LOW);
digitalWrite(ledPin[2], LOW);
score += 1;
lastTimeButtonPressed = millis();
} else if (currentTime - lastTimeButtonPressed >= 300) { // Stops the interrupt from running multiple times when button is pressed
score -= 1;
lastTimeButtonPressed = millis();
}
}
}