Le programme Arduino à injecter
-
Je vous mets ci-dessous le programme à injecter dans le mega 2560.
Il n'a pas la prétention d'être hyper optimisé, le but est aussi de laisser la possibilité à ceux qui ne connaissent pas la programmation de modifier facilement pour adapter à leurs besoins.
-
Programme à ce jour
Il manque (au moins lol) :
- La gestion moteurs
- La partie MP3 bouton mission
J'affinerai à terme les dénominations de certaines variables et constantes qui ne me plaisent pas.//Bibliothèques#include "Adafruit_NeoPixel.h"#include <Servo.h> // Inclure la bibliothèque Servo#include <Wire.h> // Inclure la bibliothèque pour la communication I2C#include <LiquidCrystal_I2C.h> // Inclure la bibliothèque pour l'écran LCD I2C#include "TM1637Display.h" // Inclure la bibliothèque des afficheurs TM1637#include "SoftwareSerial.h" // Inclure la bibliothèque du lecteur MP3#include <DFPlayer_Mini_Mp3.h> // Inclure la bibliothèque du lecteur MP3//Define PINS//LEDS FONCTIONNEMENT#define LedsDeJeu 2 //Leds Adressables boutons etc#define NbLedsDeJeu 60 //Nombre de leds Adressables//LEDS PLATEAU DE JEU#define LedsPlateau 3 //Leds Adressables plateau de jeu#define NbLedsPlateau 10 //Nombre de leds Adressables//BOUTONSconst int BOUTON01=22;const int BOUTON02=23;const int BOUTON03=24;const int BOUTON04=25;const int BOUTON05=26;const int BOUTON06=27;const int BOUTON07=28;const int BOUTON08=29;const int BOUTON09=30;const int BOUTON10=31;//CAPTEURS BILLEconst int CAPTEUR01=40;const int CAPTEUR02=41;const int CAPTEUR03=42;const int CAPTEUR04=43;const int CAPTEUR05=44;const int CAPTEUR06=45;const int CAPTEUR07=46;const int CAPTEUR08=47;const int CAPTEUR09=48;const int CAPTEUR10=49;const int CAPTEUR11=50; // BILLE PERDUEconst int CAPTEUR12=52; // PARTIE PERDUE// AFFICHEURSTM1637Display AfficheurHighScore(32, 33); // CLC, DIOTM1637Display AfficheurScore(34, 35); // CLC, DIOTM1637Display AfficheurNiveau(38, 39); // CLC, DIOTM1637Display AfficheurNbDeVies(36, 37); // CLC, DIOTM1637Display AfficheurTemps(51,53); // CLC, DIO//TM1637Display AfficheurTemps(34, 35); // CLC, DIOint Brightness = 230; //Luminosité des afficheurs//Initialiser les leds de jeuAdafruit_NeoPixel strip (NbLedsDeJeu, LedsDeJeu, NEO_GRB + NEO_KHZ800);//Initialiser les leds plateauAdafruit_NeoPixel strip_plateau (NbLedsPlateau, LedsPlateau, NEO_GRB + NEO_KHZ800);// Initialiser l'écran LCD avec l'adresse I2C (0x27 ou 0x3F en général, ajustez selon votre matériel)//LiquidCrystal lcd(0x3F, 16, 2);// Adresse I2C de l'écran LCD, ici 16x2 caractèresLiquidCrystal_I2C lcd(0x27,20,4);// Le JEU : Affichage lors de l'allumageint NbDeVies=3;int HighScore=0;int Score=0;int Niveau=1;// Variables et constantes chronomètreunsigned long Temps=4444;unsigned long DureeEcoulee=0;unsigned long DureeNiveau=0;bool ChronoEnMarche = false;int DureeMaxNiveau = 60;unsigned long LedPatiente = 0;unsigned long IntervallePatience = 0;bool StartOk = false;int BonusTemps=0;bool DemarreIceColdBeer = true;//Définition du lecteur MP3SoftwareSerial mySerial(8,7); // RX, TXconst int VolumeInitial = 20;const int MusiquePresentationMission = 1;const int MusiqueAllumage = 2;const int MusiqueBoutonStart = 3;const int MusiqueNiveauOk = 5;const int MusiqueNiveauPasOk = 6;const int MusiqueGameOver = 8;const int MusiquePassageInterdit = 9;const int MusiquePartieFinie = 10;void setup() {mySerial.begin(9600);mp3_set_serial(mySerial);mp3_set_volume(10); // fixe le son (30 maximum)mp3_set_EQ(0); // equalizer de 0 à 5nouvellePartie();}//Index = Numero sur le lecteur Musique Volume : On ajoute on on retire par rapport au niveau initial selon l'effet que l'on veut donnervoid musique(unsigned long Index,int MusiqueVolume) {mp3_play(Index);mp3_set_volume(MusiqueVolume+VolumeInitial);}void nouvellePartie() {eteindreTrotteuse();Score = 0;Niveau = 1;NbDeVies=3;//Démarrage Ledsstrip.begin();strip.setBrightness(70); // luminosité de la LED (maximum 255)strip_plateau.begin();strip_plateau.setBrightness(100);// Initialiser l'écran LCDlcd.init(); // Initialiser l'écran LCDlcd.backlight(); // Allumer le rétroéclairage de l'écran//Démarrage AfficheursAfficheurHighScore.setBrightness(Brightness);AfficheurHighScore.showNumberDec(HighScore);AfficheurScore.setBrightness(Brightness);AfficheurScore.showNumberDec(Score);AfficheurNiveau.setBrightness(Brightness);AfficheurNiveau.showNumberDec(Niveau);AfficheurNbDeVies.setBrightness(Brightness);AfficheurNbDeVies.showNumberDec(NbDeVies);AfficheurTemps.setBrightness(Brightness);AfficheurTemps.showNumberDec(0);// Salut Aventurierif (DemarreIceColdBeer) {message("Hello Aventurier","Appuie sur Start !");musique(MusiqueAllumage,0);}//Déclaration des boutonspinMode(BOUTON01,INPUT);pinMode(BOUTON02,INPUT);pinMode(BOUTON03,INPUT);pinMode(BOUTON04,INPUT);pinMode(BOUTON05,INPUT);pinMode(BOUTON06,INPUT);pinMode(BOUTON07,INPUT);pinMode(BOUTON08,INPUT);pinMode(BOUTON09,INPUT);pinMode(BOUTON10,INPUT);//Initialisation des boutonsdigitalWrite(BOUTON01,HIGH);digitalWrite(BOUTON02,HIGH);digitalWrite(BOUTON03,HIGH);digitalWrite(BOUTON04,HIGH);digitalWrite(BOUTON05,HIGH);digitalWrite(BOUTON06,HIGH);digitalWrite(BOUTON07,HIGH);digitalWrite(BOUTON08,HIGH);digitalWrite(BOUTON09,HIGH);digitalWrite(BOUTON10,HIGH);//Initialisation des Capteurs de billepinMode(CAPTEUR01, INPUT);pinMode(CAPTEUR02, INPUT);pinMode(CAPTEUR03, INPUT);pinMode(CAPTEUR04, INPUT);pinMode(CAPTEUR05, INPUT);pinMode(CAPTEUR06, INPUT);pinMode(CAPTEUR07, INPUT);pinMode(CAPTEUR08, INPUT);pinMode(CAPTEUR09, INPUT);pinMode(CAPTEUR10, INPUT);pinMode(CAPTEUR11, INPUT);pinMode(CAPTEUR12, INPUT);//On éteint la trotteuseeteindreTrotteuse();StartOk=false;}void loop() {if (ChronoEnMarche){afficher_chrono();}else{ switch (StartOk) {case false:patiente(100,0,0,255);//message("StartOk","False");break;case true:patiente(5,255,0,0);//message("StartOk","True");break;}}lire_boutons();missionImpossible();}void start() {message(" Up ou Down",">> lancer Niv "+String(Niveau));allume_led(1,255,0,0);ChronoEnMarche = false;patiente(1,255,0,0);AfficheurHighScore.showNumberDec(HighScore);AfficheurScore.showNumberDec(Score);AfficheurNiveau.showNumberDec(Niveau);AfficheurNbDeVies.showNumberDec(NbDeVies);AfficheurTemps.showNumberDec(Temps);Temps = millis();afficher_chrono();descendre_barre();}void afficher_chrono() {DureeEcoulee = (millis()-Temps)/1000;AfficheurTemps.showNumberDec(DureeEcoulee);// AfficheurTemps.showNumberDec(Temps);trotteuse(DureeEcoulee,DureeMaxNiveau);//message("Duree Ecoulee : ",String(DureeEcoulee));}void descendre_barre() {}void enclencher_bille() {}void gameOver() {musique(MusiqueGameOver,0);while (digitalRead(BOUTON01)==HIGH) {message("|| Game Over ||",">>> Press Start");delay(50);}eteindreTrotteuse();ChronoEnMarche=false;StartOk = false;AfficheurTemps.showNumberDec(0);nouvellePartie();}// Fonction qui permet de modifier les messages à chaque essaivoid essaieEncore(String Dommage1,String Dommage2) {NbDeVies=NbDeVies-1;AfficheurNbDeVies.showNumberDec(NbDeVies);musique(MusiqueNiveauPasOk,20);message(Dommage1,Dommage2);delay(3000);start();}// On tombe dans le trou interdit et donc la partie est finievoid trouInterdit(String Interdit1,String Interdit2) {NbDeVies=0;AfficheurNbDeVies.showNumberDec(NbDeVies);musique(MusiquePassageInterdit,0);message(Interdit1,Interdit2);delay(3000);start();}//Fonction MissionIntermédiaire Ok//Fonction qui valide la mission en cours//Elle comporte plusieurs variables, car elle permet de ://indiquer la durée autorisée pour ce niveau (sans quoi pas de bonus temps)//indiquer le nombre de points accordés pour ce niveau//Le coefficient du bonus temps//de faire gagner ou non des vies,//modifier les messages pour chaque niveau,void missionIntermediaireOk(int PointsNiveau,int DureeMax,int CoefBonus,int VieSupplementaire,String Felicitations1,String Felicitations2) {DureeNiveau=DureeEcoulee;if (DureeNiveau<DureeMax){BonusTemps=(DureeMax-DureeNiveau)*CoefBonus;}Score=Score+PointsNiveau+BonusTemps;AfficheurScore.showNumberDec(Score);musique(MusiqueNiveauOk,20);message("Bonus Temps : ",String(BonusTemps));delay(2000);message(Felicitations1,Felicitations2);delay(2000);//Mise à jour du HighScoreif (Score>HighScore) {HighScore=Score;}//Mise à jour du niveauif (Niveau<10) {message("Niveau "+String(Niveau) +" Ok","Up/Down -> Niv "+String(Niveau+1));delay(3000);Niveau = Niveau + 1;NbDeVies=NbDeVies+VieSupplementaire;start();}else{nouvellePartie();}}void missionImpossible() {if (NbDeVies==0) {gameOver();}switch (Niveau) {case 1://AllumerLedPlateau -> Valeur à adapter par rapport à votre StripLedAllumerLedPlateau(1,96,80,220);if (digitalRead(CAPTEUR01)==0) { //Bille Ok, elle tombe dans le Trou 01//missionIntermediaireOk(DureeMax pour le Niveau en secondes (sinon pas de bonus),Coef Bonus,VieSupplementaire (si on veut faire gagner une vie pour ce niveau),Message Felicitations ligne 1,Message Felicitations ligne 2)missionIntermediaireOk(100,60,10,1,"Bien vu !","On continue !");}else if (digitalRead(CAPTEUR11)==0){essaieEncore("Moins une vie","Dommage !");}else if (digitalRead(CAPTEUR12)==0) {trouInterdit("Non ! Pas Jack !","On recommence !");}break;case 2://AllumerLedPlateau -> Valeur à adapter par rapport à votre StripLedAllumerLedPlateau(2,96,80,220);if (digitalRead(CAPTEUR02)==0) { //Bille Ok, elle tombe dans le Trou 02//missionIntermediaireOk(DureeMax pour le Niveau en secondes (sinon pas de bonus),Coef Bonus,VieSupplementaire (si on veut faire gagner une vie pour ce niveau),Message Felicitations ligne 1,Message Felicitations ligne 2)missionIntermediaireOk(100,60,10,1,"Bien vu !","On continue !");}else if (digitalRead(CAPTEUR11)==0){essaieEncore("Moins une vie","Dommage !");}else if (digitalRead(CAPTEUR12)==0) {trouInterdit("Non ! Pas Jack !","On recommence !");}break;case 3://AllumerLedPlateau -> Valeur à adapter par rapport à votre StripLedAllumerLedPlateau(3,96,80,220);if (digitalRead(CAPTEUR03)==0) { //Bille Ok, elle tombe dans le Trou 03//missionIntermediaireOk(DureeMax pour le Niveau en secondes (sinon pas de bonus),Coef Bonus,VieSupplementaire (si on veut faire gagner une vie pour ce niveau),Message Felicitations ligne 1,Message Felicitations ligne 2)missionIntermediaireOk(100,60,10,1,"Bien vu !","On continue !");}else if (digitalRead(CAPTEUR11)==0){essaieEncore("Moins une vie","Dommage !");}else if (digitalRead(CAPTEUR12)==0) {trouInterdit("Non ! Pas Jack !","On recommence !");}break;case 4://AllumerLedPlateau -> Valeur à adapter par rapport à votre StripLedAllumerLedPlateau(3,96,80,220);if (digitalRead(CAPTEUR03)==0) { //Bille Ok, elle tombe dans le Trou 04//missionIntermediaireOk(DureeMax pour le Niveau en secondes (sinon pas de bonus),Coef Bonus,VieSupplementaire (si on veut faire gagner une vie pour ce niveau),Message Felicitations ligne 1,Message Felicitations ligne 2)missionIntermediaireOk(100,60,10,0,"Bien vu !","On continue !");}else if (digitalRead(CAPTEUR11)==0){essaieEncore("Moins une vie","Dommage !");}else if (digitalRead(CAPTEUR12)==0) {trouInterdit("Non ! Pas Jack !","On recommence !");}break;case 5://AllumerLedPlateau -> Valeur à adapter par rapport à votre StripLedAllumerLedPlateau(5,96,80,220);if (digitalRead(CAPTEUR05)==0) { //Bille Ok, elle tombe dans le Trou 05//missionIntermediaireOk(DureeMax pour le Niveau en secondes (sinon pas de bonus),Coef Bonus,VieSupplementaire (si on veut faire gagner une vie pour ce niveau),Message Felicitations ligne 1,Message Felicitations ligne 2)missionIntermediaireOk(100,60,10,1,"Bien vu !","On continue !");}else if (digitalRead(CAPTEUR11)==0){essaieEncore("Moins une vie","Dommage !");}else if (digitalRead(CAPTEUR12)==0) {trouInterdit("Non ! Pas Jack !","On recommence !");}break;case 6://AllumerLedPlateau -> Valeur à adapter par rapport à votre StripLedAllumerLedPlateau(6,96,80,220);if (digitalRead(CAPTEUR06)==0) { //Bille Ok, elle tombe dans le Trou 06//missionIntermediaireOk(DureeMax pour le Niveau en secondes (sinon pas de bonus),Coef Bonus,VieSupplementaire (si on veut faire gagner une vie pour ce niveau),Message Felicitations ligne 1,Message Felicitations ligne 2)missionIntermediaireOk(100,60,10,1,"Bien vu !","On continue !");}else if (digitalRead(CAPTEUR11)==0){essaieEncore("Moins une vie","Dommage !");}else if (digitalRead(CAPTEUR12)==0) {trouInterdit("Non ! Pas Jack !","On recommence !");}break;case 7://AllumerLedPlateau -> Valeur à adapter par rapport à votre StripLedAllumerLedPlateau(7,96,80,220);if (digitalRead(CAPTEUR07)==0) { //Bille Ok, elle tombe dans le Trou 07//missionIntermediaireOk(DureeMax pour le Niveau en secondes (sinon pas de bonus),Coef Bonus,VieSupplementaire (si on veut faire gagner une vie pour ce niveau),Message Felicitations ligne 1,Message Felicitations ligne 2)missionIntermediaireOk(100,60,10,1,"Bien vu !","On continue !");}else if (digitalRead(CAPTEUR11)==0){essaieEncore("Moins une vie","Dommage !");}else if (digitalRead(CAPTEUR12)==0) {trouInterdit("Non ! Pas Jack !","On recommence !");}break;case 8://AllumerLedPlateau -> Valeur à adapter par rapport à votre StripLedAllumerLedPlateau(8,96,80,220);if (digitalRead(CAPTEUR08)==0) { //Bille Ok, elle tombe dans le Trou 08//missionIntermediaireOk(DureeMax pour le Niveau en secondes (sinon pas de bonus),Coef Bonus,VieSupplementaire (si on veut faire gagner une vie pour ce niveau),Message Felicitations ligne 1,Message Felicitations ligne 2)missionIntermediaireOk(100,60,10,1,"Bien vu !","On continue !");}else if (digitalRead(CAPTEUR11)==0){essaieEncore("Moins une vie","Dommage !");}else if (digitalRead(CAPTEUR12)==0) {trouInterdit("Non ! Pas Jack !","On recommence !");}break;case 9://AllumerLedPlateau -> Valeur à adapter par rapport à votre StripLedAllumerLedPlateau(9,96,80,220);if (digitalRead(CAPTEUR09)==0) { //Bille Ok, elle tombe dans le Trou 09//missionIntermediaireOk(DureeMax pour le Niveau en secondes (sinon pas de bonus),Coef Bonus,VieSupplementaire (si on veut faire gagner une vie pour ce niveau),Message Felicitations ligne 1,Message Felicitations ligne 2)missionIntermediaireOk(100,60,10,1,"Bien vu !","On continue !");}else if (digitalRead(CAPTEUR11)==0){essaieEncore("Moins une vie","Dommage !");}else if (digitalRead(CAPTEUR12)==0) {trouInterdit("Non ! Pas Jack !","On recommence !");}break;case 10://AllumerLedPlateau -> Valeur à adapter par rapport à votre StripLedAllumerLedPlateau(10,96,80,220);if (digitalRead(CAPTEUR10)==0) { //Bille Ok, elle tombe dans le Trou 01//missionIntermediaireOk(DureeMax pour le Niveau en secondes (sinon pas de bonus),Coef Bonus,VieSupplementaire (si on veut faire gagner une vie pour ce niveau),Message Felicitations ligne 1,Message Felicitations ligne 2)missionIntermediaireOk(100,60,10,1,"Fantastique !","Aventurier Top !");musique(MusiquePartieFinie,0);}else if (digitalRead(CAPTEUR11)==0){essaieEncore("Moins une vie","Dommage !");}else if (digitalRead(CAPTEUR12)==0) {trouInterdit("Non ! Pas Jack !","On recommence !");}break;}}void testSiChronoEnMarche() {if (ChronoEnMarche==false) {ChronoEnMarche=true;Temps=millis();StartOk=1;eteindreTrotteuse();}}void lire_boutons() {if (digitalRead(BOUTON01)==LOW) {StartOk=true;musique(MusiqueBoutonStart,20);start();} // On démarre une nouvelle partieif (digitalRead(BOUTON02)==LOW) {}if (digitalRead(BOUTON03)==LOW) {}if (digitalRead(BOUTON04)==LOW) {}if (digitalRead(BOUTON05)==LOW) {}if (digitalRead(BOUTON06)==LOW) {}//Bouton Gauche Hautif (digitalRead(BOUTON07)==LOW) {//allume_led(7,96,80,220);testSiChronoEnMarche();if (digitalRead(BOUTON02)==LOW) {message("UP Gauche","STOP");}else {message("UP Gauche","MONTE");}}//Bouton Gauche Basif (digitalRead(BOUTON08)==LOW) {//allume_led(8,96,80,220);testSiChronoEnMarche();if (digitalRead(BOUTON03)==LOW) {message("Down Gauche","STOP");}else {message("Down Gauche","DESCEND");}}//Bouton Droit Hautif (digitalRead(BOUTON09)==LOW) {//allume_led(9,96,80,220);testSiChronoEnMarche();if (digitalRead(BOUTON05)==LOW) {message("UP Droit","STOP");}else {message("UP Droit","MONTE");}}//Bouton Droit Basif (digitalRead(BOUTON10)==LOW) {//allume_led(10,96,80,220);testSiChronoEnMarche();if (digitalRead(BOUTON06)==LOW) {message("Down Droit","STOP");}else {message("Down Droit","DESCEND");}}}void allume_led(int LED,int Rouge, int Vert, int Bleu) {strip.setPixelColor(LED-1, strip.Color(Rouge, Vert, Bleu));strip.show();strip.clear();}void AllumerLedPlateau(int LED,int Rouge, int Vert, int Bleu) {strip_plateau.setPixelColor(LED, strip.Color(Rouge, Vert, Bleu));strip_plateau.show();strip_plateau.clear();}void message(String Ligne1,String Ligne2) {lcd.clear();lcd.setCursor(0, 0); // Positionner le curseur en haut à gauche (colonne 0, ligne 0)lcd.print(Ligne1);lcd.setCursor(0, 1); // Positionner le curseur en haut à gauche (colonne 0, ligne 0)lcd.print(Ligne2);}void trotteuse(int DureeActuelle,int DureeMax) {strip.begin();strip.setPixelColor(DureeActuelle-1, strip.Color(DureeActuelle*4+10, 245-DureeActuelle*4, 0));strip.show();}void eteindreTrotteuse() {strip.begin();for (int i = -1; i<NbLedsDeJeu; i++) {strip.setPixelColor(i, strip.Color(0,0,0));strip.show();//message(String(i)," ");}}void patiente(unsigned long DureePatience,int Red,int Green, int Blue) {if (IntervallePatience<(millis()-DureePatience)) {strip.begin();strip.setPixelColor(LedPatiente-1, strip.Color(0,0,0));strip.setPixelColor(LedPatiente, strip.Color(Red,Green,Blue));strip.show();IntervallePatience=millis();if (LedPatiente==NbLedsDeJeu) {LedPatiente=0;}else {LedPatiente=LedPatiente+1;}}}void test_ring() {strip.begin();for (int i = 0; i < NbLedsDeJeu; i++) {strip.setPixelColor(i, strip.Color(0, i*4, 0));strip.show();}for (int i = 0; i < 60; i++) {message("Led allumee "+String(i)+" ","Couleur "+String(i*4));strip.setPixelColor(i, strip.Color(61, 90, 254));strip.show();//delay(20);}}