29 Commits

Author SHA1 Message Date
qsjhyy
47c0149383 V1.0.6 2023-06-26 13:57:37 +08:00
qsjhyy
ed07ad9da4 compatible with hardware serial port 2023-06-26 13:56:01 +08:00
黄毅圆
a81a07c863 Merge pull request #19 from iZhangHui/master
fix failure to initialize issue
2023-06-26 13:15:31 +08:00
黄毅圆
8803a47a5d Merge pull request #24 from SylvsGit/patch-1
Update DFRobotDFPlayerMini.cpp
2023-06-26 13:10:46 +08:00
黄毅圆
fccaf97171 Merge pull request #42 from MonicaPArroyo/master
keywords.txt added
2023-06-26 13:06:07 +08:00
Mónica P. Arroyo
96d5e14940 keywords.txt added 2022-02-24 12:59:13 -06:00
SylvsGit
86ea349894 Update DFRobotDFPlayerMini.cpp
Fixed erroneous message for USB track Play Finished. (0x3C)
2019-02-18 13:32:40 +01:00
Henry Zhang
eb30c016bd fix failure to initialize issue 2018-11-12 18:49:56 +08:00
jimaobian
e15e9fcf8c update the version in library properties 2018-08-27 19:44:45 +08:00
jimaobian
90a7483779 update Case 2018-08-27 19:36:30 +08:00
jimaobian
00b6a67814 update Case 2018-08-27 19:36:13 +08:00
jimaobian
c286f98d6d update library.properties 2018-08-15 13:46:08 +08:00
jimaobian
8b4ba4f7d8 update to 1.0.3
* Fix the bug that read cannot get the right result.
* Add USB support
* Add more example.
2018-08-15 13:44:47 +08:00
jimaobian
c295afa686 Update the comments 2018-04-02 11:18:17 +08:00
jimaobian
3613f54569 update the data sheet 2017-12-27 15:41:22 +08:00
jimaobian
beeba2c69d Update 2017-11-20 13:53:10 +08:00
jimaobian
cfb9428978 Merge pull request #6 from jandelgado/add_travis_ci_support
added support for travis ci
2017-11-20 13:46:35 +08:00
jimaobian
c36911d7b3 Merge pull request #5 from jandelgado/make_call_to_init_optional
Made the call to init() in DFRobotDFPlayerMini::begin() optional.
2017-11-20 13:39:01 +08:00
jimaobian
0cf620c20d Merge pull request #4 from jandelgado/adding_missing_return_statements
added missing "return" statements
2017-11-20 13:35:52 +08:00
Jan Delgado
7b5087e1af added support for travis ci 2017-06-13 20:01:49 +02:00
Jan Delgado
c0bd68111b added missing "return" statements 2017-06-13 19:08:52 +02:00
Jan Delgado
20343d62ed Made the call to init() in DFRobotDFPlayerMini::begin() optional.
Ratio: calling init() after the module is initially powered on is not necessary
and leads a) to an additional startup latency and b) (more annoying) to a loud
"plop" sound on the speaker output of the DFPlayerMini module.

By adding an optional parameter doReset to the begin() method, the user can now
decide, if the reset should be peformed.  Default is true, which is same
behaviour as now (i.e. perform reset()).
2017-06-13 19:05:51 +02:00
Angelo
31d5ec18d6 Fix compatible problem on nodeMCU (ESP8266)
add delay(0) to reset the soft wdt
2017-03-08 19:27:55 +08:00
jimaobian
6f4f402c71 Merge pull request #3 from redPanther/master
add function for query folder count + added datasheet
2017-03-08 17:34:23 +08:00
redpanther
c9f758979b add docs 2017-02-23 09:19:18 +01:00
redpanther
6111ae2018 add function to count folders on current device 2017-02-23 09:17:45 +01:00
Angelo
772d326841 Merge remote-tracking branch 'origin/master' 2016-12-13 16:53:47 +08:00
Angelo
fabbb011df update to 1.0.1 Fix the compiling error on Arduino.org IDE 2016-12-13 16:52:06 +08:00
jimaobian
9826577d39 Update README.md 2016-12-13 16:37:20 +08:00
11 changed files with 621 additions and 124 deletions

17
.travis.yml Normal file
View File

@@ -0,0 +1,17 @@
language: python
python:
- "2.7"
env:
- BOARD=uno
- BOARD=leonardo
- BOARD=esp01
install:
- python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"
script:
- cd examples/FullFunction
- platformio ci -l ../.. FullFunction.ino --board=$BOARD
- cd ../GetStarted
- platformio ci -l ../.. getStarted.ino --board=$BOARD

View File

@@ -7,7 +7,7 @@
* @copyright GNU Lesser General Public License
*
* @author [Angelo](Angelo.qiao@dfrobot.com)
* @version V1.0
* @version V1.0.6
* @date 2016-12-07
*/
@@ -24,21 +24,19 @@ void DFRobotDFPlayerMini::uint16ToArray(uint16_t value, uint8_t *array){
uint16_t DFRobotDFPlayerMini::calculateCheckSum(uint8_t *buffer){
uint16_t sum = 0;
for (int i=Stack::Version; i<Stack::CheckSum; i++) {
for (int i=Stack_Version; i<Stack_CheckSum; i++) {
sum += buffer[i];
}
return -sum;
}
void DFRobotDFPlayerMini::sendStack(){
if (_sending[Stack::ACK]) {
if (_sending[Stack_ACK]) { //if the ack mode is on wait until the last transmition
while (_isSending) {
available();
delay(0);
waitAvailable();
}
}
else{
delay(10);
}
#ifdef _DEBUG
Serial.println();
@@ -51,7 +49,11 @@ void DFRobotDFPlayerMini::sendStack(){
#endif
_serial->write(_sending, DFPLAYER_SEND_LENGTH);
_timeOutTimer = millis();
_isSending = _sending[Stack::ACK];
_isSending = _sending[Stack_ACK];
if (!_sending[Stack_ACK]) { //if the ack mode is off wait 10 ms after one transmition.
delay(10);
}
}
void DFRobotDFPlayerMini::sendStack(uint8_t command){
@@ -59,9 +61,9 @@ void DFRobotDFPlayerMini::sendStack(uint8_t command){
}
void DFRobotDFPlayerMini::sendStack(uint8_t command, uint16_t argument){
_sending[Stack::Command] = command;
uint16ToArray(argument, _sending+Stack::Parameter);
uint16ToArray(calculateCheckSum(_sending), _sending+Stack::CheckSum);
_sending[Stack_Command] = command;
uint16ToArray(argument, _sending+Stack_Parameter);
uint16ToArray(calculateCheckSum(_sending), _sending+Stack_CheckSum);
sendStack();
}
@@ -72,20 +74,30 @@ void DFRobotDFPlayerMini::sendStack(uint8_t command, uint8_t argumentHigh, uint8
}
void DFRobotDFPlayerMini::enableACK(){
_sending[Stack::ACK] = 0x01;
_sending[Stack_ACK] = 0x01;
}
void DFRobotDFPlayerMini::disableACK(){
_sending[Stack::ACK] = 0x00;
_sending[Stack_ACK] = 0x00;
}
bool DFRobotDFPlayerMini::waitAvailable(){
_isSending = true;
while (!available());
return _handleType != HandleType::TimeOut;
bool DFRobotDFPlayerMini::waitAvailable(unsigned long duration){
unsigned long timer = millis();
if (!duration) {
duration = _timeOutDuration;
}
while (!available()){
if (millis() - timer > duration) {
return handleError(TimeOut);
}
delay(0);
}
return true;
}
bool DFRobotDFPlayerMini::begin(Stream &stream, bool isACK){
bool DFRobotDFPlayerMini::begin(Stream &stream, bool isACK, bool doReset){
_serial = &stream;
if (isACK) {
enableACK();
}
@@ -93,16 +105,20 @@ bool DFRobotDFPlayerMini::begin(Stream &stream, bool isACK){
disableACK();
}
_serial = &stream;
_timeOutDuration += 3000;
reset();
waitAvailable();
_timeOutDuration -= 3000;
delay(200);
return (readType() == DFPlayerCardOnline) || !isACK;
if (doReset) {
reset();
waitAvailable(2000);
delay(200);
}
else {
// assume same state as with reset(): online
_handleType = DFPlayerCardOnline;
}
return (readType() == DFPlayerCardOnline) || (readType() == DFPlayerUSBOnline) || !isACK;
}
HandleType DFRobotDFPlayerMini::readType(){
uint8_t DFRobotDFPlayerMini::readType(){
_isAvailable = false;
return _handleType;
}
@@ -112,7 +128,7 @@ uint16_t DFRobotDFPlayerMini::read(){
return _handleParameter;
}
bool DFRobotDFPlayerMini::handleMessage(HandleType type, uint16_t parameter){
bool DFRobotDFPlayerMini::handleMessage(uint8_t type, uint16_t parameter){
_receivedIndex = 0;
_handleType = type;
_handleParameter = parameter;
@@ -120,9 +136,10 @@ bool DFRobotDFPlayerMini::handleMessage(HandleType type, uint16_t parameter){
return _isAvailable;
}
bool DFRobotDFPlayerMini::handleError(HandleType type, uint16_t parameter){
bool DFRobotDFPlayerMini::handleError(uint8_t type, uint16_t parameter){
handleMessage(type, parameter);
_isSending = false;
return false;
}
uint8_t DFRobotDFPlayerMini::readCommand(){
@@ -131,35 +148,50 @@ uint8_t DFRobotDFPlayerMini::readCommand(){
}
void DFRobotDFPlayerMini::parseStack(){
_handleCommand = *(_received + Stack::Command);
_handleParameter = arrayToUint16(_received + Stack::Parameter);
uint8_t handleCommand = *(_received + Stack_Command);
if (handleCommand == 0x41) { //handle the 0x41 ack feedback as a spcecial case, in case the pollusion of _handleCommand, _handleParameter, and _handleType.
_isSending = false;
return;
}
_handleCommand = handleCommand;
_handleParameter = arrayToUint16(_received + Stack_Parameter);
switch (_handleCommand) {
case 0x3C:
case 0x3D:
handleMessage(HandleType::DFPlayerPlayFinished, _handleParameter);
handleMessage(DFPlayerPlayFinished, _handleParameter);
break;
case 0x3F:
if (_handleParameter & 0x02) {
handleMessage(HandleType::DFPlayerCardOnline, _handleParameter);
if (_handleParameter & 0x01) {
handleMessage(DFPlayerUSBOnline, _handleParameter);
}
else if (_handleParameter & 0x02) {
handleMessage(DFPlayerCardOnline, _handleParameter);
}
else if (_handleParameter & 0x03) {
handleMessage(DFPlayerCardUSBOnline, _handleParameter);
}
break;
case 0x3A:
if (_handleParameter & 0x02) {
handleMessage(HandleType::DFPlayerCardInserted, _handleParameter);
if (_handleParameter & 0x01) {
handleMessage(DFPlayerUSBInserted, _handleParameter);
}
else if (_handleParameter & 0x02) {
handleMessage(DFPlayerCardInserted, _handleParameter);
}
break;
case 0x3B:
if (_handleParameter & 0x02) {
handleMessage(HandleType::DFPlayerCardRemoved, _handleParameter);
if (_handleParameter & 0x01) {
handleMessage(DFPlayerUSBRemoved, _handleParameter);
}
else if (_handleParameter & 0x02) {
handleMessage(DFPlayerCardRemoved, _handleParameter);
}
break;
case 0x40:
handleMessage(HandleType::DFPlayerError, _handleParameter);
handleMessage(DFPlayerError, _handleParameter);
break;
case 0x41:
_isSending = false;
break;
case 0x3C:
case 0x3E:
case 0x42:
case 0x43:
@@ -174,7 +206,7 @@ void DFRobotDFPlayerMini::parseStack(){
case 0x4D:
case 0x4E:
case 0x4F:
_isAvailable = true;
handleMessage(DFPlayerFeedBack, _handleParameter);
break;
default:
handleError(WrongStack);
@@ -190,20 +222,20 @@ uint16_t DFRobotDFPlayerMini::arrayToUint16(uint8_t *array){
}
bool DFRobotDFPlayerMini::validateStack(){
return calculateCheckSum(_received) == arrayToUint16(_received+Stack::CheckSum);
return calculateCheckSum(_received) == arrayToUint16(_received+Stack_CheckSum);
}
bool DFRobotDFPlayerMini::available(){
while (_serial->available()) {
delay(0);
if (_receivedIndex == 0) {
_received[Stack::Header] = _serial->read();
_received[Stack_Header] = _serial->read();
#ifdef _DEBUG
Serial.print(F("received:"));
Serial.print(_received[_receivedIndex],HEX);
Serial.print(F(" "));
#endif
if (_received[Stack::Header] == 0x7E) {
_isAvailable = false;
if (_received[Stack_Header] == 0x7E) {
_receivedIndex ++;
}
}
@@ -214,17 +246,17 @@ bool DFRobotDFPlayerMini::available(){
Serial.print(F(" "));
#endif
switch (_receivedIndex) {
case Stack::Version:
case Stack_Version:
if (_received[_receivedIndex] != 0xFF) {
return handleError(WrongStack);
}
break;
case Stack::Length:
case Stack_Length:
if (_received[_receivedIndex] != 0x06) {
return handleError(WrongStack);
}
break;
case Stack::End:
case Stack_End:
#ifdef _DEBUG
Serial.println();
#endif
@@ -235,9 +267,6 @@ bool DFRobotDFPlayerMini::available(){
if (validateStack()) {
_receivedIndex = 0;
parseStack();
if (_isAvailable && !_sending[Stack::ACK]) {
_isSending = false;
}
return _isAvailable;
}
else{
@@ -252,9 +281,6 @@ bool DFRobotDFPlayerMini::available(){
}
}
if (_isSending && (millis()-_timeOutTimer>=_timeOutDuration)) {
return handleError(TimeOut);
}
return _isAvailable;
}
@@ -375,7 +401,12 @@ void DFRobotDFPlayerMini::disableDAC(){
int DFRobotDFPlayerMini::readState(){
sendStack(0x42);
if (waitAvailable()) {
return read();
if (readType() == DFPlayerFeedBack) {
return read();
}
else{
return -1;
}
}
else{
return -1;
@@ -392,11 +423,15 @@ int DFRobotDFPlayerMini::readVolume(){
}
}
uint8_t DFRobotDFPlayerMini::readEQ(){
int DFRobotDFPlayerMini::readEQ(){
sendStack(0x44);
while (!available());
if (waitAvailable()) {
return read();
if (readType() == DFPlayerFeedBack) {
return read();
}
else{
return -1;
}
}
else{
return -1;
@@ -419,7 +454,12 @@ int DFRobotDFPlayerMini::readFileCounts(uint8_t device){
}
if (waitAvailable()) {
return read();
if (readType() == DFPlayerFeedBack) {
return read();
}
else{
return -1;
}
}
else{
return -1;
@@ -441,7 +481,12 @@ int DFRobotDFPlayerMini::readCurrentFileNumber(uint8_t device){
break;
}
if (waitAvailable()) {
return read();
if (readType() == DFPlayerFeedBack) {
return read();
}
else{
return -1;
}
}
else{
return -1;
@@ -451,7 +496,27 @@ int DFRobotDFPlayerMini::readCurrentFileNumber(uint8_t device){
int DFRobotDFPlayerMini::readFileCountsInFolder(int folderNumber){
sendStack(0x4E, folderNumber);
if (waitAvailable()) {
return read();
if (readType() == DFPlayerFeedBack) {
return read();
}
else{
return -1;
}
}
else{
return -1;
}
}
int DFRobotDFPlayerMini::readFolderCounts(){
sendStack(0x4F);
if (waitAvailable()) {
if (readType() == DFPlayerFeedBack) {
return read();
}
else{
return -1;
}
}
else{
return -1;
@@ -459,11 +524,11 @@ int DFRobotDFPlayerMini::readFileCountsInFolder(int folderNumber){
}
int DFRobotDFPlayerMini::readFileCounts(){
readFileCounts(DFPLAYER_DEVICE_SD);
return readFileCounts(DFPLAYER_DEVICE_SD);
}
int DFRobotDFPlayerMini::readCurrentFileNumber(){
readCurrentFileNumber(DFPLAYER_DEVICE_SD);
return readCurrentFileNumber(DFPLAYER_DEVICE_SD);
}

View File

@@ -7,7 +7,7 @@
* @copyright GNU Lesser General Public License
*
* @author [Angelo](Angelo.qiao@dfrobot.com)
* @version V1.0
* @version V1.0.6
* @date 2016-12-07
*/
@@ -35,26 +35,35 @@
//#define _DEBUG
enum HandleType{
TimeOut,
WrongStack,
DFPlayerCardInserted,
DFPlayerCardRemoved,
DFPlayerCardOnline,
DFPlayerPlayFinished,
DFPlayerError
};
#define TimeOut 0
#define WrongStack 1
#define DFPlayerCardInserted 2
#define DFPlayerCardRemoved 3
#define DFPlayerCardOnline 4
#define DFPlayerPlayFinished 5
#define DFPlayerError 6
#define DFPlayerUSBInserted 7
#define DFPlayerUSBRemoved 8
#define DFPlayerUSBOnline 9
#define DFPlayerCardUSBOnline 10
#define DFPlayerFeedBack 11
enum DFPlayerErrorType{
Busy = 1,
Sleeping,
SerialWrongStack,
CheckSumNotMatch,
FileIndexOut,
FileMismatch,
Advertise
};
#define Busy 1
#define Sleeping 2
#define SerialWrongStack 3
#define CheckSumNotMatch 4
#define FileIndexOut 5
#define FileMismatch 6
#define Advertise 7
#define Stack_Header 0
#define Stack_Version 1
#define Stack_Length 2
#define Stack_Command 3
#define Stack_ACK 4
#define Stack_Parameter 5
#define Stack_CheckSum 7
#define Stack_End 9
class DFRobotDFPlayerMini {
Stream* _serial;
@@ -88,38 +97,26 @@ class DFRobotDFPlayerMini {
uint8_t device = DFPLAYER_DEVICE_SD;
enum Stack{
Header = 0,
Version = 1,
Length = 2,
Command = 3,
ACK = 4,
Parameter = 5,
CheckSum = 7,
End = 9
};
public:
HandleType _handleType;
uint8_t _handleType;
uint8_t _handleCommand;
uint16_t _handleParameter;
bool _isAvailable = false;
bool _isSending = false;
bool handleMessage(HandleType type, uint16_t parameter = 0);
bool handleError(HandleType type, uint16_t parameter = 0);
bool handleMessage(uint8_t type, uint16_t parameter = 0);
bool handleError(uint8_t type, uint16_t parameter = 0);
uint8_t readCommand();
bool begin(Stream& stream, bool isACK = true);
bool begin(Stream& stream, bool isACK = true, bool doReset = true);
bool waitAvailable();
bool waitAvailable(unsigned long duration = 0);
bool available();
HandleType readType();
uint8_t readType();
uint16_t read();
@@ -185,7 +182,7 @@ class DFRobotDFPlayerMini {
int readVolume();
uint8_t readEQ();
int readEQ();
int readFileCounts(uint8_t device);
@@ -194,6 +191,8 @@ class DFRobotDFPlayerMini {
int readFileCountsInFolder(int folderNumber);
int readFileCounts();
int readFolderCounts();
int readCurrentFileNumber();

View File

@@ -1,6 +1,7 @@
# DFPlayer - A Mini MP3 Player For Arduino
DFPlayer - A Mini MP3 Player For Arduino
DFPlayer - A Mini MP3 Player For Arduino
https://www.dfrobot.com/index.php?route=product/product&product_id=1121
This example shows the all the function of library for DFPlayer.
@@ -16,5 +17,4 @@ 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.
2.This code is tested on Arduino Uno, Leonardo, Mega boards.

Binary file not shown.

View File

@@ -0,0 +1,139 @@
/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
<https://www.dfrobot.com/product-1121.html>
***************************************************
This example shows the basic function of library for DFPlayer.
Created 2016-12-07
By [Angelo qiao](Angelo.qiao@dfrobot.com)
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 "DFRobotDFPlayerMini.h"
#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266)) // Using a soft serial port
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/4, /*tx =*/5);
#define FPSerial softSerial
#else
#define FPSerial Serial1
#endif
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
void setup()
{
#if (defined ESP32)
FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2);
#else
FPSerial.begin(9600);
#endif
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){
delay(0); // Code to compatible with ESP8266 watch dog.
}
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(10); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
}
void loop()
{
static unsigned long timer = millis();
if (millis() - timer > 3000) {
timer = millis();
myDFPlayer.next(); //Play next mp3 every 3 second.
}
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;
}
}

View File

@@ -1,6 +1,6 @@
/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
<https://www.dfrobot.com/index.php?route=product/product&product_id=1121>
<https://www.dfrobot.com/product-1121.html>
***************************************************
This example shows the all the function of library for DFPlayer.
@@ -20,23 +20,34 @@
****************************************************/
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266)) // Using a soft serial port
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/4, /*tx =*/5);
#define FPSerial softSerial
#else
#define FPSerial Serial1
#endif
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
void setup()
{
mySoftwareSerial.begin(9600);
#if (defined ESP32)
FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2);
#else
FPSerial.begin(9600);
#endif
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.
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!"));
@@ -115,7 +126,7 @@ void setup()
Serial.println(myDFPlayer.readEQ()); //read EQ setting
Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03
Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read file counts in folder SD:/03
}
void loop()
@@ -149,6 +160,12 @@ void printDetail(uint8_t type, int value){
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);
@@ -185,4 +202,6 @@ void printDetail(uint8_t type, int value){
default:
break;
}
}

View File

@@ -1,6 +1,6 @@
/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
<https://www.dfrobot.com/index.php?route=product/product&product_id=1121>
<https://www.dfrobot.com/product-1121.html>
***************************************************
This example shows the basic function of library for DFPlayer.
@@ -20,27 +20,40 @@ DFPlayer - A Mini MP3 Player For Arduino
****************************************************/
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266)) // Using a soft serial port
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/4, /*tx =*/5);
#define FPSerial softSerial
#else
#define FPSerial Serial1
#endif
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
void setup()
{
mySoftwareSerial.begin(9600);
#if (defined ESP32)
FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2);
#else
FPSerial.begin(9600);
#endif
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.
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);
while(true){
delay(0); // Code to compatible with ESP8266 watch dog.
}
}
Serial.println(F("DFPlayer Mini online."));
@@ -79,6 +92,12 @@ void printDetail(uint8_t type, int value){
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);
@@ -115,5 +134,5 @@ void printDetail(uint8_t type, int value){
default:
break;
}
}

View File

@@ -0,0 +1,151 @@
/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
<https://www.dfrobot.com/product-1121.html>
***************************************************
This example shows the basic function of library for DFPlayer.
Created 2016-12-07
Modified 2018-08-15
By [Angelo qiao](Angelo.qiao@dfrobot.com)
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 "DFRobotDFPlayerMini.h"
#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266)) // Using a soft serial port
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/4, /*tx =*/5);
#define FPSerial softSerial
#else
#define FPSerial Serial1
#endif
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
void setup()
{
#if (defined ESP32)
FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2);
#else
FPSerial.begin(9600);
#endif
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 or USB drive!"));
while(true){
delay(0); // Code to compatible with ESP8266 watch dog.
}
}
Serial.println(F("DFPlayer Mini online."));
}
void loop()
{
static unsigned long timer = millis();
if (millis() - timer > 3000) {
timer = millis();
int value;
// value = myDFPlayer.readState(); //read mp3 state
// value = myDFPlayer.readVolume(); //read current volume
// value = myDFPlayer.readEQ(); //read EQ setting
// value = myDFPlayer.readFileCounts(); //read all file counts in SD card
// value = myDFPlayer.readCurrentFileNumber(); //read current play file number
value = myDFPlayer.readFileCountsInFolder(3); //read file counts in folder SD:/03
if (value == -1) { //Error while Reading.
printDetail(myDFPlayer.readType(), myDFPlayer.read());
}
else{ //Successfully get the result.
Serial.println(value);
}
}
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;
}
}

88
keywords.txt Normal file
View File

@@ -0,0 +1,88 @@
#######################################
# Syntax Coloring Map For DFRobotDFPlayerMini
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
DFRobotDFPlayerMini KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
volume KEYWORD2
volumeUp KEYWORD2
volumeDown KEYWORD2
EQ KEYWORD2
outputDevice KEYWORD2
play KEYWORD2
next KEYWORD2
previous KEYWORD2
loop KEYWORD2
pause KEYWORD2
start KEYWORD2
playFolder KEYWORD2
enableLoopAll KEYWORD2
disableLoopAll KEYWORD2
playMp3Folder KEYWORD2
readType KEYWORD2
advertise KEYWORD2
stopAdvertise KEYWORD2
playLargeFolder KEYWORD2
loopFolder KEYWORD2
randomAll KEYWORD2
enableLoop KEYWORD2
disableLoop KEYWORD2
readState KEYWORD2
readVolume KEYWORD2
readEQ KEYWORD2
readFileCounts KEYWORD2
readCurrentFileNumber KEYWORD2
readFileCountsInFolder KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################
DFPLAYER_EQ_NORMAL LITERAL1
DFPLAYER_EQ_POP LITERAL1
DFPLAYER_EQ_ROCK LITERAL1
DFPLAYER_EQ_JAZZ LITERAL1
DFPLAYER_EQ_CLASSIC LITERAL1
DFPLAYER_EQ_BASS LITERAL1
DFPLAYER_DEVICE_U_DISK LITERAL1
DFPLAYER_DEVICE_SD LITERAL1
DFPLAYER_DEVICE_AUX LITERAL1
DFPLAYER_DEVICE_SLEEP LITERAL1
DFPLAYER_DEVICE_FLASH LITERAL1
DFPLAYER_RECEIVED_LENGTH LITERAL1
DFPLAYER_SEND_LENGTH LITERAL1
TimeOut LITERAL1
WrongStack LITERAL1
DFPlayerCardInserted LITERAL1
DFPlayerCardRemoved LITERAL1
DFPlayerCardOnline LITERAL1
DFPlayerUSBInserted LITERAL1
DFPlayerUSBRemoved LITERAL1
DFPlayerPlayFinished LITERAL1
DFPlayerError LITERAL1
Busy LITERAL1
Sleeping LITERAL1
SerialWrongStack LITERAL1
CheckSumNotMatch LITERAL1
FileIndexOut LITERAL1
FileMismatch LITERAL1
Advertise LITERAL1
Stack_Header LITERAL1
Stack_Version LITERAL1
Stack_Length LITERAL1
Stack_Command LITERAL1
Stack_ACK LITERAL1
Stack_Parameter LITERAL1
Stack_CheckSum LITERAL1
Stack_End LITERAL1
DFPLAYER_DEVICE_SLEEP LITERAL1
DFPLAYER_DEVICE_FLASH LITERAL1

View File

@@ -1,9 +1,9 @@
name=DFRobotDFPlayerMini
version=1.0.0
version=1.0.6
author=DFRobot
maintainer=Angelo <angelo.qiao@dfrobot.com>
sentence=Driver for DFPlayer Mini from DFRobot
paragraph=Easy-to-use and reliable library for DFPlayer Mini
category=Sensors
paragraph=Easy-to-use and reliable library for DFPlayer Mini
category=Device Control
url=https://github.com/DFRobot/DFRobotDFPlayerMini
architectures=*