halloween.ino 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include <DFRobotDFPlayerMini.h>
  2. #include <SoftwareSerial.h>
  3. #include "halloween.h"
  4. //déclaration et initialisation du port série logiciel
  5. SoftwareSerial softSerial(/*rx =*/10, /*tx =*/11);
  6. //déclaration du module MP3
  7. DFRobotDFPlayerMini myDFPlayer;
  8. //un tableau à 2 entrées pour représenter les différents états rencontrés
  9. bool etats[NOMBRE_ETATS][5] =
  10. {
  11. {0, 0, 0, 0, 0}, //etats[0] : aucun laser coupé
  12. {1, 0, 0, 0, 0}, //etats[1] : laser 0 coupé uniquement
  13. {0, 1, 0, 0, 0}, //etats[2] : laser 1 coupé uniquement
  14. {0, 0, 1, 0, 0}, //etats[3] : laser 2 coupé uniquement
  15. {0, 0, 0, 1, 0}, //etats[4] : laser 3 coupé uniquement
  16. {0, 0, 0, 0, 1}, //etats[5] : laser 4 coupé uniquement
  17. {1, 0, 0, 0, 1} //etats[6] : laser 0 et 4 coupés
  18. },
  19. etat_laser[5] = {0, 0, 0, 0, 0};
  20. void lecture_lasers()
  21. {
  22. //mise à jour des valeurs des lasers
  23. 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
  24. etat_laser[1] = LASER1 < SEUIL ? 1 : 0;
  25. etat_laser[2] = LASER2 < SEUIL ? 1 : 0;
  26. etat_laser[3] = LASER3 < SEUIL ? 1 : 0;
  27. etat_laser[4] = LASER4 < SEUIL ? 1 : 0;
  28. }
  29. int verification_etat()
  30. {
  31. //on commence par appeler la fonction lecture_lasers
  32. lecture_lasers();
  33. //on peut maintenant commencer la comparaison
  34. int comparaison = 1;
  35. //Dans cette boucle on va balayer les n états demandant une réponse
  36. for(int i = 0 ; i < NOMBRE_ETATS ; i++)
  37. {
  38. //dans cette boucle on va comparer l'état des laser avec les états attendus
  39. for(int j = 0 ; j < 5 ; j++)
  40. {
  41. //il suffira d'une seule différence pour déclencher la mutiplication par 0
  42. if(etats[i][j] != etat_laser[j])
  43. {comparaison *= 0;}
  44. }
  45. //en sortie de cette boucle si comparaison = 1 alors on se trouve dans l'état i
  46. if(comparaison == 1)
  47. {return i;}
  48. //sinon il faut continuer la boucle sur i en remettant comparaison à la valeur 1
  49. comparaison = 1;
  50. }
  51. //si on arrive ici c'est qu'a aucun etat ne correspond on renvoie alors -1
  52. return -1;
  53. }
  54. void setup()
  55. {
  56. //initialisation des ports séries (logiciel et matériel)
  57. softSerial.begin(9600);
  58. Serial.begin(9600);
  59. //initialisation du module MP3
  60. Serial.println(F("DFRobot DFPlayer Mini Demo"));
  61. Serial.println(F("Initialisation du module MP3 ... (peut prendre de 3 a 5 secondes)"));
  62. if (!myDFPlayer.begin(softSerial, /*isACK = */true, /*doReset = */true))
  63. {
  64. //En cas de problème afficher les messages suivant
  65. Serial.println(F("Unable to begin:"));
  66. Serial.println(F("1.Please recheck the connection!"));
  67. Serial.println(F("2.Please insert the SD card!"));
  68. //puis attendre dans une boucle infinie
  69. while(true)
  70. {
  71. delay(0);
  72. }
  73. }
  74. }
  75. void loop()
  76. {
  77. //on récupère l'état du système
  78. int etat = verification_etat();
  79. Serial.println("etat : ");
  80. Serial.println(etat);
  81. //chaque état correspond à un MP3
  82. if(etat > 0 && etat < 6)
  83. {
  84. myDFPlayer.play(etat); //on lance la lecture
  85. delay(1000); //on attend 1s
  86. myDFPlayer.stop(); //on arrête la lecture
  87. }
  88. //cas particuliers
  89. //cas où les lasers 1 et 5 sont coupés en même temps
  90. if(etat == 6)
  91. {
  92. //on joue le son
  93. myDFPlayer.play(6);
  94. //on active le relai
  95. RELAI_ON;
  96. //ce sont doit être joué tant que les faisceaux sont coupés et pendant max 12s
  97. unsigned long temps = millis();
  98. while( millis() - temps < 12000 && verification_etat() == 6)
  99. {
  100. //ici on fait une petite attente de 10ms
  101. delay(10);
  102. }
  103. //on coupe le son
  104. myDFPlayer.stop();
  105. //on coupe le relai
  106. RELAI_OFF;
  107. }
  108. //si plusieurs lasers sont coupé en même temps alors etat == -1
  109. if(etat == -1)
  110. {
  111. myDFPlayer.play(7); //on lance la lecture
  112. delay(1000); //on attend 1s
  113. myDFPlayer.stop(); //on arrête la lecture
  114. }
  115. }