Difficulté fabrication d'un réveil

Bonjour,

J’ai écrit un programme en utilisant une carte arduino uno, un afficheur 7 segments 4 digits, un haut-parleur de 4 Ω 3, un DFPlayer Mini Mp3 Player et un capteur IR pour fabriquer un réveil.

/*0xBA45FF00 //CH-

0xB946FF00 //CH

0xB847FF00 //CH+




0xBB44FF00 //|<<

0xBF40FF00 //>>|

0xBC43FF00 //>||




0xF807FF00 //-

0xEA15FF00 //+

0xF609FF00 //EQ




0xE916FF00 //0

0xE619FF00 //100+

0xF20DFF00 //200+




0xF30CFF00 //1

0xE718FF00 //2

0xA15EFF00 //3




0xF708FF00 //4

0xE31CFF00 //5

0xA55AFF00 //6




0xBD42FF00 //7

0xAD52FF00 //8

0xB54AFF00 //9*/





#include "TimerOne.h"

#include "IRremote.hpp"

#include "DFRobotDFPlayerMini.h"

#include "Arduino.h"

#include "SoftwareSerial.h"

SoftwareSerial softSerial(/*rx =*/3, /*tx =*/2);

#define FPSerial softSerial




#define a 5

#define b 6

#define c 7

#define d 8

#define e 9

#define f 10

#define g 11

#define dp 12

#define d1 A1

#define d2 A2

#define d3 A3

#define d4 A4

#define IR_RECEIVE_PIN 4

#define DECODE_NEC  // Includes Apple and Onkyo




unsigned char h = 0;  //dizaine d'heure

unsigned char i = 4;  //unité d'heure

unsigned char j = 4;  //dizaine de minutes

unsigned char k = 4;  //unité de minutes

unsigned char l = 0;  //secondes




unsigned char q = 0;  //dizaine d'heure (alarme)

unsigned char r = 4;  //unité d'heure (alarme)

unsigned char s = 4;  //dizaine de minutes (alarme)

unsigned char t = 5;  //unité de minutes (alamre)




int z = 0;




DFRobotDFPlayerMini myDFPlayer;




void setup() {

pinMode(2, INPUT);

pinMode(a, OUTPUT);

pinMode(b, OUTPUT);

pinMode(c, OUTPUT);

pinMode(d, OUTPUT);

pinMode(e, OUTPUT);

pinMode(f, OUTPUT);

pinMode(g, OUTPUT);




pinMode(d1, OUTPUT);

pinMode(d2, OUTPUT);

pinMode(d3, OUTPUT);

pinMode(d4, OUTPUT);




Serial.begin(115200);                                   // // Establish serial communication

IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  // Start the receiver




Timer1.initialize(1000000);

Timer1.attachInterrupt(horloge);

}




void loop() {




if (IrReceiver.decode()) {

if (IrReceiver.decodedIRData.decodedRawData == 0xBA45FF00) {  //CH-

while (z <= 200) {

clearLEDs();

pickDigit(0);

pickNumber(h);

delay(5);




clearLEDs();

pickDigit(1);

pickNumber(i);

delay(5);




clearLEDs();

pickDigit(2);

pickNumber(j);

delay(5);




clearLEDs();

pickDigit(3);

pickNumber(k);

delay(5);

        z++;

}

}

    z = 0;

clearLEDs();




if (IrReceiver.decodedIRData.decodedRawData == 0xF30CFF00) {  //1

      h++;

if (h > 2) {

        h = 0;

}

Serial.println("h:");

Serial.println(h);

}

if (IrReceiver.decodedIRData.decodedRawData == 0xE718FF00) {  //2

      i++;

if (i > 9) {

        i = 0;

}

Serial.println("i:");

Serial.println(i);

}

if (IrReceiver.decodedIRData.decodedRawData == 0xA15EFF00) {  //3

      j++;

if (j > 5) {

        j = 0;

}

Serial.println("j:");

Serial.println(j);

}

if (IrReceiver.decodedIRData.decodedRawData == 0xF708FF00) {  //4

      k++;

if (k > 9) {

        k = 0;

}

Serial.println("k:");

Serial.println(k);

}

if (IrReceiver.decodedIRData.decodedRawData == 0xE916FF00) {  //0

      l = 0;

Serial.println("l:");

Serial.println(l);

}

if (IrReceiver.decodedIRData.decodedRawData == 0xE31CFF00) {  //5

      q++;

if (q > 2) {

        q = 0;

}

Serial.println("q:");

Serial.println(q);

}

if (IrReceiver.decodedIRData.decodedRawData == 0xA55AFF00) {  //6

      r++;

if (r > 9) {

        r = 0;

}

Serial.println("r:");

Serial.println(r);

}

if (IrReceiver.decodedIRData.decodedRawData == 0xBD42FF00) {  //7

      s++;

if (s > 5) {

        s = 0;

}

Serial.println("s:");

Serial.println(s);

}

if (IrReceiver.decodedIRData.decodedRawData == 0xAD52FF00) {  //8

      t++;

if (t > 9) {

        t = 0;

}

Serial.println("t:");

Serial.println(t);

}

if (IrReceiver.decodedIRData.decodedRawData == 0xE619FF00) {  //+100

Serial.println("absence d'alarme");

}

if (IrReceiver.decodedIRData.decodedRawData == 0xF20DFF00) {  //+200

Serial.println("présence d'alarme");

}

if (IrReceiver.decodedIRData.decodedRawData == 0xB946FF00) {  //CH

Serial.println("allumer la led");

}

IrReceiver.resume();  // Enable receiving of the next value

}

if (q == h && r == i && s == j && t == k) { //problème avec ce bloc pour activer l'alarme

myDFPlayer.volume(10);

myDFPlayer.play(1);

}

}








void pickDigit(int x) {

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

switch (x) {

case 0: digitalWrite(d1, LOW); break;

case 1: digitalWrite(d2, LOW); break;

case 2: digitalWrite(d3, LOW); break;

default: digitalWrite(d4, LOW); break;

}

}




void pickNumber(int x) {

switch (x) {

default: zero(); break;

case 1: one(); break;

case 2: two(); break;

case 3: three(); break;

case 4: four(); break;

case 5: five(); break;

case 6: six(); break;

case 7: seven(); break;

case 8: eight(); break;

case 9: nine(); break;

}

}




void clearLEDs() {

digitalWrite(a, LOW);

digitalWrite(b, LOW);

digitalWrite(c, LOW);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

}




void zero() {

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, LOW);

}




void one() {

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

}




void two() {

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, LOW);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

}




void three() {

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

}




void four() {

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

}




void five() {

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

}




void six() {

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

}




void seven() {

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

}




void eight() {

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

}




void nine() {

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

}




void horloge() {

  l++;

if (l == 60) {

    k++;

    l = 0;

}




if (k == 9 && l == 59) {

delay(1000);

    j++;

    l = 0;

    k = 0;

}




if (j == 5 && k == 9 && l == 58) {

delay(2000);

    i++;

    l = 0;

    k = 0;

    j = 0;

}




if (i == 9 && j == 5 && k == 9 && l == 57) {

delay(3000);

    h++;

    i = 0;

    j = 0;

    k = 0;

    l = 0;

}




if (h == 2 && i == 3 && j == 5 && k == 9 && l == 56) {

delay(4000);

    h = 0;

    i = 0;

    j = 0;

    k = 0;

    l = 0;

}

}

Mais je rencontre plusieurs problèmes, lorsque je met ces lignes de codes :

if (q == h && r == i && s == j && t == k) {

    myDFPlayer.volume(10);

myDFPlayer.play(1);

}

En effet, la valeur de “k” ne s’incrémente plus et lorsque je les enlève (les lignes de codes) la valeur de “k” s’incrémente. De plus le DFPlayer Mini Mp3 Player joue la mélodie que pendant une durée d’une seconde et ne joue pas la mélodie complète.

Que pensez-vous de mon programme ? Auriez-vous des améliorations à apporter ? Si oui lesquels ? Et est-il possible d’utiliser le module d’horloge DS1302 avec l’afficheur 7 segments 4 digits ? Si oui pouvez-vous m’orienter ?

Merci par avance pour vos réponses

Il semble que Le test if (q == h && r == i && s == j && t == k) soit évalué en permanence dans loop, donc quand l’heure correspond, myDFPlayer.play(1) est appelé des centaines de fois par seconde au lieu d’une seule fois.…

Sinon bcp de soucis avec les interruptions. Les variables doivent être volatiles, faut pas bloquer longtemps et surtout pas utiliser delay…

Le code est trop pénible à lire sur mon iPhone , trop de lignes vide et l’indentation n’est pas respectée .., y’a un peu de boulot pour rendre cela robuste.

Et aussi des noms de variables tirés à pile ou face.
Des noms de variables explicites rendent quand même la lecture (et la maintenance) du code plus facile.

je vois aussi que le player n'est même pas démarré et que la liaison FPSerial n'est pas utilisée ...

les exemples montrent qu'on fait un

je ne sais pas comment vous avez une lecture avec le code donné...

Bonjour,

Voici le code modifié, qu’en pensez-vous ?

/*0xBA45FF00 //CH-
  0xB946FF00 //CH
  0xB847FF00 //CH+

  0xBB44FF00 //|<<
  0xBF40FF00 //>>|
  0xBC43FF00 //>||

  0xF807FF00 //-
  0xEA15FF00 //+
  0xF609FF00 //EQ

  0xE916FF00 //0
  0xE619FF00 //100+
  0xF20DFF00 //200+

  0xF30CFF00 //1
  0xE718FF00 //2
  0xA15EFF00 //3

  0xF708FF00  //4
  0xE31CFF00  //5
  0xA55AFF00  //6

  0xBD42FF00  //7
  0xAD52FF00  //8
  0xB54AFF00  //9*/


#include "TimerOne.h"
#include "IRremote.hpp"
#include "DFRobotDFPlayerMini.h"
#include "Arduino.h"
#include "SoftwareSerial.h"

#define a 5
#define b 6
#define c 7
#define d 8
#define e 9
#define f 10
#define g 11
#define dp 12
#define d1 A1
#define d2 A2
#define d3 A3
#define d4 A4

#define IR_RECEIVE_PIN 4
#define DECODE_NEC  // Includes Apple and Onkyo

volatile unsigned char h = 0;  //dizaine d'heure
volatile unsigned char i = 4;  //unité d'heure
volatile unsigned char j = 4;  //dizaine de minutes
volatile unsigned char k = 4;  //unité de minutes
volatile unsigned char l = 0;  //secondes

volatile unsigned char q = 0;  //dizaine d'heure (alarme)
volatile unsigned char r = 4;  //unité d'heure (alarme)
volatile unsigned char s = 4;  //dizaine de minutes (alarme)
volatile unsigned char t = 5;  //unité de minutes (alamre)

volatile int z = 0;

const unsigned long TIME_INTERVAL = 5;
const unsigned long TIME_Miniplayer;
unsigned long previousMillis;

SoftwareSerial softSerial(/*rx =*/13, /*tx =*/2);
#define FPSerial softSerial
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);


void setup() {
  pinMode(2, INPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);

  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);

  Serial.begin(115200);                                   // Establish serial communication
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  // Start the receiver

  Timer1.initialize(1000000);
  Timer1.attachInterrupt(horloge);

  previousMillis = millis();

  Serial.begin(115200);

  FPSerial.begin(9600);
  if (!myDFPlayer.begin(FPSerial, /*isACK = */true, /*doReset = */true)) {  //Use serial 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!"));}
    
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(10);
}

void loop() {


  if (IrReceiver.decode()) {
    if (IrReceiver.decodedIRData.decodedRawData == 0xBA45FF00) {  //CH-
      while (z <= 200) {
        clearLEDs();
        pickDigit(0);
        pickNumber(h);
        if (millis() - previousMillis >= TIME_INTERVAL) {
          previousMillis = millis();
          clearLEDs();
          pickDigit(1);
          pickNumber(i);
          if (millis() - previousMillis >= TIME_INTERVAL) {
            previousMillis = millis();
            clearLEDs();
            pickDigit(1);
            pickNumber(j);
            if (millis() - previousMillis >= TIME_INTERVAL) {
              previousMillis = millis();
              clearLEDs();
              pickDigit(1);
              pickNumber(k);
              z++;
            }
          }
        }
      }
    }
    
    z = 0;
    clearLEDs();

    if (IrReceiver.decodedIRData.decodedRawData == 0xF30CFF00) {  //1
      h++;
      if (h > 2) {
        h = 0;
      }
      Serial.println("h:");
      Serial.println(h);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE718FF00) {  //2
      i++;
      if (i > 9) {
        i = 0;
      }
      Serial.println("i:");
      Serial.println(i);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xA15EFF00) {  //3
      j++;
      if (j > 5) {
        j = 0;
      }
      Serial.println("j:");
      Serial.println(j);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xF708FF00) {  //4
      k++;
      if (k > 9) {
        k = 0;
      }
      Serial.println("k:");
      Serial.println(k);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE916FF00) {  //0
      l = 0;
      Serial.println("l:");
      Serial.println(l);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE31CFF00) {  //5
      q++;
      if (q > 2) {
        q = 0;
      }
      Serial.println("q:");
      Serial.println(q);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xA55AFF00) {  //6
      r++;
      if (r > 9) {
        r = 0;
      }
      Serial.println("r:");
      Serial.println(r);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xBD42FF00) {  //7
      s++;
      if (s > 5) {
        s = 0;
      }
      Serial.println("s:");
      Serial.println(s);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xAD52FF00) {  //8
      t++;
      if (t > 9) {
        t = 0;
      }
      Serial.println("t:");
      Serial.println(t);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE619FF00) {  //+100
      myDFPlayer.sleep();
      Serial.println("absence d'alarme");
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xF20DFF00) {  //+200
      FPSerial.begin(9600);
      Serial.println("présence d'alarme");
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xB946FF00) {  //CH
      Serial.println("allumer la led");
    }
    IrReceiver.resume();  // Enable receiving of the next value
  }
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
  if (q == h && r == i && s == j && t == k) {
    if (millis() - previousMillis >= TIME_Miniplayer) {
      previousMillis = millis();
      myDFPlayer.next();
    }
  }
}






void pickDigit(int x) {
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);
  switch (x) {
    case 0: digitalWrite(d1, LOW); break;
    case 1: digitalWrite(d2, LOW); break;
    case 2: digitalWrite(d3, LOW); break;
    default: digitalWrite(d4, LOW); break;
  }
}

void pickNumber(int x) {
  switch (x) {
    default: zero(); break;
    case 1: one(); break;
    case 2: two(); break;
    case 3: three(); break;
    case 4: four(); break;
    case 5: five(); break;
    case 6: six(); break;
    case 7: seven(); break;
    case 8: eight(); break;
    case 9: nine(); break;
  }
}

void clearLEDs() {
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void zero() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}

void one() {
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void two() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}

void three() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}

void four() {
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void five() {
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void six() {
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void seven() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void eight() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void nine() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void horloge() {
  l++;
  if (l == 60) {
    k++;
    l = 0;
  }

  if (k == 9 && l == 60) {
    j++;
    l = 0;
    k = 0;
  }

  if (j == 5 && k == 9 && l == 60) {
    i++;
    l = 0;
    k = 0;
    j = 0;
  }

  if (i == 9 && j == 5 && k == 9 && l == 60) {
    h++;
    i = 0;
    j = 0;
    k = 0;
    l = 0;
  }

  if (h == 2 && i == 3 && j == 5 && k == 9 && l == 60) {
    h = 0;
    i = 0;
    j = 0;
    k = 0;
    l = 0;
  }
}

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

}

Ça compile ?
Ça fonctionne ?

Quelle est la question ?

Le DFPlayer Mini Mp3 Player ne veut pas se lancer je ne sais pour quelle raison. Il me marque Unable to begin: Please recheck the connection!
Please insert the SD card!
DFPlayer Mini online.

Testez votre montage avec un code d’exemple

Postez le diagramme de votre montage ici avec le détail des composants et alimentations

Bonjour,

Voici le programme et le schéma de mon réveil :

/*0xBA45FF00 //CH-
  0xB946FF00 //CH
  0xB847FF00 //CH+

  0xBB44FF00 //|<<
  0xBF40FF00 //>>|
  0xBC43FF00 //>||

  0xF807FF00 //-
  0xEA15FF00 //+
  0xF609FF00 //EQ

  0xE916FF00 //0
  0xE619FF00 //100+
  0xF20DFF00 //200+

  0xF30CFF00 //1
  0xE718FF00 //2
  0xA15EFF00 //3

  0xF708FF00  //4
  0xE31CFF00  //5
  0xA55AFF00  //6

  0xBD42FF00  //7
  0xAD52FF00  //8
  0xB54AFF00  //9*/


#include "TimerOne.h"
#include "IRremote.hpp"
#include "DFRobotDFPlayerMini.h"
#include "Arduino.h"
#include "SoftwareSerial.h"

#define a 5
#define b 6
#define c 7
#define d 8
#define e 9
#define f 10
#define g 11
#define dp 12
#define d1 A1
#define d2 A2
#define d3 A3
#define d4 A4

#define IR_RECEIVE_PIN 4
#define DECODE_NEC  // Includes Apple and Onkyo

volatile unsigned char h = 0;  //dizaine d'heure
volatile unsigned char i = 4;  //unité d'heure
volatile unsigned char j = 4;  //dizaine de minutes
volatile unsigned char k = 4;  //unité de minutes
volatile unsigned char l = 0;  //secondes

volatile unsigned char q = 0;  //dizaine d'heure (alarme)
volatile unsigned char r = 4;  //unité d'heure (alarme)
volatile unsigned char s = 4;  //dizaine de minutes (alarme)
volatile unsigned char t = 5;  //unité de minutes (alamre)

volatile int z = 0;

const unsigned long TIME_INTERVAL = 5;
const unsigned long TIME_Miniplayer = 20000;
unsigned long previousMillis;

SoftwareSerial softSerial(/*rx =*/3, /*tx =*/2);
#define FPSerial softSerial
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);


void setup() {
  pinMode(2, INPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);

  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);

  Serial.begin(115200);                                   // Establish serial communication
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  // Start the receiver

  Timer1.initialize(1000000);
  Timer1.attachInterrupt(horloge);

  previousMillis = millis();

  Serial.begin(115200);

  FPSerial.begin(9600);
  if (!myDFPlayer.begin(FPSerial, /*isACK = */true, /*doReset = */true)) {  //Use serial 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!"));}
    
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(10);
}

void loop() {


  if (IrReceiver.decode()) {
    if (IrReceiver.decodedIRData.decodedRawData == 0xBA45FF00) {  //CH-
      while (z <= 200) {
        clearLEDs();
        pickDigit(0);
        pickNumber(h);
        if (millis() - previousMillis >= TIME_INTERVAL) {
          previousMillis = millis();
          clearLEDs();
          pickDigit(1);
          pickNumber(i);
          if (millis() - previousMillis >= TIME_INTERVAL) {
            previousMillis = millis();
            clearLEDs();
            pickDigit(1);
            pickNumber(j);
            if (millis() - previousMillis >= TIME_INTERVAL) {
              previousMillis = millis();
              clearLEDs();
              pickDigit(1);
              pickNumber(k);
              z++;
            }
          }
        }
      }
    }
    
    z = 0;
    clearLEDs();

    if (IrReceiver.decodedIRData.decodedRawData == 0xF30CFF00) {  //1
      h++;
      if (h > 2) {
        h = 0;
      }
      Serial.println("h:");
      Serial.println(h);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE718FF00) {  //2
      i++;
      if (i > 9) {
        i = 0;
      }
      Serial.println("i:");
      Serial.println(i);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xA15EFF00) {  //3
      j++;
      if (j > 5) {
        j = 0;
      }
      Serial.println("j:");
      Serial.println(j);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xF708FF00) {  //4
      k++;
      if (k > 9) {
        k = 0;
      }
      Serial.println("k:");
      Serial.println(k);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE916FF00) {  //0
      l = 0;
      Serial.println("l:");
      Serial.println(l);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE31CFF00) {  //5
      q++;
      if (q > 2) {
        q = 0;
      }
      Serial.println("q:");
      Serial.println(q);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xA55AFF00) {  //6
      r++;
      if (r > 9) {
        r = 0;
      }
      Serial.println("r:");
      Serial.println(r);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xBD42FF00) {  //7
      s++;
      if (s > 5) {
        s = 0;
      }
      Serial.println("s:");
      Serial.println(s);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xAD52FF00) {  //8
      t++;
      if (t > 9) {
        t = 0;
      }
      Serial.println("t:");
      Serial.println(t);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE619FF00) {  //+100
      myDFPlayer.sleep();
      Serial.println("absence d'alarme");
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xF20DFF00) {  //+200
      FPSerial.begin(9600);
      Serial.println("présence d'alarme");
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xB946FF00) {  //CH
      Serial.println("allumer la led");
    }
    IrReceiver.resume();  // Enable receiving of the next value
  }
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
  if (q == h && r == i && s == j && t == k) {
    if (millis() - previousMillis >= TIME_Miniplayer) {
      previousMillis = millis();
      myDFPlayer.next();
    }
  }
}






void pickDigit(int x) {
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);
  switch (x) {
    case 0: digitalWrite(d1, LOW); break;
    case 1: digitalWrite(d2, LOW); break;
    case 2: digitalWrite(d3, LOW); break;
    default: digitalWrite(d4, LOW); break;
  }
}

void pickNumber(int x) {
  switch (x) {
    default: zero(); break;
    case 1: one(); break;
    case 2: two(); break;
    case 3: three(); break;
    case 4: four(); break;
    case 5: five(); break;
    case 6: six(); break;
    case 7: seven(); break;
    case 8: eight(); break;
    case 9: nine(); break;
  }
}

void clearLEDs() {
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void zero() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}

void one() {
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void two() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}

void three() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}

void four() {
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void five() {
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void six() {
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void seven() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void eight() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void nine() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void horloge() {
  l++;
  if (l == 60) {
    k++;
    l = 0;
  }

  if (k == 9 && l == 60) {
    j++;
    l = 0;
    k = 0;
  }

  if (j == 5 && k == 9 && l == 60) {
    i++;
    l = 0;
    k = 0;
    j = 0;
  }

  if (i == 9 && j == 5 && k == 9 && l == 60) {
    h++;
    i = 0;
    j = 0;
    k = 0;
    l = 0;
  }

  if (h == 2 && i == 3 && j == 5 && k == 9 && l == 60) {
    h = 0;
    i = 0;
    j = 0;
    k = 0;
    l = 0;
  }
}

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

}

J’ai testé le DFPlayer Mini Mp3 Player avec le programme GetStarted et il fonctionne très bien.

Par contre, le capteur infrarouge n’est plus fonctionnel mais je ne pense pas que cela altère l’execution du programme.

La carte arduino est alimentée par l’intermédiare du câble USB branché à l’ordinateur.

Il se peut que la combinaison Timer1 + IRremote + SoftwareSerial crée des perturbations sévères via le masquage des interruptions ce qui pourrait expliquer des comportements erratiques.

Vous n'avez pas besoin de Timer1 pour faire quelque chose à 1Hz, utilisez simplement millis() ou micros() dans la loop(). ça fera déjà gagner une interruption (surtout que vos variables ne sont pas volatiles et que vous n'avez pas de section critique).

Si vous n'utilisez pas Serial pour le debug, passez le DFPlayer sur les pins 0 et 1 (l'UART matérielle associée à Serial). Il faudra débrancher votre DFPlayer pour le téléchargement du code mais ensuite ce sera beaucoup plus robuste car la communication avec le DFPlayer sera gérée aussi en matériel.

Hello

Dans ton setup, tu as pinMode 2,INPUT

Je pense que c’est 4 qui devrait être INPUT.

Bonjour,

Comme vous me l’avez conseillé, j’ai enlever la bibliothèque TimerOne.h et le logiciel Arduino IDE me mettait un message d’erreur dans les fichiers de la bibliothèque mais après plusieurs test, c’était une confusion avec la bibliothèque Arduino.h. Du coup j’ai supprimé la ligne de code incluant la bibliothèque et je l’ai réinséré et cela fonctionne à merveille.

Par contre vous m’aviez conseillé de mettre mes variables en volatile mais je n’ai pas très bien compris son utilisation même après m’être renseigné.

Petit bémol, lorsque que les variables de l’heure correspondent aux variables de l’alarme, le fichier mp3 se lance mais mon programme s’arrête jusqu’à ce que le fichier mp3 se termine.

Auriez-vous une idée pour que mon programme évite de s’arrêter lors de la lecture du programme ? Ou sinon une autre idée ?

Merci par avance de votre réponse et veuillez m’excuser pour le temps pris pour vous répondre.

Bonjour,

Merci pour l’information c’est juste une ligne de code en trop.

Veuillez m’excuser du temps pris pour vous répondre.

Voici mon programme :

/*0xBA45FF00 //CH-
  0xB946FF00 //CH
  0xB847FF00 //CH+

  0xBB44FF00 //|<<
  0xBF40FF00 //>>|
  0xBC43FF00 //>||

  0xF807FF00 //-
  0xEA15FF00 //+
  0xF609FF00 //EQ

  0xE916FF00 //0
  0xE619FF00 //100+
  0xF20DFF00 //200+

  0xF30CFF00 //1
  0xE718FF00 //2
  0xA15EFF00 //3

  0xF708FF00  //4
  0xE31CFF00  //5
  0xA55AFF00  //6

  0xBD42FF00  //7
  0xAD52FF00  //8
  0xB54AFF00  //9*/

//https://forum.arduino.cc/t/difficulte-fabrication-dun-reveil/1419365/2
//https://forum.arduino.cc/t/dfplayer-mini-mp3-player-solved/1409372

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

#define a 5
#define b 6
#define c 7
#define d 8
#define e 9
#define f 10
#define g 11
#define dp 12
#define d1 A1
#define d2 A2
#define d3 A3
#define d4 A4

#define IR_RECEIVE_PIN 4
#define DECODE_NEC  // Includes Apple and Onkyo

volatile unsigned char h = 0;  //dizaine d'heure
volatile unsigned char i = 4;  //unité d'heure
volatile unsigned char j = 4;  //dizaine de minutes
volatile unsigned char k = 4;  //unité de minutes
volatile unsigned char l = 0;  //secondes

volatile unsigned char q = 0;  //dizaine d'heure (alarme)
volatile unsigned char r = 4;  //unité d'heure (alarme)
volatile unsigned char s = 4;  //dizaine de minutes (alarme)
volatile unsigned char t = 5;  //unité de minutes (alamre)

volatile int z = 0;

const unsigned long TIME_INTERVAL = 5;  //Pour l'afficheur 7 segments
const unsigned long TIME_Miniplayer = 20000;
const unsigned long TIME_Horloge = 1000;
unsigned long previousMillis;
unsigned long previousMillisforclock;

#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266))  // Using a soft serial port
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/4, /*tx =*/5);
#define FPSerial softSerial
#else
#define FPSerial Serial1
#endif

DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);



void setup() {
  pinMode(2, INPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);

  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);

  Serial.begin(115200);                                   // Establish serial communication
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  // Start the receiver

  previousMillis = millis();
  previousMillisforclock = millis();

#if (defined ESP32)
  FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2);
#else
  FPSerial.begin(9600);
#endif

  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(FPSerial, /*isACK = */ true, /*doReset = */ true)) {  //Use serial 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."));
}

void loop() {
  horloge();

  Serial.print("h:");
  Serial.println(h);

  Serial.print("i:");
  Serial.println(i);

  Serial.print("j:");
  Serial.println(j);

  Serial.print("k:");
  Serial.println(k);

  Serial.print("l:");
  Serial.println(l);

  if (IrReceiver.decode()) {
    if (IrReceiver.decodedIRData.decodedRawData == 0xBA45FF00) {  //CH-
      while (z <= 200) {
        clearLEDs();
        pickDigit(0);
        pickNumber(h);
        if (millis() - previousMillis >= TIME_INTERVAL) {
          previousMillis = millis();
          clearLEDs();
          pickDigit(1);
          pickNumber(i);
          if (millis() - previousMillis >= TIME_INTERVAL) {
            previousMillis = millis();
            clearLEDs();
            pickDigit(1);
            pickNumber(j);
            if (millis() - previousMillis >= TIME_INTERVAL) {
              previousMillis = millis();
              clearLEDs();
              pickDigit(1);
              pickNumber(k);
              z++;
            }
          }
        }
      }
    }

    z = 0;
    clearLEDs();

    if (IrReceiver.decodedIRData.decodedRawData == 0xF30CFF00) {  //1
      h++;
      if (h > 2) {
        h = 0;
      }
      Serial.println("h:");
      Serial.println(h);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE718FF00) {  //2
      i++;
      if (i > 9) {
        i = 0;
      }
      Serial.println("i:");
      Serial.println(i);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xA15EFF00) {  //3
      j++;
      if (j > 5) {
        j = 0;
      }
      Serial.println("j:");
      Serial.println(j);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xF708FF00) {  //4
      k++;
      if (k > 9) {
        k = 0;
      }
      Serial.println("k:");
      Serial.println(k);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE916FF00) {  //0
      l = 0;
      Serial.println("l:");
      Serial.println(l);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE31CFF00) {  //5
      q++;
      if (q > 2) {
        q = 0;
      }
      Serial.println("q:");
      Serial.println(q);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xA55AFF00) {  //6
      r++;
      if (r > 9) {
        r = 0;
      }
      Serial.println("r:");
      Serial.println(r);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xBD42FF00) {  //7
      s++;
      if (s > 5) {
        s = 0;
      }
      Serial.println("s:");
      Serial.println(s);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xAD52FF00) {  //8
      t++;
      if (t > 9) {
        t = 0;
      }
      Serial.println("t:");
      Serial.println(t);
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xE619FF00) {  //+100
      myDFPlayer.sleep();
      Serial.println("absence d'alarme");
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xF20DFF00) {  //+200
      FPSerial.begin(9600);
      Serial.println("présence d'alarme");
    }
    if (IrReceiver.decodedIRData.decodedRawData == 0xB946FF00) {  //CH
      Serial.println("allumer la led");
    }
    IrReceiver.resume();  // Enable receiving of the next value
  }
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read());  //Print the detail message from DFPlayer to handle different errors and states.
  }
  if (q == h && r == i && s == j && t == k) {
    myDFPlayer.volume(10);
    myDFPlayer.next();
  }
}



void horloge() {
  if (millis() - previousMillisforclock >= TIME_Horloge) {
    previousMillisforclock = millis();
    l++;
  }

  if (l == 60) {
    k++;
    l = 0;
  }

  if (k == 9 && l == 60) {
    j++;
    l = 0;
    k = 0;
  }

  if (j == 5 && k == 9 && l == 60) {
    i++;
    l = 0;
    k = 0;
    j = 0;
  }

  if (i == 9 && j == 5 && k == 9 && l == 60) {
    h++;
    i = 0;
    j = 0;
    k = 0;
    l = 0;
  }

  if (h == 2 && i == 3 && j == 5 && k == 9 && l == 60) {
    h = 0;
    i = 0;
    j = 0;
    k = 0;
    l = 0;
  }
}


void pickDigit(int x) {
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);
  switch (x) {
    case 0: digitalWrite(d1, LOW); break;
    case 1: digitalWrite(d2, LOW); break;
    case 2: digitalWrite(d3, LOW); break;
    default: digitalWrite(d4, LOW); break;
  }
}

void pickNumber(int x) {
  switch (x) {
    default: zero(); break;
    case 1: one(); break;
    case 2: two(); break;
    case 3: three(); break;
    case 4: four(); break;
    case 5: five(); break;
    case 6: six(); break;
    case 7: seven(); break;
    case 8: eight(); break;
    case 9: nine(); break;
  }
}

void clearLEDs() {
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void zero() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}

void one() {
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void two() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}

void three() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}

void four() {
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void five() {
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void six() {
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void seven() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void eight() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void nine() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}


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

La lecture MP3 du DFPlayer est asynchrone. L’appel myDFPlayer.next() ne bloque pas l’exécution. Le symptôme observé vient d’ailleurs.

Lorsque l’heure courante correspond à l’alarme, la condition q == h && r == i && s == j && t == k reste vraie pendant toute la minute. A chaque passage dans loop, la commande myDFPlayer.next() est donc relancée en continu, vous saturez le port série en émission et ça devient bloquant.

Un second point aggravant est l’usage de while (z <= 200) dans le traitement IR. Cette boucle est bloquante et empêche loop de s’exécuter normalement tant qu’elle n’est pas terminée. Pendant ce temps, ni l’horloge ni l’IR ni le DFPlayer ne sont correctement traités.

Il faut rendre l’alarme déclenchable une seule fois et à supprimer toute boucle bloquante...