/*
Forum: https://forum.arduino.cc/t/code-fur-arduino-mega-2560/1416253
Wokwi: https://wokwi.com/projects/448617034311731201
Code zum Testen der Schaltlogik angepasst (mp3-Player-Anteile auskommentiert)
Einfaches "Debouncing" der Schiebeschalter mit delay(50) eingebracht
Serielle Ausgabe eingefügt, wenn ein "Puzzleteil" wieder aufgenommen wird
ec2021
*/
#include <Arduino.h>
#include <SoftwareSerial.h> // Nicht benötigt für Mega HardwareSerial, aber oft in Bibliothek enthalten
//#include <DFRobotDFPlayerMini.h>
//DFRobotDFPlayerMini myMP3;
// Pins für die Puzzleteile
const int puzzlePins[] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45};
const int numPuzzles = sizeof(puzzlePins) / sizeof(puzzlePins[0]);
// Arrays zur Speicherung des vorherigen und aktuellen Zustands für die Flankenerkennung
int lastPuzzleState[numPuzzles];
int currentPuzzleState[numPuzzles];
void setup() {
Serial.begin(115200);
// Initialisiere Hardware Serial Port 1 für den DFPlayer
/*
Serial1.begin(9600); // Baudrate für DFPlayer
Serial.println("Initialisiere DFPlayer Mini...");
// Warten, bis der Player bereit ist
if (!myMP3.begin(Serial1)) {
Serial.println("DFPlayer ist nicht bereit! Bitte Verkabelung prüfen.");
while(true); // Programm stoppen, wenn Player nicht gefunden wird
}
Serial.println("DFPlayer bereit.");
myMP3.volume(20); // Lautstärke einstellen (0-30)
*/
// Pins als Eingänge konfigurieren und interne Pull-ups aktivieren
for (int i = 0; i < numPuzzles; i++) {
pinMode(puzzlePins[i], INPUT_PULLUP);
// Initialzustand lesen (wenn nichts aufgelegt, ist der Pin HIGH wegen Pull-up)
lastPuzzleState[i] = digitalRead(puzzlePins[i]);
}
}
void loop() {
for (int i = 0; i < numPuzzles; i++) {
// Aktuellen Zustand lesen
currentPuzzleState[i] = digitalRead(puzzlePins[i]);
// Flankenerkennung: Prüfen, ob der Zustand von HIGH auf LOW gewechselt hat (Kontakt zu GND)
if (lastPuzzleState[i] != currentPuzzleState[i]) {
delay(50); // **************** Debouncing!!! **************
// Wenn der Pin jetzt LOW ist, wurde das Puzzleteil gerade aufgelegt
if (currentPuzzleState[i] == LOW) {
// Spielen Sie die entsprechende MP3-Datei ab.
// Die Dateien müssen auf der SD-Karte als 001.mp3, 002.mp3, ..., 024.mp3 benannt sein.
// Die Track-Nummer ist i + 1, da Arrays bei 0 beginnen
Serial.print("Puzzleteil ");
Serial.print(i + 1);
Serial.println(" aufgelegt. Spiele MP3...");
// Abspielen des Tracks mit der Nummer i+1
// myMP3.play(i + 1);
// Optionale Funktion, die besser funktioniert, wenn man sicherstellen will,
// dass der Player einen neuen Befehl annimmt, auch wenn noch ein alter läuft
//myMP3.stop(); // Stoppt das aktuelle Lied
delay(10); // Kurze Pause
//myMP3.play(i + 1); // Startet das neue Lied
} else {
Serial.print("Puzzleteil ");
Serial.print(i + 1);
Serial.println(" wieder aufgenommen.");
}
// Zustand für den nächsten Durchlauf aktualisieren
lastPuzzleState[i] = currentPuzzleState[i];
}
}
}