commit 4968e6af295a6d003b7f751794c314c2a58ddc3b Author: Angelo Date: Wed Dec 7 15:13:08 2016 +0800 init diff --git a/DFRobotDFPlayerMini/DFRobotDFPlayerMini.cpp b/DFRobotDFPlayerMini/DFRobotDFPlayerMini.cpp new file mode 100644 index 0000000..33a0167 --- /dev/null +++ b/DFRobotDFPlayerMini/DFRobotDFPlayerMini.cpp @@ -0,0 +1,469 @@ +/*! + * @file DFRobotDFPlayerMini.cpp + * @brief DFPlayer - An Arduino Mini MP3 Player From DFRobot + * @n Header file for DFRobot's DFPlayer + * + * @copyright [DFRobot]( http://www.dfrobot.com ), 2016 + * @copyright GNU Lesser General Public License + * + * @author [Angelo](Angelo.qiao@dfrobot.com) + * @version V1.0 + * @date 2016-12-07 + */ + +#include "DFRobotDFPlayerMini.h" + +void DFRobotDFPlayerMini::setTimeOut(unsigned long timeOutDuration){ + _timeOutDuration = timeOutDuration; +} + +void DFRobotDFPlayerMini::uint16ToArray(uint16_t value, uint8_t *array){ + *array = (uint8_t)(value>>8); + *(array+1) = (uint8_t)(value); +} + +uint16_t DFRobotDFPlayerMini::calculateCheckSum(uint8_t *buffer){ + uint16_t sum = 0; + for (int i=Stack::Version; iwrite(_sending, DFPLAYER_SEND_LENGTH); + _timeOutTimer = millis(); + _isSending = _sending[Stack::ACK]; +} + +void DFRobotDFPlayerMini::sendStack(uint8_t command){ + sendStack(command, 0); +} + +void DFRobotDFPlayerMini::sendStack(uint8_t command, uint16_t argument){ + _sending[Stack::Command] = command; + uint16ToArray(argument, _sending+Stack::Parameter); + uint16ToArray(calculateCheckSum(_sending), _sending+Stack::CheckSum); + sendStack(); +} + +void DFRobotDFPlayerMini::sendStack(uint8_t command, uint8_t argumentHigh, uint8_t argumentLow){ + uint16_t buffer = argumentHigh; + buffer <<= 8; + sendStack(command, buffer | argumentLow); +} + +void DFRobotDFPlayerMini::enableACK(){ + _sending[Stack::ACK] = 0x01; +} + +void DFRobotDFPlayerMini::disableACK(){ + _sending[Stack::ACK] = 0x00; +} + +bool DFRobotDFPlayerMini::waitAvailable(){ + _isSending = true; + while (!available()); + return _handleType != HandleType::TimeOut; +} + +bool DFRobotDFPlayerMini::begin(Stream &stream, bool isACK){ + if (isACK) { + enableACK(); + } + else{ + disableACK(); + } + + _serial = &stream; + _timeOutDuration += 3000; + reset(); + waitAvailable(); + _timeOutDuration -= 3000; + delay(200); + return (readType() == DFPlayerCardOnline) || !isACK; +} + +HandleType DFRobotDFPlayerMini::readType(){ + _isAvailable = false; + return _handleType; +} + +uint16_t DFRobotDFPlayerMini::read(){ + _isAvailable = false; + return _handleParameter; +} + +bool DFRobotDFPlayerMini::handleMessage(HandleType type, uint16_t parameter){ + _receivedIndex = 0; + _handleType = type; + _handleParameter = parameter; + _isAvailable = true; + return _isAvailable; +} + +bool DFRobotDFPlayerMini::handleError(HandleType type, uint16_t parameter){ + handleMessage(type, parameter); + _isSending = false; +} + +uint8_t DFRobotDFPlayerMini::readCommand(){ + _isAvailable = false; + return _handleCommand; +} + +void DFRobotDFPlayerMini::parseStack(){ + _handleCommand = *(_received + Stack::Command); + _handleParameter = arrayToUint16(_received + Stack::Parameter); + + switch (_handleCommand) { + case 0x3D: + handleMessage(HandleType::DFPlayerPlayFinished, _handleParameter); + break; + case 0x3F: + if (_handleParameter & 0x02) { + handleMessage(HandleType::DFPlayerCardOnline, _handleParameter); + } + break; + case 0x3A: + if (_handleParameter & 0x02) { + handleMessage(HandleType::DFPlayerCardInserted, _handleParameter); + } + break; + case 0x3B: + if (_handleParameter & 0x02) { + handleMessage(HandleType::DFPlayerCardRemoved, _handleParameter); + } + break; + case 0x40: + handleMessage(HandleType::DFPlayerError, _handleParameter); + break; + case 0x41: + _isSending = false; + break; + case 0x3C: + case 0x3E: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + _isAvailable = true; + break; + default: + handleError(WrongStack); + break; + } +} + +uint16_t DFRobotDFPlayerMini::arrayToUint16(uint8_t *array){ + uint16_t value = *array; + value <<=8; + value += *(array+1); + return value; +} + +bool DFRobotDFPlayerMini::validateStack(){ + return calculateCheckSum(_received) == arrayToUint16(_received+Stack::CheckSum); +} + +bool DFRobotDFPlayerMini::available(){ + while (_serial->available()) { + if (_receivedIndex == 0) { + _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; + _receivedIndex ++; + } + } + else{ + _received[_receivedIndex] = _serial->read(); +#ifdef _DEBUG + Serial.print(_received[_receivedIndex],HEX); + Serial.print(F(" ")); +#endif + switch (_receivedIndex) { + case Stack::Version: + if (_received[_receivedIndex] != 0xFF) { + return handleError(WrongStack); + } + break; + case Stack::Length: + if (_received[_receivedIndex] != 0x06) { + return handleError(WrongStack); + } + break; + case Stack::End: +#ifdef _DEBUG + Serial.println(); +#endif + if (_received[_receivedIndex] != 0xEF) { + return handleError(WrongStack); + } + else{ + if (validateStack()) { + _receivedIndex = 0; + parseStack(); + if (_isAvailable && !_sending[Stack::ACK]) { + _isSending = false; + } + return _isAvailable; + } + else{ + return handleError(WrongStack); + } + } + break; + default: + break; + } + _receivedIndex++; + } + } + + if (_isSending && (millis()-_timeOutTimer>=_timeOutDuration)) { + return handleError(TimeOut); + } + + return _isAvailable; +} + +void DFRobotDFPlayerMini::next(){ + sendStack(0x01); +} + +void DFRobotDFPlayerMini::previous(){ + sendStack(0x02); +} + +void DFRobotDFPlayerMini::play(int fileNumber){ + sendStack(0x03, fileNumber); +} + +void DFRobotDFPlayerMini::volumeUp(){ + sendStack(0x04); +} + +void DFRobotDFPlayerMini::volumeDown(){ + sendStack(0x05); +} + +void DFRobotDFPlayerMini::volume(uint8_t volume){ + sendStack(0x06, volume); +} + +void DFRobotDFPlayerMini::EQ(uint8_t eq) { + sendStack(0x07, eq); +} + +void DFRobotDFPlayerMini::loop(int fileNumber) { + sendStack(0x08, fileNumber); +} + +void DFRobotDFPlayerMini::outputDevice(uint8_t device) { + sendStack(0x09, device); + delay(200); +} + +void DFRobotDFPlayerMini::sleep(){ + sendStack(0x0A); +} + +void DFRobotDFPlayerMini::reset(){ + sendStack(0x0C); +} + +void DFRobotDFPlayerMini::start(){ + sendStack(0x0D); +} + +void DFRobotDFPlayerMini::pause(){ + sendStack(0x0E); +} + +void DFRobotDFPlayerMini::playFolder(uint8_t folderNumber, uint8_t fileNumber){ + sendStack(0x0F, folderNumber, fileNumber); +} + +void DFRobotDFPlayerMini::outputSetting(bool enable, uint8_t gain){ + sendStack(0x10, enable, gain); +} + +void DFRobotDFPlayerMini::enableLoopAll(){ + sendStack(0x11, 0x01); +} + +void DFRobotDFPlayerMini::disableLoopAll(){ + sendStack(0x11, 0x00); +} + +void DFRobotDFPlayerMini::playMp3Folder(int fileNumber){ + sendStack(0x12, fileNumber); +} + +void DFRobotDFPlayerMini::advertise(int fileNumber){ + sendStack(0x13, fileNumber); +} + +void DFRobotDFPlayerMini::playLargeFolder(uint8_t folderNumber, uint16_t fileNumber){ + sendStack(0x14, (((uint16_t)folderNumber) << 12) | fileNumber); +} + +void DFRobotDFPlayerMini::stopAdvertise(){ + sendStack(0x15); +} + +void DFRobotDFPlayerMini::stop(){ + sendStack(0x16); +} + +void DFRobotDFPlayerMini::loopFolder(int folderNumber){ + sendStack(0x17, folderNumber); +} + +void DFRobotDFPlayerMini::randomAll(){ + sendStack(0x18); +} + +void DFRobotDFPlayerMini::enableLoop(){ + sendStack(0x19, 0x00); +} + +void DFRobotDFPlayerMini::disableLoop(){ + sendStack(0x19, 0x01); +} + +void DFRobotDFPlayerMini::enableDAC(){ + sendStack(0x1A, 0x00); +} + +void DFRobotDFPlayerMini::disableDAC(){ + sendStack(0x1A, 0x01); +} + +int DFRobotDFPlayerMini::readState(){ + sendStack(0x42); + if (waitAvailable()) { + return read(); + } + else{ + return -1; + } +} + +int DFRobotDFPlayerMini::readVolume(){ + sendStack(0x43); + if (waitAvailable()) { + return read(); + } + else{ + return -1; + } +} + +uint8_t DFRobotDFPlayerMini::readEQ(){ + sendStack(0x44); + while (!available()); + if (waitAvailable()) { + return read(); + } + else{ + return -1; + } +} + +int DFRobotDFPlayerMini::readFileCounts(uint8_t device){ + switch (device) { + case DFPLAYER_DEVICE_U_DISK: + sendStack(0x47); + break; + case DFPLAYER_DEVICE_SD: + sendStack(0x48); + break; + case DFPLAYER_DEVICE_FLASH: + sendStack(0x49); + break; + default: + break; + } + + if (waitAvailable()) { + return read(); + } + else{ + return -1; + } +} + +int DFRobotDFPlayerMini::readCurrentFileNumber(uint8_t device){ + switch (device) { + case DFPLAYER_DEVICE_U_DISK: + sendStack(0x4B); + break; + case DFPLAYER_DEVICE_SD: + sendStack(0x4C); + break; + case DFPLAYER_DEVICE_FLASH: + sendStack(0x4D); + break; + default: + break; + } + if (waitAvailable()) { + return read(); + } + else{ + return -1; + } +} + +int DFRobotDFPlayerMini::readFileCountsInFolder(int folderNumber){ + sendStack(0x4E, folderNumber); + if (waitAvailable()) { + return read(); + } + else{ + return -1; + } +} + +int DFRobotDFPlayerMini::readFileCounts(){ + readFileCounts(DFPLAYER_DEVICE_SD); +} + +int DFRobotDFPlayerMini::readCurrentFileNumber(){ + readCurrentFileNumber(DFPLAYER_DEVICE_SD); +} + + diff --git a/DFRobotDFPlayerMini/DFRobotDFPlayerMini.h b/DFRobotDFPlayerMini/DFRobotDFPlayerMini.h new file mode 100644 index 0000000..0ebffeb --- /dev/null +++ b/DFRobotDFPlayerMini/DFRobotDFPlayerMini.h @@ -0,0 +1,202 @@ +/*! + * @file DFRobotDFPlayerMini.h + * @brief DFPlayer - An Arduino Mini MP3 Player From DFRobot + * @n Header file for DFRobot's DFPlayer + * + * @copyright [DFRobot]( http://www.dfrobot.com ), 2016 + * @copyright GNU Lesser General Public License + * + * @author [Angelo](Angelo.qiao@dfrobot.com) + * @version V1.0 + * @date 2016-12-07 + */ + +#include "Arduino.h" + +#ifndef DFRobotDFPlayerMini_cpp + #define DFRobotDFPlayerMini_cpp + + +#define DFPLAYER_EQ_NORMAL 0 +#define DFPLAYER_EQ_POP 1 +#define DFPLAYER_EQ_ROCK 2 +#define DFPLAYER_EQ_JAZZ 3 +#define DFPLAYER_EQ_CLASSIC 4 +#define DFPLAYER_EQ_BASS 5 + +#define DFPLAYER_DEVICE_U_DISK 1 +#define DFPLAYER_DEVICE_SD 2 +#define DFPLAYER_DEVICE_AUX 3 +#define DFPLAYER_DEVICE_SLEEP 4 +#define DFPLAYER_DEVICE_FLASH 5 + +#define DFPLAYER_RECEIVED_LENGTH 10 +#define DFPLAYER_SEND_LENGTH 10 + +//#define _DEBUG + +enum HandleType{ + TimeOut, + WrongStack, + DFPlayerCardInserted, + DFPlayerCardRemoved, + DFPlayerCardOnline, + DFPlayerPlayFinished, + DFPlayerError +}; + +enum DFPlayerErrorType{ + Busy = 1, + Sleeping, + SerialWrongStack, + CheckSumNotMatch, + FileIndexOut, + FileMismatch, + Advertise +}; + + +class DFRobotDFPlayerMini { + Stream* _serial; + + unsigned long _timeOutTimer; + unsigned long _timeOutDuration = 500; + + uint8_t _received[DFPLAYER_RECEIVED_LENGTH]; + uint8_t _sending[DFPLAYER_SEND_LENGTH] = {0x7E, 0xFF, 06, 00, 01, 00, 00, 00, 00, 0xEF}; + + uint8_t _receivedIndex=0; + + void sendStack(); + void sendStack(uint8_t command); + void sendStack(uint8_t command, uint16_t argument); + void sendStack(uint8_t command, uint8_t argumentHigh, uint8_t argumentLow); + + void enableACK(); + void disableACK(); + + void uint16ToArray(uint16_t value,uint8_t *array); + + uint16_t arrayToUint16(uint8_t *array); + + uint16_t calculateCheckSum(uint8_t *buffer); + + + + void parseStack(); + bool validateStack(); + + 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 _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); + + uint8_t readCommand(); + + bool begin(Stream& stream, bool isACK = true); + + bool waitAvailable(); + + bool available(); + + HandleType readType(); + + uint16_t read(); + + void setTimeOut(unsigned long timeOutDuration); + + void next(); + + void previous(); + + void play(int fileNumber=1); + + void volumeUp(); + + void volumeDown(); + + void volume(uint8_t volume); + + void EQ(uint8_t eq); + + void loop(int fileNumber); + + void outputDevice(uint8_t device); + + void sleep(); + + void reset(); + + void start(); + + void pause(); + + void playFolder(uint8_t folderNumber, uint8_t fileNumber); + + void outputSetting(bool enable, uint8_t gain); + + void enableLoopAll(); + + void disableLoopAll(); + + void playMp3Folder(int fileNumber); + + void advertise(int fileNumber); + + void playLargeFolder(uint8_t folderNumber, uint16_t fileNumber); + + void stopAdvertise(); + + void stop(); + + void loopFolder(int folderNumber); + + void randomAll(); + + void enableLoop(); + + void disableLoop(); + + void enableDAC(); + + void disableDAC(); + + int readState(); + + int readVolume(); + + uint8_t readEQ(); + + int readFileCounts(uint8_t device); + + int readCurrentFileNumber(uint8_t device); + + int readFileCountsInFolder(int folderNumber); + + int readFileCounts(); + + int readCurrentFileNumber(); + +}; + +#endif diff --git a/DFRobotDFPlayerMini/README.md b/DFRobotDFPlayerMini/README.md new file mode 100644 index 0000000..bfe250b --- /dev/null +++ b/DFRobotDFPlayerMini/README.md @@ -0,0 +1,18 @@ +# 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. + +Created 2016-12-07 +By [Angelo qiao](Angelo.qiao@dfrobot.com) + +GNU Lesser General Public License. +See 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. diff --git a/DFRobotDFPlayerMini/examples/FullFunction/FullFunction.ino b/DFRobotDFPlayerMini/examples/FullFunction/FullFunction.ino new file mode 100644 index 0000000..d72eea4 --- /dev/null +++ b/DFRobotDFPlayerMini/examples/FullFunction/FullFunction.ino @@ -0,0 +1,188 @@ +/*************************************************** + DFPlayer - A Mini MP3 Player For Arduino + + + *************************************************** + This example shows the all the function of library for DFPlayer. + + Created 2016-12-07 + By [Angelo qiao](Angelo.qiao@dfrobot.com) + + GNU Lesser General Public License. + See for details. + All above must be included in any redistribution + ****************************************************/ + +/***********Notice and Trouble shooting*************** + 1.Connection and Diagram can be found here + + 2.This code is tested on Arduino Uno, Leonardo, Mega boards. + ****************************************************/ + +#include "Arduino.h" +#include "SoftwareSerial.h" +#include "DFRobotDFPlayerMini.h" + +SoftwareSerial mySoftwareSerial(10, 11); // RX, TX +DFRobotDFPlayerMini myDFPlayer; +void printDetail(uint8_t type, int value); + +void setup() +{ + 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); + } + Serial.println(F("DFPlayer Mini online.")); + + myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms + + //----Set volume---- + myDFPlayer.volume(10); //Set volume value (0~30). + myDFPlayer.volumeUp(); //Volume Up + myDFPlayer.volumeDown(); //Volume Down + + //----Set different EQ---- + myDFPlayer.EQ(DFPLAYER_EQ_NORMAL); +// myDFPlayer.EQ(DFPLAYER_EQ_POP); +// myDFPlayer.EQ(DFPLAYER_EQ_ROCK); +// myDFPlayer.EQ(DFPLAYER_EQ_JAZZ); +// myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC); +// myDFPlayer.EQ(DFPLAYER_EQ_BASS); + + //----Set device we use SD as default---- +// myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK); + myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); +// myDFPlayer.outputDevice(DFPLAYER_DEVICE_AUX); +// myDFPlayer.outputDevice(DFPLAYER_DEVICE_SLEEP); +// myDFPlayer.outputDevice(DFPLAYER_DEVICE_FLASH); + + //----Mp3 control---- +// myDFPlayer.sleep(); //sleep +// myDFPlayer.reset(); //Reset the module +// myDFPlayer.enableDAC(); //Enable On-chip DAC +// myDFPlayer.disableDAC(); //Disable On-chip DAC +// myDFPlayer.outputSetting(true, 15); //output setting, enable the output and set the gain to 15 + + //----Mp3 play---- + myDFPlayer.next(); //Play next mp3 + delay(1000); + myDFPlayer.previous(); //Play previous mp3 + delay(1000); + myDFPlayer.play(1); //Play the first mp3 + delay(1000); + myDFPlayer.loop(1); //Loop the first mp3 + delay(1000); + myDFPlayer.pause(); //pause the mp3 + delay(1000); + myDFPlayer.start(); //start the mp3 from the pause + delay(1000); + myDFPlayer.playFolder(15, 4); //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255) + delay(1000); + myDFPlayer.enableLoopAll(); //loop all mp3 files. + delay(1000); + myDFPlayer.disableLoopAll(); //stop loop all mp3 files. + delay(1000); + myDFPlayer.playMp3Folder(4); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535) + delay(1000); + myDFPlayer.advertise(3); //advertise specific mp3 in SD:/ADVERT/0003.mp3; File Name(0~65535) + delay(1000); + myDFPlayer.stopAdvertise(); //stop advertise + delay(1000); + myDFPlayer.playLargeFolder(2, 999); //play specific mp3 in SD:/02/004.mp3; Folder Name(1~10); File Name(1~1000) + delay(1000); + myDFPlayer.loopFolder(5); //loop all mp3 files in folder SD:/05. + delay(1000); + myDFPlayer.randomAll(); //Random play all the mp3. + delay(1000); + myDFPlayer.enableLoop(); //enable loop. + delay(1000); + myDFPlayer.disableLoop(); //disable loop. + delay(1000); + + //----Read imformation---- + Serial.println(myDFPlayer.readState()); //read mp3 state + Serial.println(myDFPlayer.readVolume()); //read current volume + 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 +} + +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 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; + } +} diff --git a/DFRobotDFPlayerMini/examples/GetStarted/getStarted.ino b/DFRobotDFPlayerMini/examples/GetStarted/getStarted.ino new file mode 100644 index 0000000..19c6197 --- /dev/null +++ b/DFRobotDFPlayerMini/examples/GetStarted/getStarted.ino @@ -0,0 +1,119 @@ +/*************************************************** +DFPlayer - A Mini MP3 Player For Arduino + + + *************************************************** + 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 for details. + All above must be included in any redistribution + ****************************************************/ + +/***********Notice and Trouble shooting*************** + 1.Connection and Diagram can be found here + + 2.This code is tested on Arduino Uno, Leonardo, Mega boards. + ****************************************************/ + +#include "Arduino.h" +#include "SoftwareSerial.h" +#include "DFRobotDFPlayerMini.h" + +SoftwareSerial mySoftwareSerial(10, 11); // RX, TX +DFRobotDFPlayerMini myDFPlayer; +void printDetail(uint8_t type, int value); + +void setup() +{ + 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); + } + 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 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; + } + +} diff --git a/DFRobotDFPlayerMini/library.properties b/DFRobotDFPlayerMini/library.properties new file mode 100644 index 0000000..a93d16b --- /dev/null +++ b/DFRobotDFPlayerMini/library.properties @@ -0,0 +1,9 @@ +name=DFRobotDFPlayerMini +version=1.0.0 +author=DFRobot +maintainer=Angelo +sentence=Driver for DFPlayer Mini from DFRobot +paragraph=Easy-to-use and reliable library for DFPlayer Mini +category=Sensors +url=https://github.com/DFRobot/DFRobotDFPlayerMini +architectures=*