MP3 Player: Using a Mini-OLED to Display Status

Adding the Mini-OLED Display to our MP3 Player

This is the third of three guides on building your own MP3 player with Arduino. In this guide we will be programming a mini-OLED display show the status of our Arduino based MP3 player:

  • Part 1: Building a basic MP3 player and testing.
  • Part 2: Adding Interactive Functionality.
  • Part 3: Adding a mini-OLED display.

Components:

The Circuit:

Strip all components and then reassemble them the same way as in the staged images below. Build it 1 stage at a time and make sure to leave enough room for the next stage.

Stage 1:

Basic Arduino and DFPlayer module connection. This is the same as before.

DFMini Player MP3 build
Stage 2:

Adding two tactile switches for the built-in functionality of the module. 

buttons
Stage 3:

Connecting a third button to the Arduino and connecting the mini-OLED display.

button Oled Build

Hopefully that wasn’t too confusing for you. Once all 3 stages are complete, we can upload our new code.

The Code:

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h> Adafruit_SSD1306 display(128, 64, &Wire); SoftwareSerial mySoftwareSerial(10,11); DFRobotDFPlayerMini myDFPlayer; int vol=A0; int volVal; int newVol; int lastVol; int volBar; int playBut=8; int playVal; int playState=0; int track; void setup() { Serial.begin(9600); mySoftwareSerial.begin(9600); myDFPlayer.begin(mySoftwareSerial); pinMode(playBut,INPUT); digitalWrite(playBut,LOW); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64 Serial.println(F("SSD1306 allocation failed")); } display.setTextSize(2); //Set text size 1-8 display.setTextColor(WHITE); //Set color display.display(); //display Adafruit boot screen delay(1000); } void play(){ myDFPlayer.start(); delay(500); playState=1; } void pause(){ myDFPlayer.pause(); delay(500); playState=0; } void volume(){ newVol=myDFPlayer.readVolume(); if(lastVol!=newVol){ display.clearDisplay(); display.setCursor(1,40); display.print("Vol"); display.setCursor(40,40); volBar=map(newVol,0,30,0,70); display.fillRect(40, 40, volBar, 15, WHITE); display.display(); delay(500); } lastVol=newVol; } void loop() { volume(); track=myDFPlayer.readCurrentFileNumber(); if(playState==1){ display.clearDisplay(); display.fillTriangle(50, 10, 50, 30, 70, 20, WHITE); display.setCursor(20,40); display.print("TRACK "); display.print(track); display.display(); } if(playState==0){ display.clearDisplay(); display.fillRect(50,10,10,25,WHITE); display.fillRect(70,10,10,25,WHITE); display.setCursor(29,40); display.print("PAUSED"); display.display(); } playVal=digitalRead(playBut); if((playVal==0) and (playState==0)){ play(); } else if((playVal==0) and (playState==1)){ pause(); } }

I have noticed a bug in the final project which I believe resides in the module itself rather than the code. The issue is sometimes when it is paused the track number displays the volume level instead of the track playing, not sure if it is possible for me to fix in the code. Pressing the Arduinos reset button fixes the issue temporarily.

The MP3 Modules Full Function Commands

I have added this code below which includes all the possible commands you can use to make your own projects even more interactive. Experiment with your own functions with this complete list of commands available.
/***************************************************
 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:
 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"

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 file 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 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;
  }
}

Conclusion

The addition of a mini-OLED display gives a feature-rich music companion that not only entertains but also informs. Every push of a button brings your project to life, while the mini-OLED display provides real-time feedback, turning your device into a symphony of user-friendly functionality. This is more than just a project; it’s a testament to the limitless possibilities of DIY electronics. So, as your MP3 player comes alive with a vibrant display and responsive controls, remember that your journey in innovation is a never-ending symphony.

Even though the final project has its bugs, i feel we have opened up new possibilities. So, keep creating, keep exploring, and let your projects continue to harmonize with the beauty of technology.

Happy Tinkering!

Recommendations:

The Elegoo Super Starter Kit

If you don’t already own any Arduino hardware, we highly recommend this kit as it has everything you need to start programming with Arduino. You can find out more about this kit, including a list of its components here: Elegoo Super Starter Kit

You can find this kit on Amazon here: Elegoo Super Starter Kit

The 0.96-inch Mini-OLED Display

We highly recommend this mini-OLED bundle of five 0.96-inch OLED displays. We have bought these before and they all worked perfectly. You can read more about the mini-OLED here: Mini-OLED

You can find this bundle on Amazon here: OLED Displays

Elegoo Nano (Arduino Compatible)

We have bought these Nano boards many times and can highly recommend them. There are three Nano boards in this pack making them a total bargain for everyone.

You can find this pack on Amazon here: Arduino Nano

Luke Barber

Hello, fellow tech enthusiasts! I'm Luke, a passionate learner and explorer in the vast realms of technology. Welcome to my digital space where I share the insights and adventures gained from my journey into the fascinating worlds of Arduino, Python, Linux, Ethical Hacking, and beyond. Armed with qualifications including CompTIA A+, Sec+, Cisco CCNA, Unix/Linux and Bash Shell Scripting, JavaScript Application Programming, Python Programming and Ethical Hacking, I thrive in the ever-evolving landscape of coding, computers, and networks. As a tech enthusiast, I'm on a mission to simplify the complexities of technology through my blogs, offering a glimpse into the marvels of Arduino, Python, Linux, and Ethical Hacking techniques. Whether you're a fellow coder or a curious mind, I invite you to join me on this journey of continuous learning and discovery.

Leave a Reply

Your email address will not be published. Required fields are marked *

Verified by MonsterInsights