Browse Source

premier commit

Jackbot 6 months ago
commit
480b97c43c
2 changed files with 149 additions and 0 deletions
  1. 13 0
      halloween.h
  2. 136 0
      halloween.ino

+ 13 - 0
halloween.h

@@ -0,0 +1,13 @@
+//Ici on fait une abstraction du circuit
+//A1, A2, etc ... seront a remplacer par les différentes broches utilisées
+#define LASER0 analogRead(A0)
+#define LASER1 analogRead(A1)
+#define LASER2 analogRead(A2)
+#define LASER3 analogRead(A3)
+#define LASER4 analogRead(A4)
+
+#define RELAI_ON digitalWrite(3, HIGH)
+#define RELAI_OFF digitalWrite(3,LOW)
+
+#define SEUIL 40
+#define NOMBRE_ETATS 7

+ 136 - 0
halloween.ino

@@ -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
+  }
+}