

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX


DFRobotDFPlayerMini myDFPlayer;


byte octet=0;
byte octet0=512;
int enr1=0;
int son=0;
int ma=1;
int dt=0;
long t0=millis();
int enr=0;
int lect=0;
int n=0;
int dt2;
long t2=millis();
int ce=0;
int cl=0;
int p=1;
int csy=0;
int cr=0;
int cf=0;
int vr;
long t1=millis();
int cv=0;
int ck=0;
int sifflet=0;
int n1;
int transfert;







void setup()
{
 
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(13,OUTPUT);
   
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(mySoftwareSerial,false)) {  //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(25);  //Set volume value. From 0 to 30

  myDFPlayer.play(8); 

  
}

void loop()
{


 if (Serial.available() > 0)
          {
           
              octet = Serial.read();
           
             
            }



if (octet != octet0) {
if (enr1==0) {
if (octet==0)  ma=0;
if (octet==1)  ma=1;
if (octet==150) digitalWrite(6,HIGH);
if (octet==151) digitalWrite(6,LOW);
if (octet==152 && son==0 && sifflet==0) {
myDFPlayer.play(1); 
son=1;
}
if (octet==153 && son==1) {
son=0;
}


if (octet>99 && octet<121) dt=2*(octet-100);
if (dt>20) dt=20;
if (octet==154 && son==1 ) {
sifflet=1;
myDFPlayer.play(7); 
}

if (octet==155 && son==1 ) sifflet=0;
if (octet==156 && son==1 ) {
sifflet=1;
myDFPlayer.play(8); 
}
if (octet==157 && son==1 ) sifflet=0;
// commande son
if (son==1 && dt>0 && dt<=5 && sifflet==0) {
myDFPlayer.play(2);  
}
if (son==1 && dt>5 && dt<=8 && sifflet==0) {
myDFPlayer.play(3);   
}
if (son==1 && dt>8 && dt<=12 && sifflet==0) {
myDFPlayer.play(4); 
}
if (son==1 && dt>12 && dt<=20 && sifflet==0) {
myDFPlayer.play(5);  
}


if (octet0>100 && octet==100 && son==1 ) myDFPlayer.play(6); ;  
}

// enregistrement du trajet dans l'EEPROM
if (enr==1 && lect==0) {
  n=n+1;
  EEPROM.write(n, octet);
  dt2=(int)((millis()-t2)/1000);
  if (dt2==0) dt2=1;
  EEPROM.write(n+500, dt2);
  t2=millis();
 if (octet==123) enr=0; 
}
if (octet==122) enr=1;

// transfert des octets de la tablette vers l'EEPROM
if (enr1==1) {
 n=n+1;
 n1=(float)n/2.0;

if (n1-int(n1)>0) {
EEPROM.write(int(n1)+1, octet); 

}
if (n1-int(n1)==0) {
EEPROM.write(int(n1)+500, octet);

}
 if (octet==123) {
  enr1=0;
  n=0; 
 }
}
if (octet==219) {
  enr1=1;
  n=0;            
}
if (octet==220) enr1=0;

if (octet==217) {
  transfert=1;
  n=0;
}

octet0=octet;
} 

// commande moteur

if (ma==1) {
digitalWrite(5,LOW); 
if (millis()<t0+dt) digitalWrite(3,HIGH); 
if (millis()>t0+dt && millis()<t0+20) digitalWrite(3,LOW);  
if (millis()>t0+20) t0=millis();  
}

if (ma==0) {
digitalWrite(3,LOW); 
if (millis()<t0+dt) digitalWrite(5,HIGH); 
if (millis()>t0+dt && millis()<t0+20) digitalWrite(5,LOW);  
if (millis()>t0+20) t0=millis();  
} 

// rétrosignalisation

vr= analogRead(A0);


if (vr<100 && cr==0) {
  Serial.write(215);
  digitalWrite(13,HIGH); 
    // enregistrement retro
if (enr==1 && lect==0) {
  n=n+1;
  EEPROM.write(n, 200);
  dt2=(int)((millis()-t2)/1000);
  if (dt2==0) dt2=1;
 
  EEPROM.write(n+500, 2);
  t2=millis();
}
  cr=1;
  t1=millis();
  
 
}
 
if (cr==1 && millis()>t1+4000) {
  cr=0;
  Serial.write(216);
  digitalWrite(13,LOW); 
}

// exécution automatique du trajet
if (octet==124 && ce==0) {
lect=1;
n=0;
ce=1;
cl=0;
}

if (octet==125 && ce==1) {
lect=0;
n=0;
ce=0;
cl=0;
p=1;
}

 if (lect==1) {
 
  if (cl==0) {
  octet = EEPROM.read(p);
  dt2 = EEPROM.read(p+501);
 Serial.write(octet);
 if (octet==205) csy=1;
  
  cl=1;
  t2=millis();
  }
  if (octet==123) {
  p=1;
  cl=0;
  }
 if (octet<200 && cl==1 && millis()>t2+dt2*1000) {
  p=p+1;
  cl=0;
 }
  if (octet>200 && octet<205 && cl==1 && millis()>t2+dt2*1000) {
  p=p+1;
  cl=0;
 }
  if (octet==200 && cl==1 && cr==1) {
  cl=2;
  t2=millis();
 }
  if (octet==200 && cl==2 && millis()>t2+dt2*1000) {
  p=p+1;
  cl=0;
 }
 if (csy==1 && cl==1 && octet==210) {
  p=p+1;
  cl=0;
  csy=0;
 }
 
 }
 
}
