Created
February 14, 2020 16:30
-
-
Save HerrRiebmann/1cd7ce7adcc85848d99c62183d44e511 to your computer and use it in GitHub Desktop.
Arduino Soundmaschine - 4x4 Keypad
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Keypad.h> | |
#include <EEPROM.h> | |
#include "Arduino.h" | |
#include "SoftwareSerial.h" | |
#include "DFRobotDFPlayerMini.h" | |
const byte COLS = 4; //4 Columns | |
const byte ROWS = 4; //4 Rows | |
char hexaKeys[ROWS][COLS] = { | |
{4,3,2,1}, | |
{8,7,6,5}, | |
{12,11,10,9}, | |
{16,15,14,13} | |
}; | |
byte colPins[COLS] = {2, 3, 4, 5}; | |
byte rowPins[ROWS] = {6, 7, 8, 9}; | |
char CurrKey; | |
char LastKey = 0; | |
unsigned long LastKeyTime = 0; | |
unsigned long HoldKeyTime = 0; | |
bool PlayerSleeping = false; | |
bool Hold = false; | |
uint8_t Volume = 20; | |
bool PlayerOnline = false; | |
bool PlayerPlaying = false; | |
Keypad kpad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); | |
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX | |
DFRobotDFPlayerMini myDFPlayer; | |
void printDetail(uint8_t type, int value); | |
void setup() | |
{ | |
mySoftwareSerial.begin(9600); | |
Serial.begin(115200); | |
Volume = EEPROM.read(10); | |
if(Volume <= 0 || Volume >= 30) | |
Volume = 20; | |
Serial.print("Volume: "); | |
Serial.println(Volume); | |
InitPlayer(); | |
kpad.addEventListener(keypadEvent); | |
} | |
void loop() | |
{ | |
if(!PlayerOnline) | |
InitPlayer(); | |
CurrKey = kpad.getKey(); | |
if (CurrKey) | |
{ //Wenn eine Taste gedrückt wurde | |
Serial.print("The key "); | |
Serial.print((int)CurrKey); | |
Serial.print(" was pressed"); | |
Serial.println(); | |
Play(CurrKey); | |
} | |
if(!PlayerSleeping && !PlayerPlaying && millis() -LastKeyTime > 20000){ | |
Serial.print("Sleep"); | |
myDFPlayer.sleep(); | |
PlayerSleeping = true; | |
PlayerPlaying = false; | |
} | |
if (myDFPlayer.available()) | |
printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states. | |
} | |
void keypadEvent(KeypadEvent key){ | |
unsigned long diff = 0; | |
uint8_t v = 0; | |
switch (kpad.getState()){ | |
case PRESSED: | |
Serial.println("Pressed"); | |
break; | |
case RELEASED: | |
Serial.print("Released"); | |
if(!Hold) | |
break; | |
diff = millis() - HoldKeyTime; | |
v = diff/500; | |
Serial.print(": "); | |
Serial.println(v); | |
Hold = false; | |
switch(LastKey){ | |
case 1: | |
if(Volume + v >= 30) | |
Volume = 30; | |
else | |
Volume += v; | |
break; | |
case 13: | |
if(Volume - v <= 0) | |
Volume = 1; | |
else | |
Volume -= v; | |
break; | |
} | |
EEPROM.update(10, Volume); | |
myDFPlayer.volume(Volume); | |
Serial.print("Volume: "); | |
Serial.println(Volume); | |
break; | |
case HOLD: | |
HoldKeyTime = millis(); | |
Hold = true; | |
Serial.println("Hold"); | |
break; | |
} | |
} | |
void InitPlayer() { | |
Serial.println(); | |
Serial.println(F("DFRobot DFPlayer Mini Demo")); | |
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); | |
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3. | |
Serial.println(F("Unable to begin:")); | |
Serial.println(F("1.Please recheck the connection!")); | |
Serial.println(F("2.Please insert the SD card!")); | |
PlayerOnline = false; | |
} | |
Serial.println(F("DFPlayer Mini online.")); | |
PlayerOnline = true; | |
myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms | |
//----Set volume---- | |
myDFPlayer.volume(Volume); //Set volume value (0~30). | |
//----Set different EQ---- | |
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL); | |
//----Set device we use SD as default---- | |
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); | |
PlayerSleeping = false; | |
} | |
void Play(uint8_t key){ | |
if(PlayerSleeping){ | |
Serial.println("Wakeup"); | |
myDFPlayer.reset(); | |
PlayerSleeping = false; | |
InitPlayer(); | |
} | |
myDFPlayer.stop(); | |
delay(50); | |
PlayerPlaying = true; | |
myDFPlayer.play(key); | |
//----Read imformation---- | |
//Serial.println(myDFPlayer.readState()); //read mp3 state | |
//Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number | |
LastKey = CurrKey; | |
LastKeyTime = millis(); | |
} | |
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!")); | |
PlayerPlaying = false; | |
LastKeyTime = millis(); | |
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment