Skip to content

Instantly share code, notes, and snippets.

@HerrRiebmann
Created February 14, 2020 16:30
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save HerrRiebmann/1cd7ce7adcc85848d99c62183d44e511 to your computer and use it in GitHub Desktop.
Save HerrRiebmann/1cd7ce7adcc85848d99c62183d44e511 to your computer and use it in GitHub Desktop.
Arduino Soundmaschine - 4x4 Keypad
#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