int ledPins[] = {22, 17, 16, 4};
int btnPins[] = {2, 21, 19, 18};
int buzzer = 15;
// Button values
volatile int btn_val1, btn_val2, btn_val3, btn_val4;
int size = 0;
int point = 0;
int delayTime = 500;
const int maxSize = 11;
int randomArray[maxSize];
void setup() {
// Initializing the leds and buzzer as output and button as input
for (int index = 0; index < 4; ++index) {
pinMode(ledPins[index], OUTPUT);
pinMode(btnPins[index], INPUT);
}
pinMode(buzzer, OUTPUT);
// Multiprocessing for reading the inputs
xTaskCreate(BTN1_READ, "Btn1 Value", 1000, NULL, 1, NULL);
xTaskCreate(BTN2_READ, "Btn2 Value", 1000, NULL, 1, NULL);
xTaskCreate(BTN3_READ, "Btn3 Value", 1000, NULL, 2, NULL);
xTaskCreate(BTN4_READ, "Btn4 Value", 1000, NULL, 2, NULL);
Serial.begin(115200);
}
void loop() {
generate_RandNumbers();
Serial.print("ERROR!!!!");
}
void BTN1_READ(void* param) {
while (1) {
btn_val1 = digitalRead(btnPins[0]);
vTaskDelay(10);
}
}
void BTN2_READ(void* param) {
while (1) {
btn_val2 = digitalRead(btnPins[1]);
vTaskDelay(10);
}
}
void BTN3_READ(void* param) {
while (1) {
btn_val3 = digitalRead(btnPins[2]);
vTaskDelay(10);
}
}
void BTN4_READ(void* param) {
while (1) {
btn_val4 = digitalRead(btnPins[3]);
vTaskDelay(10);
}
}
void generate_RandNumbers() {
if (size > 10) size = 0;
int randomNumber = random(4);
randomArray[size] = randomNumber;
Serial.print("New Random Number: ");
Serial.print(randomNumber);
Serial.print(" || Sequence of LED: ");
for (int i = 0; i <= size; i++) {
Serial.print(randomArray[i] + 1);
Serial.print(" ");
}
Serial.print("|| Size: ");
Serial.print(size);
Serial.print("|| DelayTime ");
Serial.println(delayTime);
delay(100);
applyChallenge();
}
void applyChallenge() {
for (int i = 0; i <= size; i++) {
int challengeData = randomArray[i];
digitalWrite(ledPins[challengeData], HIGH);
tone(buzzer, 1000);
delay(100);
noTone(buzzer);
delay(delayTime);
digitalWrite(ledPins[challengeData], LOW);
delay(delayTime);
}
delayTime -= 10;
btnOutput();
}
void btnOutput() {
if (btn_val1 == 1) checkedPressed(0);
if (btn_val2 == 1) checkedPressed(1);
if (btn_val3 == 1) checkedPressed(2);
if (btn_val4 == 1) checkedPressed(3);
if (btn_val1 == 0 && btn_val2 == 0 && btn_val3 == 0 && btn_val4 == 0) btnOutput();
}
void checkedPressed(int pin) {
// Output of the btn that has been clicked
if (point <= size) {
if (randomArray[point] == pin) {
//checking if the data is correct
Serial.print("LED :");
Serial.print(pin + 1);
Serial.print(" is equal to ");
Serial.println(randomArray[point]);
Serial.print("Size = ");
Serial.print(size);
Serial.print(" Point = ");
Serial.print(point);
Serial.print(" Button Clicked: ");
Serial.print(pin + 1);
Serial.print(" LED LIGHT ON: ");
Serial.println(pin + 1);
digitalWrite(ledPins[pin], HIGH);
tone(buzzer, 1000);
delay(50);
digitalWrite(ledPins[pin], LOW);
noTone(buzzer);
delay(50);
point++;
delay(500);
if (point > size) {
size++;
point = 0;
generate_RandNumbers();
} else {
btnOutput();
}
} else gameOver();
} else {
point = 0;
}
}
void gameOver() {
for (int i = 0; i < 15; i++) {
int rand = random(4);
digitalWrite(ledPins[rand], HIGH);
tone(buzzer, 500);
delay(50);
digitalWrite(ledPins[rand], LOW);
noTone(buzzer);
delay(50);
}
size = 0;
generate_RandNumbers();
}