#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/2, /*tx =*/4);
DFRobotDFPlayerMini myDFPlayer;
#define FPSerial softSerial
const int buttonPin = 14;
int buttonState = HIGH;
int lastButtonState = HIGH;
unsigned long buttonPressStartTime = 0;
bool buttonHeld = false;
int Mode = 0; // Mode awal
int subMode = 0; // SubMode awal
bool ledOn = false; // Apakah LED dinyalakan
int musik=1;
void setup() {
FPSerial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(115200);
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)) { //Use serial 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!"));
while (true);
}
Serial.println(F("DFPlayer Mini online."));
}
void loop() {
if (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
}
buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState) {
if (buttonState == LOW) {
buttonPressStartTime = millis();
buttonHeld = false;
} else {
unsigned long buttonPressDuration = millis() - buttonPressStartTime;
if (buttonPressDuration >= 1000) { // Tombol ditekan dan ditahan lama
buttonHeld = true;
}
if (!buttonHeld) {
// Tombol ditekan tapi tidak ditahan lama
changeSubMode();
} else {
// Tombol ditekan dan ditahan lama
changeMode();
}
}
}
lastButtonState = buttonState;
delay(10);
musik = (Mode * 5) + (subMode + 1);
// Lakukan sesuatu berdasarkan Mode dan subMode saat ini
switch (Mode) {
case 0:
// Mode 0: Lakukan sesuatu sesuai kebutuhan Anda
switch (subMode) {
case 0:
if (!ledOn) {
myDFPlayer.play(musik);
ledOn = true;
}
break;
case 1:
if (!ledOn) {
myDFPlayer.play(musik);
ledOn = true;
}
break;
case 2:
if (!ledOn) {
myDFPlayer.play(musik);
ledOn = true;
}
break;
}
break;
case 1:
// Mode 1: Lakukan sesuatu sesuai kebutuhan Anda
switch (subMode) {
case 0:
if (!ledOn) {
myDFPlayer.play(musik);
delay(1000);
ledOn = true;
}
break;
case 1:
if (!ledOn) {
myDFPlayer.play(musik);
delay(1000);
ledOn = true;
}
break;
case 2:
if (!ledOn) {
myDFPlayer.play(musik);
delay(1000);
ledOn = true;
}
break;
}
break;
}
}
void changeMode() {
// Fungsi ini digunakan untuk mengubah Mode saat tombol ditekan
Mode++;
if (Mode > 2) { // Jumlah Mode yang Anda miliki (misalnya, 2 Mode)
Mode = 0; // Kembali ke Mode awal jika mencapai Mode terakhir
}
subMode = 0; // Reset subMode saat mengganti Mode
Serial.print("Mode: ");
Serial.println(Mode);
Serial.print("SubMode: ");
Serial.println(subMode);
Serial.println(musik);
}
void changeSubMode() {
// Fungsi ini digunakan untuk mengubah subMode saat tombol ditekan dan ditahan lama
subMode++;
if (subMode > 2) { // Jumlah subMode yang Anda miliki (misalnya, 2 subMode)
subMode = 0; // Kembali ke subMode awal jika mencapai subMode terakhir
}
ledOn = false;
Serial.print("SubMode: ");
Serial.println(subMode);
Serial.println(musik);
}
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;
}
}