/* 202B24D ON/Off
202B04F OK
2028877 RIGHT
*/
#include "SoftwareSerial.h"
#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"
#include "GyverTM1637.h"
#include "IRremote.h"
#define Pause 100
#define Vol 27
#define CLK 7
#define DIO 6
#include "GyverTM1637.h"
GyverTM1637 disp(CLK, DIO);
SoftwareSerial mySoftwareSerial(5, 4); // RX, TX
IRrecv irrecv(3); // указываем вывод, к которому подключен приемник
decode_results results;
DFRobotDFPlayerMini myDFPlayer;
boolean a = 0;
volatile long Ir;
int Sec, PSec, Track, mSec;
volatile byte counter = 0, count1 = 1;
volatile int32_t debounce, DecmSec, debounce1, StartTime, DecSec;
float PSec1;
volatile int32_t Time, Time1, LastTime;
void setup()
{
pinMode(8, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT);
attachInterrupt(0, buttonTick, RISING);
mySoftwareSerial.begin(9600);
Serial.begin(115200);
irrecv.enableIRIn(); // запускаем прием
disp.clear();
disp.brightness(5); // яркость, 0 - 7 (минимум - максимум)
disp.point(1);
if (!myDFPlayer.begin(mySoftwareSerial)) {
myDFPlayer.volume(Vol - Vol);
while (true) {
delay(Pause);
}
delay(Pause * 20);
disp.displayByte (_0, _0, _0, _0);
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);
//Serial.println(F("DFPlayer Mini online."));
}
while (Ir != 0X202B24D)
{
IrRecive();
}
}
void loop() {
/*if (digitalRead(2)) {
Serial.print("Counter ");
Serial.print(counter);
Serial.print(" Count1 ");
Serial.println(count1);
Serial.println(digitalRead(2));
if (counter == 1 && count1 == 1) {
Start();
attachInterrupt(0, buttonTick, RISING);
}
if (counter == 2 && count1 == 2) {
CheckPoint() ;
attachInterrupt(0, buttonTick, RISING);
}
if (counter == 3 && count1 == 3) {
Finish() ;
attachInterrupt(0, buttonTick, RISING);
}
*/
if (counter > 3) {
counter = 0;
}
if (((millis() - StartTime) / 10) > 9998) // ********************LOSER***************
{
//Serial.println(((millis() - StartTime) / 10));
Track = 114;
delay(Pause);
disp.displayByte (_L, _0, _5, _5);
Play2();
delay(Pause * 10);
debounce = 0;
counter = 0;
attachInterrupt(0, buttonTick, RISING);
}
if (counter == 0) {
disp.displayByte (_0, _0, _0, _0);
attachInterrupt(0, buttonTick, RISING);
// counter = 1;
Track = 113; // Музыка начала
Play1();
}
/*if (!digitalRead(2)) {
if (millis() - debounce >= 1000) {
Serial.println(counter);
Serial.println(count1);
*/
Disp();
if (digitalRead(2) && count1 == counter)
switch (counter) {
case 1: // **********************************Start
a == 0;
disp.clear();
StartTime = millis();
debounce = millis();
Track = 110;
Disp();
count1 = 2;
Play();
// while (!digitalRead(2)); {Disp();}
break;
case 2: //******************************* CheckPoint
debounce = millis();
Track = 111;
count1 = 3;
Play();
// while (!digitalRead(2)); {}
break;
case 3:
Time = (Time1 - StartTime) / 10;
disp.displayInt (Time);
DecSec = Time / 100;
Sec = DecSec % 10;
DecmSec = (Time - (DecSec * 100));
mSec = DecmSec % 10;
Serial.println(Time);
Serial.println(DecSec);
Serial.println(Sec);
Serial.println(DecmSec);
Serial.println(mSec);
a = 1;
Voice();
Track = 113;
debounce = 0;
counter = 1;
Play1();
count1 = 1;
break;
attachInterrupt(0, buttonTick, RISING);
}
Serial.print("Counter ");
Serial.print(counter);
Serial.print(" Count1 ");
Serial.println(count1);
Serial.println(digitalRead(2));
}
//*******************************************************************************
void buttonTick() {
if (digitalRead(2) && millis() - debounce1 > 2000) {
Time1 = millis();
debounce1 = millis();
counter = counter + 1;
detachInterrupt(0);
}
}
void Disp()
{
if (millis() - LastTime >= 10) {
disp.clear();
disp.displayInt ((millis() - StartTime) / 100 * 10 );
LastTime = millis();
}
}
void Voice () { //*****************************************************************
if (DecSec > 19) {
Track = (DecSec - Sec);
Play2();
Track = Sec;
}
else {
Track = DecSec;
}
Play2();
Second();
DecmSecond();
}
void Second() {
if (Sec == 1) {
Track = 100;
}
else if (Sec > 1 && Sec < 5) {
Track = 101;
}
else {
Track = 102;
}
Play2();
}
void DecmSecond() {
if (DecmSec < 1)
{
Track = 108;
Play2();
return;
}
Track = 103;
Play2();
if (DecmSec > 19) {
Track = (DecmSec - mSec);
Play2();
Track = mSec;
Play2();
}
else {
Track = DecmSec;
Play2();
}
mSecond();
}
void mSecond() {
if (mSec == 1) {
Track = 107; // ...сотая
}
else if (mSec > 1) {
Track = 106; // ....сотых
}
Play2();
}
void Play()//************************************************************
{
myDFPlayer.volume(Vol); // звук во время езды с обновлением дисплея
myDFPlayer.play(Track);
delay(Pause);
while (!digitalRead(8)) {
Disp();
} attachInterrupt(0, buttonTick, RISING);
delay(Pause);
}
void Play1() // музыка с остановкой по датчику
{
myDFPlayer.volume(Vol * 0.75);
myDFPlayer.play(Track);
delay(Pause);
while (!digitalRead(8) && !digitalRead(2)) {
delay(Pause / 10);
}
myDFPlayer.stop();
}
void Play2() // музыка без остановки по датчику (секундомер/результат)
{
myDFPlayer.volume(Vol);
myDFPlayer.play(Track);
delay(Pause);
while (!digitalRead(8)) {
delay(Pause);
}
} void IrRecive() {
if ( irrecv.decode( &results )) { // если данные пришли
Serial.println( results.value, HEX ); // печатаем данные
Ir = (results.value);
irrecv.resume(); // принимаем следующую команду
}
}
/*void Start() {
}
void CheckPoint () {
}
void Finish () {
}*/