123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- #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
- }
- }
|