Skip to content

Instantly share code, notes, and snippets.

@emilyvelasco
Created March 3, 2023 21:14
Show Gist options
  • Save emilyvelasco/0ec21e3421188e9e237f6d3cf41c524f to your computer and use it in GitHub Desktop.
Save emilyvelasco/0ec21e3421188e9e237f6d3cf41c524f to your computer and use it in GitHub Desktop.
/* This sketch is heavily based on a demo code by
[Angelo qiao](Angelo.qiao@dfrobot.com) for DFRobot,
but it replaces the function that plays a new mp3 file after
a set period of time with a function that plays a new mp3
file when triggered by an external sensor, either a PIR,
doppler radar, or even a button*/
/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
<https://www.dfrobot.com/product-1121.html>
***************************************************
GNU Lesser General Public License.
See <http://www.gnu.org/licenses/> for details.
All above must be included in any redistribution
****************************************************/
/***********Notice and Trouble shooting***************
1.Connection and Diagram can be found here
<https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
2.This code is tested on Arduino Uno, Leonardo, Mega boards.
****************************************************/
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
int inputPin = 4; // choose the input pin (for doppler microwave (or PIR) sensor)
int pirState = LOW; // we start, assuming no motion detected
int val = 0; // variable for reading the pin status
int volumeLevel;
int gain;
int birdNumber = 2;
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
boolean triggered = false;
void setup()
{
delay(250);/*If power is applied to SD player and Arduino at the same time,
the Arduino will try to initialize comms with the player before the
player is ready. This short delay provides time for the player to get
booted up before comms are attempted*/
mySoftwareSerial.begin(9600);
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(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!"));
while(true){
delay(0); // Code to compatible with ESP8266 watch dog.
}
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(20); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
}
void loop()
{
volumeLevel =analogRead(A0); //read potentiometer position for volume control
gain = map(volumeLevel, 0, 1023, 0, 30); //map pot value to DFPlayer volume range
myDFPlayer.volume(gain); //Set volume value. From 0 to 30
val = digitalRead(inputPin); // read input value
if (val == HIGH) { //if the sensor is high
if (!triggered){ //and not already high
myDFPlayer.play(birdNumber); //Play another mp3
triggered = true;
birdNumber = random(2,72); /*pick a random mp3 to play next. Make sure this does not
exceed the number of files you have*/
}
}else{
triggered = false;
if (pirState == HIGH){
// we have just turned of
pirState = LOW;
}
}
if (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
}
}
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;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment