int ledPins[] = {D3, D4, D5, D6, D7, D8, D9, D10};
int winLedPin = D10;
int rgbRedPin = D11;
int rgbBluePin = D13;
int totalLEDs = 8;
int baseDelayTime = 100;
int delayTime = baseDelayTime;
int fastDelayTime = 20;
int level = 1;
int maxLevel = 5;
volatile bool holdLEDState = false;
volatile int lastLEDIndex = -1;
volatile bool isPurple = false;
volatile bool isGreen = false;
enum GameState {IDLE, RUNNING, WIN, LOSE};
GameState currentState = IDLE;
void setup() {
for (int i = 0; i < totalLEDs; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
pinMode(rgbRedPin, OUTPUT);
pinMode(rgbBluePin, OUTPUT);
pinMode(D2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(D2), holdLEDs, FALLING);
setRGBColor(HIGH, HIGH);
}
void loop() {
switch (currentState) {
case IDLE:
holdLEDState = false;
lastLEDIndex = -1;
isPurple = false;
isGreen = false;
setRGBColor(HIGH, HIGH);
currentState = RUNNING;
break;
case RUNNING:
for (int i = 0; i < totalLEDs; i++) {
if (i % 2 == 0) {
isPurple = true;
isGreen = false;
} else {
isGreen = true;
isPurple = false;
}
if (holdLEDState) {
lastLEDIndex = i;
currentState = (ledPins[i] == winLedPin) ? WIN : LOSE;
break;
}
digitalWrite(ledPins[i], HIGH);
delay(delayTime);
digitalWrite(ledPins[i], LOW);
}
break;
case WIN:
digitalWrite(ledPins[lastLEDIndex], HIGH);
setRGBColor(HIGH, LOW);
delay(1000);
if (level < maxLevel) {
level++;
delayTime = max(delayTime - 20, fastDelayTime);
}
currentState = IDLE;
break;
case LOSE:
digitalWrite(ledPins[lastLEDIndex], HIGH);
setRGBColor(LOW, HIGH);
delay(1000);
currentState = IDLE;
break;
}
}
//Naufal Arya Putra Ultawijaya
//1103223204
//Rabu Shift 1
//Kelompok 19
void setRGBColor(int red, int blue) {
digitalWrite(rgbRedPin, red);
digitalWrite(rgbBluePin, blue);
}
void holdLEDs() {
if (isPurple) {
setRGBColor(HIGH, LOW);
} else if (isGreen) {
setRGBColor(LOW, HIGH);
}
holdLEDState = true;
}