#include <DFPlayerMini_Fast.h>
#include <SoftwareSerial.h>
// LDR pins (digital or analog depending on use)
const int ldrPins[5] = {A0, A1, A2, A3, A4};
// Answer button pins
const int buttonPins[6] = {23, 25, 27, 29, 31, 33};
// Indicator LEDs for buttons
const int buttonLEDs[6] = {35, 37, 39, 41, 43, 45};
// Feedback LEDs
const int greenLED = 47;
const int redLED = 49;
// Last pressed button
int lastButton = -1;
// LDR code to noun map
String nouns[32] = {
"mother", "father", "children", "house", "bird", "tree", "hat", "scarf",
"rabbit", "wardrobe", "butcher", "playground", "bin", "garland", "carpet", "fish",
"fork", "snacks", "ship", "luggage", "traffic_lights", "hairdresser", "rug", "sofa",
"socks", "trousers", "candle", "lamp", "eggs", "bread", "garlic", "bus"
};
// Setup DFPlayer on Serial1 (Mega: RX1 = pin 19, TX1 = pin 18)
DFPlayerMini_Fast MP3player;
int currentIndex = -1;
void setup() {
Serial.begin(115200);
Serial1.begin(9600); // MP3 module serial
if (!MP3player.begin(Serial1)) {
Serial.println("DFPlayer not found!");
while (true); // Halt
}
MP3player.volume(27); // Set volume 0–30
// Init button & LED pins
for (int i = 0; i < 6; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
pinMode(buttonLEDs[i], OUTPUT);
}
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
}
void loop() {
int pattern = readPattern();
if (pattern != currentIndex) {
currentIndex = pattern;
resetLEDs();
Serial.print("Detected: ");
Serial.println(nouns[pattern]);
}
for (int i = 0; i < 6; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
handleAnswer(i);
delay(300); // debounce
}
}
}
int readPattern() {
int value = 0;
for (int i = 0; i < 5; i++) {
int state = analogRead(ldrPins[i]) < 500 ? 1 : 0; // Adjust threshold
value |= (state << (4 - i));
}
return value;
}
void handleAnswer(int index) {
// Turn off last LED
if (lastButton != -1 && lastButton != index) {
digitalWrite(buttonLEDs[lastButton], LOW);
}
lastButton = index;
digitalWrite(buttonLEDs[index], HIGH);
if (index == 4) {
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
MP3player.play(1); // correct.mp3 (0001.mp3)
} else {
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
MP3player.play(2 + currentIndex); // wrong sound: 0002.mp3 to 0033.mp3
}
}
void resetLEDs() {
for (int i = 0; i < 6; i++) {
digitalWrite(buttonLEDs[i], LOW);
}
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
lastButton = -1;
}