/*
  Sweep
  by BARRAGAN <http://barraganstudio.com>
  This example code is in the public domain.
  modified 8 Nov 2013  by Scott Fitzgerald
  http://www.arduino.cc/en/Tutorial/Sweep
*/
/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
 <https://www.dfrobot.com/index.php?route=product/product&product_id=1121>
 ***************************************************
 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
 ****************************************************/

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); 
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
 
#include <Servo.h> 

const int Trigger = 2;   //Digital pin 2 for the sensor’s Trigger
const int Echo = 7;   //Digital pin 3 for the sensor’s Echo

int ledPinR1= 5;   //Pin for each color of the RGB LED
int ledPinG1=4;
int ledPinB1=13;
int ledPinR2=6;
int ledPinG2=12;
int ledPinB2=8;

int pos = 0;
Servo servo_9;

void setup() {
  Serial.begin(9600);   //Initialize the communication
  pinMode(Trigger, OUTPUT);   //Pin as an output
  pinMode(Echo, INPUT);   //Pin as an input
  digitalWrite(Trigger, LOW);   //Initialize pin with a 0
 
  pinMode(ledPinR1, OUTPUT);   //Declare pins as an output
  digitalWrite(ledPinR1, LOW);   //LEDs in the initial state are off
  pinMode(ledPinR2, OUTPUT);
  digitalWrite(ledPinR2, LOW);
  
  pinMode(ledPinB1, OUTPUT);
  digitalWrite(ledPinB1, LOW);
  pinMode(ledPinB2, OUTPUT);
  digitalWrite(ledPinB2, LOW);

  pinMode(ledPinG1, OUTPUT);
  digitalWrite(ledPinG1, LOW);
  pinMode(ledPinG2, OUTPUT);
  digitalWrite(ledPinG2, LOW);  
 
  servo_9.attach(9);

  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(30);   //Volume of the DF Player
}

void loop()
{
  long t;   //Time that the echo takes to arrive
  long d;   //Distance in centimeters

  digitalWrite(Trigger, HIGH);
  delayMicroseconds(10);   //Make the code wait 10us to start
  digitalWrite(Trigger, LOW);
  
  t = pulseIn(Echo, HIGH);   //Get the pulse width
  d = t/59;   //Scale the time to distance in centimeters
  
  Serial.print("Distancia: ");
  Serial.print(d);      //we send to the serial the value of the distance
  Serial.print("cm");
  Serial.println();
  delay(100);          //Wait 100ms
 
  if(d <= 100){   //If anyone it’s inside the sensor’s range...
    servo_9.write(180);   //Servomotor rotates and shows the haloween face
    digitalWrite(ledPinR1,HIGH);   //LEDs are on, the left one in a blue color and the right one in purple 
    digitalWrite(ledPinR2,LOW);
    
    digitalWrite(ledPinG1,LOW);
    digitalWrite(ledPinG2,LOW);

    digitalWrite(ledPinB1,LOW);
    digitalWrite(ledPinB2,HIGH);

 myDFPlayer.play(1);   //Play the first mp3

  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read());   //Print the detail message from DFPlayer to handle different errors and states.
  }
  } else {   //If nobody is inside the sensor’s range...
    servo_9.write(-180);   //Servomotor rotates again and hide the halloween face
    digitalWrite(ledPinR1,LOW);   //All the LEDs turn off
    digitalWrite(ledPinR2,LOW);
    digitalWrite(ledPinG1,LOW);
    digitalWrite(ledPinG2,LOW);
    digitalWrite(ledPinB1,LOW);
    digitalWrite(ledPinB2,LOW);
    myDFPlayer.pause();   //Music stops playing
     delay(300);
  }
}

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