|
@@ -0,0 +1,136 @@
|
|
|
|
+#include <DFRobotDFPlayerMini.h>
|
|
|
|
+#include <SoftwareSerial.h>
|
|
|
|
+#include "halloween.h"
|
|
|
|
+
|
|
|
|
+//déclaration et initialisation du port série logiciel
|
|
|
|
+SoftwareSerial softSerial(/*rx =*/10, /*tx =*/11);
|
|
|
|
+
|
|
|
|
+//déclaration du module MP3
|
|
|
|
+DFRobotDFPlayerMini myDFPlayer;
|
|
|
|
+
|
|
|
|
+//un tableau à 2 entrées pour représenter les différents états rencontrés
|
|
|
|
+bool etats[NOMBRE_ETATS][5] =
|
|
|
|
+{
|
|
|
|
+ {0, 0, 0, 0, 0}, //etats[0] : aucun laser coupé
|
|
|
|
+ {1, 0, 0, 0, 0}, //etats[1] : laser 0 coupé uniquement
|
|
|
|
+ {0, 1, 0, 0, 0}, //etats[2] : laser 1 coupé uniquement
|
|
|
|
+ {0, 0, 1, 0, 0}, //etats[3] : laser 2 coupé uniquement
|
|
|
|
+ {0, 0, 0, 1, 0}, //etats[4] : laser 3 coupé uniquement
|
|
|
|
+ {0, 0, 0, 0, 1}, //etats[5] : laser 4 coupé uniquement
|
|
|
|
+ {1, 0, 0, 0, 1} //etats[6] : laser 0 et 4 coupés
|
|
|
|
+},
|
|
|
|
+etat_laser[5] = {0, 0, 0, 0, 0};
|
|
|
|
+
|
|
|
|
+void lecture_lasers()
|
|
|
|
+{
|
|
|
|
+ //mise à jour des valeurs des lasers
|
|
|
|
+ etat_laser[0] = LASER0 < SEUIL ? 1 : 0; //Si la valeur de la photo-résistance est sous le seuil alors on passe l'état à 1 sinon à 0
|
|
|
|
+ etat_laser[1] = LASER1 < SEUIL ? 1 : 0;
|
|
|
|
+ etat_laser[2] = LASER2 < SEUIL ? 1 : 0;
|
|
|
|
+ etat_laser[3] = LASER3 < SEUIL ? 1 : 0;
|
|
|
|
+ etat_laser[4] = LASER4 < SEUIL ? 1 : 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int verification_etat()
|
|
|
|
+{
|
|
|
|
+ //on commence par appeler la fonction lecture_lasers
|
|
|
|
+ lecture_lasers();
|
|
|
|
+
|
|
|
|
+ //on peut maintenant commencer la comparaison
|
|
|
|
+ int comparaison = 1;
|
|
|
|
+ //Dans cette boucle on va balayer les n états demandant une réponse
|
|
|
|
+ for(int i = 0 ; i < NOMBRE_ETATS ; i++)
|
|
|
|
+ {
|
|
|
|
+ //dans cette boucle on va comparer l'état des laser avec les états attendus
|
|
|
|
+ for(int j = 0 ; j < 5 ; j++)
|
|
|
|
+ {
|
|
|
|
+ //il suffira d'une seule différence pour déclencher la mutiplication par 0
|
|
|
|
+ if(etats[i][j] != etat_laser[j])
|
|
|
|
+ {comparaison *= 0;}
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //en sortie de cette boucle si comparaison = 1 alors on se trouve dans l'état i
|
|
|
|
+ if(comparaison == 1)
|
|
|
|
+ {return i;}
|
|
|
|
+
|
|
|
|
+ //sinon il faut continuer la boucle sur i en remettant comparaison à la valeur 1
|
|
|
|
+ comparaison = 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //si on arrive ici c'est qu'a aucun etat ne correspond on renvoie alors -1
|
|
|
|
+ return -1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void setup()
|
|
|
|
+{
|
|
|
|
+ //initialisation des ports séries (logiciel et matériel)
|
|
|
|
+ softSerial.begin(9600);
|
|
|
|
+ Serial.begin(9600);
|
|
|
|
+
|
|
|
|
+ //initialisation du module MP3
|
|
|
|
+ Serial.println(F("DFRobot DFPlayer Mini Demo"));
|
|
|
|
+ Serial.println(F("Initialisation du module MP3 ... (peut prendre de 3 a 5 secondes)"));
|
|
|
|
+
|
|
|
|
+ if (!myDFPlayer.begin(softSerial, /*isACK = */true, /*doReset = */true))
|
|
|
|
+ {
|
|
|
|
+ //En cas de problème afficher les messages suivant
|
|
|
|
+ Serial.println(F("Unable to begin:"));
|
|
|
|
+ Serial.println(F("1.Please recheck the connection!"));
|
|
|
|
+ Serial.println(F("2.Please insert the SD card!"));
|
|
|
|
+
|
|
|
|
+ //puis attendre dans une boucle infinie
|
|
|
|
+ while(true)
|
|
|
|
+ {
|
|
|
|
+ delay(0);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void loop()
|
|
|
|
+{
|
|
|
|
+ //on récupère l'état du système
|
|
|
|
+ int etat = verification_etat();
|
|
|
|
+ Serial.println("etat : ");
|
|
|
|
+ Serial.println(etat);
|
|
|
|
+
|
|
|
|
+ //chaque état correspond à un MP3
|
|
|
|
+ if(etat > 0 && etat < 6)
|
|
|
|
+ {
|
|
|
|
+ myDFPlayer.play(etat); //on lance la lecture
|
|
|
|
+ delay(1000); //on attend 1s
|
|
|
|
+ myDFPlayer.stop(); //on arrête la lecture
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //cas particuliers
|
|
|
|
+ //cas où les lasers 1 et 5 sont coupés en même temps
|
|
|
|
+ if(etat == 6)
|
|
|
|
+ {
|
|
|
|
+ //on joue le son
|
|
|
|
+ myDFPlayer.play(6);
|
|
|
|
+
|
|
|
|
+ //on active le relai
|
|
|
|
+ RELAI_ON;
|
|
|
|
+
|
|
|
|
+ //ce sont doit être joué tant que les faisceaux sont coupés et pendant max 12s
|
|
|
|
+ unsigned long temps = millis();
|
|
|
|
+ while( millis() - temps < 12000 && verification_etat() == 6)
|
|
|
|
+ {
|
|
|
|
+ //ici on fait une petite attente de 10ms
|
|
|
|
+ delay(10);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //on coupe le son
|
|
|
|
+ myDFPlayer.stop();
|
|
|
|
+
|
|
|
|
+ //on coupe le relai
|
|
|
|
+ RELAI_OFF;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //si plusieurs lasers sont coupé en même temps alors etat == -1
|
|
|
|
+ if(etat == -1)
|
|
|
|
+ {
|
|
|
|
+ myDFPlayer.play(7); //on lance la lecture
|
|
|
|
+ delay(1000); //on attend 1s
|
|
|
|
+ myDFPlayer.stop(); //on arrête la lecture
|
|
|
|
+ }
|
|
|
|
+}
|