#include #include #include #include // Richtig konfigurierte SPI-Pins für ESP8266 #define TFT_CS 15 // D8 #define TFT_RST 16 // D0 #define TFT_DC 2 // D4 // ST7735 Display initialisieren Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); #include "Arduino.h" #include "DFRobotDFPlayerMini.h" #include SoftwareSerial softSerial(D1, D2); // RX, TX Pins #define FPSerial softSerial DFRobotDFPlayerMini myDFPlayer; void printDetail(uint8_t type, int value); // PCF8574 für Tastatur (I2C-Adresse: 0x20) #define PCF8574_ADDR 0x20 // Tasten-Matrix char keys[4][4] = { {'1', '4', '7', '*'}, {'2', '5', '8', '0'}, {'3', '6', '9', '#'}, {'A', 'B', 'C', 'D'} }; // Pin-Zuordnung PCF8574 <-> 4x4-Tastatur const int COLUMN_PINS[4] = {0, 1, 2, 3}; // P0-P3 als Spalten const int ROW_PINS[4] = {4, 5, 6, 7}; // P4-P7 als Reihen void setup() { Serial.begin(9600); FPSerial.begin(9600); // Beginne die serielle Kommunikation mit 9600 Baud // SPI initialisieren SPI.begin(); // TFT-Display initialisieren tft.initR(INITR_BLACKTAB); tft.setRotation(1); tft.fillScreen(ST77XX_BLACK); tft.setCursor(10, 10); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(2); tft.println("Bereit!"); // I2C starten Wire.begin(D3, D6); // SDA = D3 (GPIO0), SCL = D6 (GPIO12) Serial.println("Bereit zur Eingabe."); Serial.println(); Serial.println(F("DFRobot DFPlayer Mini Demo")); Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); if (!myDFPlayer.begin(FPSerial, /*isACK = */true, /*doReset = */true)) { Serial.println(F("Unable to begin:")); Serial.println(F("1.Please recheck the connection!")); Serial.println(F("2.Please insert the SD card!")); if (!myDFPlayer.begin(FPSerial)) { Serial.println(F("Fehler beim Initialisieren des DFPlayer Mini!")); return; } } Serial.println(F("DFPlayer Mini online.")); myDFPlayer.volume(10); // Setzt die Lautstärke auf 10 (von 0 bis 30) // myDFPlayer.play(1); // Spielt die erste MP3-Datei myDFPlayer.loop(1); //Loop the first mp3 } void loop() { char pressedKey = scanKeypad(); // Tastaturabfrage if (pressedKey != 0) { Serial.print("Taste gedrückt: "); Serial.println(pressedKey); // Display aktualisieren tft.fillScreen(ST77XX_BLACK); tft.setCursor(10, 10); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(2); tft.print("Taste: "); tft.println(pressedKey); } // Prüfen, ob Daten im Serial Monitor verfügbar sind if (Serial.available()) { char serialInput = Serial.read(); // Lese die Eingabe aus dem Serial Monitor Serial.print("Eingabe über Serial Monitor: "); Serial.println(serialInput); // Zeige die Eingabe im Serial Monitor an // Display aktualisieren tft.fillScreen(ST77XX_BLACK); tft.setCursor(10, 10); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(2); tft.print("Serial: "); tft.println(serialInput); // Zeige die Eingabe auf dem Display an } delay(100); if (myDFPlayer.available()) { printDetail(myDFPlayer.readType(), myDFPlayer.read()); // Gibt den Status aus } } // Funktion zur Tastatur-Abfrage char scanKeypad() { for (int row = 0; row < 4; row++) { // Setze die aktuelle Reihe (P0 bis P3) auf LOW, die anderen auf HIGH Wire.beginTransmission(PCF8574_ADDR); byte data = 0xFF; // Alles auf HIGH setzen (alle Eingänge auf Pull-Up) data &= ~(1 << row); // Setze den aktuellen Pin auf LOW Wire.write(data); Wire.endTransmission(); delay(1); // Warten, damit die Änderungen sichtbar werden // Lese die Spalten (P4 bis P7) als Eingänge Wire.requestFrom(PCF8574_ADDR, 1); if (Wire.available()) { byte inputData = Wire.read(); // Lese den Status der Spalten for (int col = 0; col < 4; col++) { if (!(inputData & (1 << (col + 4)))) { // Überprüfe, ob einer der Pins auf LOW gezogen wurde // Rückgabe der gedrückten Taste return keys[row][col]; // keys[][] ist dein Array mit den Tastenbelegungen } } } delay(10); // Kurze Verzögerung, bevor zur nächsten Reihe gewechselt wird } return 0; // Keine Taste gedrückt } void printDetail(uint8_t type, int value) { switch (type) { case TimeOut: Serial.println(F("Time Out!")); break; case WrongStack: Serial.println(F("Stack Wrong!")); break; case DFPlayerCardInserted: Serial.println(F("Card Inserted!")); break; case DFPlayerCardRemoved: Serial.println(F("Card Removed!")); break; case DFPlayerCardOnline: Serial.println(F("Card Online!")); break; case DFPlayerUSBInserted: Serial.println("USB Inserted!"); break; case DFPlayerUSBRemoved: Serial.println("USB Removed!"); break; case DFPlayerPlayFinished: Serial.print(F("Number:")); Serial.print(value); Serial.println(F(" Play Finished!")); break; case DFPlayerError: Serial.print(F("DFPlayerError:")); switch (value) { case Busy: Serial.println(F("Card not found")); break; case Sleeping: Serial.println(F("Sleeping")); break; case SerialWrongStack: Serial.println(F("Get Wrong Stack")); break; case CheckSumNotMatch: Serial.println(F("Check Sum Not Match")); break; case FileIndexOut: Serial.println(F("File Index Out of Bound")); break; case FileMismatch: Serial.println(F("Cannot Find File")); break; case Advertise: Serial.println(F("In Advertise")); break; default: break; } break; default: break; } }