Auteur Sujet: Ice cold beer BARTOP  (Lu 2801 fois)

Hors ligne berunours

  • Serial Bartopeur
  • Passionné
  • *
  • Messages: 156
    • Voir le profil
Ice cold beer mini à l'étude
« Réponse #16 le: Samedi 17 Avril 2021, 23:25:08 pm »
  • J'vous ai refait la vidéo, avec moins de soleil, histoire qu'on voit vraiment les afficheurs cette fois.



    Hors ligne berunours

    • Serial Bartopeur
    • Passionné
    • *
    • Messages: 156
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #17 le: Dimanche 18 Avril 2021, 17:57:27 pm »
  • Bon bah... J'ai continué d'avancer dessus...

    Cette fois j'ai essayer de mettre le maximum de choses ensemble:
    - 9 capteur IR (8 trous étapes et le mauvais trou)
    - 1 afficheur led
    - 8 leds adressables

    Du coup mon programme fonctionne bien.



    Le code si interressés:
    #include <Adafruit_NeoPixel.h>
    Adafruit_NeoPixel strip(8, 11, NEO_GRBW + NEO_KHZ800);


    //--------------------------------------------------- INITIALISATION DE LA BECANNE ------------------------------------

    #include <SevenSegmentAsciiMap.h>
    #include <SevenSegmentExtended.h>
    #include <SevenSegmentTM1637.h>



    SevenSegmentTM1637    tm2(12, 13);  //afficheur du centre déclaration


    int temp = 0;            //variable temporisation
    int templed = 0;          //variable tempo pour chenillard led
    int tempbrill =0; int tempbrillad = 0;

    int bille = 0;           // Bille on bar
    int etape = 0;           // Trou demandé
    int bonus = 0;           // Variable bonus
    int score = 0;           // variable Score
    int highscore = 0;       // Variable highscore
    int tempoloop = 50;      // Variable du delay de la boucle pricipale en ms

    int trou = 0;  // trou dans laquelle est tombé la bille


    int Amode = 1;   // Pour attrack mode
    int Debutpartie = 0; // Initialisation de la partie après le crédit
    int Initbarre = 0;   // Pour que les barres aillent chercher une nouvelle bille
    int Principale = 0;  // Boucle principale avec bougeage des barres, bonus qui descent, billes qui passent dans un trou etc...
    int Bontrou = 0;     // Boucle Bille dans le bon trou
    int Badtrou = 0;     // Boucle Bille dans le mauvais trou
    int Gameover = 0;     // Boucle Gamover

    int test = 0; // Variable temporaire pour ecriture du programme (gestion des etapes)
    int credit = 0;  // test pour le moment


    void setup() {
     
         tm2.begin(); tm2.setBacklight(60); tm2.setPrintDelay(500); tm2.clear();   //afficheur du centre initialisation

         pinMode(2, INPUT);    // Mauvais trou
         pinMode(3, INPUT);    // Trou 1
         pinMode(4, INPUT);    // Trou 2
         pinMode(5, INPUT);    // Trou 3
         pinMode(6, INPUT);    // Trou 4
         pinMode(7, INPUT);    // Trou 5
         pinMode( 8, INPUT);    // Trou 6
         pinMode(9, INPUT);    // Trou 7
         pinMode(10, INPUT);   // Trou 8

          strip.begin(); // bande led début
          strip.show(); // bande led éteinte
          strip.setBrightness(30);
       
        Serial.begin(9600);    //Pour la console
       
    }

    void loop() {


    //--------------------------------------------------- ATTRACK MODE ---------------------------------
      if (Amode == 1){ delay(50);
           
           credit = digitalRead(2);                                       // Verif si boutton coin est appuyé
           if (credit== LOW) { Amode=0; Debutpartie = 1;tm2.clear();strip.clear();strip.show();strip.setBrightness(60);tempbrill = 0; tempbrillad = 5;}      // Sortie d'Attrack mode
       
        temp++;
           switch (temp) {                                                // Faire defiler text ecran du bas
              case 20: tm2.clear(); tm2.print("PLAY"); break;
              case 40: tm2.clear(); tm2.print("ICE"); break;
              case 60: tm2.clear(); tm2.print("COLD"); break;
              case 80: tm2.clear(); tm2.print("BEER"); break;
              case 100: tm2.clear(); break;
              case 120: tm2.clear(); tm2.setCursor(1, decalage (highscore)); tm2.print(highscore); temp = 0;  break;}

       
        templed++; 
             if ( templed <= 10) { strip.setBrightness(60);strip.setPixelColor(templed, 240, 240, 20); strip.setPixelColor(templed-1, 130, 130, 50);  strip.show();}
             if ( templed > 10 && templed <= 20 ){ strip.setPixelColor(templed-12, 0, 0, 0);  strip.show(); }
             if ( templed > 20 && templed <= 30 ){ strip.setPixelColor(templed-20, 240, 240, 20); strip.setPixelColor(templed-21, 130, 130, 50); strip.setPixelColor(templed-22, 0, 0, 0);  strip.show(); }
             if ( templed >= 30 && templed <= 40 ){ strip.setPixelColor(templed-32, 130, 130, 50);  strip.show();}
             if ( templed >= 50 && templed <= 60 ){ strip.setPixelColor(templed-52, 0, 0, 0);  strip.show(); }
             if (templed == 60){ for (int i= 0; i<8; i++ ) {tempbrill = 20; strip.setBrightness(tempbrill); strip.setPixelColor(i, 230, 230 ,230);  strip.show(); tempbrillad=10;}}
             if (templed > 60 && templed <=180) {tempbrill = tempbrill + tempbrillad ; strip.setBrightness(tempbrill);  strip.show(); if (tempbrill >70 || tempbrill < 20){tempbrillad=-tempbrillad;} }
             if (templed == 180){ for (int i= 0; i<8; i++ ) {tempbrill = 20; strip.setBrightness(tempbrill); strip.setPixelColor(i, 0, 0 ,0);  strip.show();}}
           
             if (templed >= 200) { templed=0;}
     
       } //----- FIN DE ATTRACK MODE

    //--------------------------------------------------- DEBUT DE PARTIE ---------------------------------
      if (Debutpartie == 1){bille++; etape = 1; Debutpartie =0; Initbarre = 1;tm2.clear(); tm2.print(bille);tm2.blink();
                           strip.clear();strip.setPixelColor(etape-1, 240, 240, 20);strip.show();}
     
    //----------------------------------------- INITIALISATION DES BARRES ET BONUS ------------------------
     
      if (Initbarre ==1){ bonus = etape *100; tm2.clear(); tm2.setCursor(1, decalage (bonus)); tm2.print(bonus);delay (1000);Initbarre = 0;temp =0;Principale = 1;}  //Affichage Bonus

    //----------------------------------------------------BOUCLE PRINCIPALE--------------------------------

    if (Principale == 1) { delay(tempoloop);  // Delais (latence voulu)
           
            temp++; if (temp > (3000/tempoloop) && bonus > 0) {bonus = bonus - 10; tm2.clear(); tm2.setCursor(1, decalage (bonus)); tm2.print(bonus); temp = 0;} //Actu Bonus
            tempbrill = tempbrill + tempbrillad ; strip.setBrightness(tempbrill);strip.setPixelColor(etape-1, 240, 240, 20);  strip.show(); if (tempbrill >70 ){tempbrillad=-5;}; if (tempbrill <20 ){tempbrillad= 5;}
            //-----Detection du trou

         int troudetect = 0; trou=0;
            troudetect = digitalRead(2); if (troudetect == LOW){ trou=20;}       // Mauvais trou
            troudetect = digitalRead(3); if (troudetect == LOW){ trou=1;}        // Trou 1
            troudetect = digitalRead(4); if (troudetect == LOW){ trou=2;}        // Trou 2
            troudetect = digitalRead(5); if (troudetect == LOW){ trou=3;}        // Trou 3
            troudetect = digitalRead(6); if (troudetect == LOW){ trou=4;}        // Trou 4
            troudetect = digitalRead(7); if (troudetect == LOW){ trou=5;}        // Trou 5
            troudetect = digitalRead(8); if (troudetect == LOW){ trou=6;}        // Trou 6
            troudetect = digitalRead(9); if (troudetect == LOW){ trou=7;}        // Trou 7
            troudetect = digitalRead(10); if (troudetect == LOW){ trou=8;}       // Trou 8
         if (trou != 0 && trou == etape) { Bontrou =1 ; Principale = 0 ;}
         if (trou != 0 && trou != etape) { Badtrou =1 ; Principale = 0 ;}


       
    } //----- FIN DE BOUCLE PRINCIPALE

    //----------------------------------------------------------BON TROU-----------------------------------
      if (Bontrou == 1) { tm2.blink(); temp = bonus/10; score = score + bonus; tm2.clear(); tm2.setCursor(1, decalage (score)); tm2.print(score);
                   etape++; if (etape > 8) {etape=1;} Bontrou =0; Initbarre =1;tm2.blink();strip.clear();strip.show();}  // Retour Initialisation barre
     
    //--------------------------------------------------------MAUVAIS TROU----------------------------------
      if (Badtrou == 1){ for (int i= 0; i<8 ; i++ ) {strip.setPixelColor(i, 230, 0 ,0);  strip.show();}
                     tm2.clear(); tm2.print("OUPS"); tm2.blink();
           
            if (bille == 3) { Gameover = 1;} Debutpartie = 1; Badtrou = 0;}

    //----------------------------------------------------------GAME OVER------------------------------------
      if (Gameover == 1) {tm2.clear(); tm2.print("    GAME OVER   YOUR SCORE   "); tm2.clear(); tm2.setCursor(1, decalage (score)); tm2.print(score); delay (1000); tm2.blink(); delay (1000); tm2.clear();
            if ( score > highscore) { highscore = score; tm2.clear(); tm2.print(" NEW"); tm2.blink(); tm2.print("HIGH"); tm2.blink(); tm2.print("SCOR"); tm2.blink(); tm2.clear();}
            Amode = 1; Gameover = 0; Debutpartie = 0; bille = 0; etape = 0; score = 0; temp = 0;}
     
     
    }//----- FIN LOOP


    int decalage (int adecaler) {         // Fonction pour trouver decalage des afficheurs *******************
        int decal = 0;
        if ( adecaler <1000){decal = 1;}
        if ( adecaler <100){decal = 2;}
        if ( adecaler <10){decal = 3;}
        return decal;       
    }
    « Modifié: Dimanche 18 Avril 2021, 19:27:22 pm par berunours »

    Hors ligne ɐɹqoƆ‾ɥƃᴉH

    • Webmaster
    • Dieu de l' Arcade
    • *****
    • Messages: 12245
    • Localisation: Montréal
    • Je suis juste un multi-nick d'AsPiC...
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #18 le: Dimanche 18 Avril 2021, 19:05:23 pm »
  • Pas mal la vidéo, ça avance bien, par contre désolé pour la remarque mais ton code est particulièrement mal mis en forme et illisible. Tu devrais prendre un petit moment pour le remettre au propre. Ca ne pourra être que bénéfique le jour où tu voudras y remettre les mains dedans.

    Quelques conseils à mettre en pratique :
    - Ne pas avoir plusieurs instructions sur la même ligne, pour faire simple : un ; = retour à la ligne
    - Respecter de façon précise l’indentation : chaque nouvelle structure de contrôle doit avoir son indentation. Une boucle for = un décalage, un If, pareil. Ca te permets très rapidement de voir où commencent et où finissent tes blocs de code.
    - Garde une cohérence sur tes noms de variable (1er lettre en majuscule ou pas par exemple) et dans ta façon de coder (espace avant et après les = par exemple) et plein d'autres petits détails.
    - Utilise des constante pour tes ports E/S, ça t'évitera le gros rechercher/remplacer si un jour tu veux changer une valeur.

    Un exemple de mise en forme de ton code :

    //----------------------------------------------------------BON TROU-----------------------------------
      if (Bontrou == 1) { tm2.blink(); temp = bonus/10; score = score + bonus; tm2.clear(); tm2.setCursor(1, decalage (score)); tm2.print(score);
                   etape++; if (etape > 8) {etape=1;} Bontrou =0; Initbarre =1;tm2.blink();strip.clear();strip.show();}  // Retour Initialisation barre

    //----------------------------------------------------------BON TROU-----------------------------------
    if (Bontrou == 1) {
        tm2.blink();
        temp = bonus/10;
        score = score + bonus;
        tm2.clear();
        tm2.setCursor(1, decalage (score));
        tm2.print(score);
        etape++;
        if (etape > 8) {
            etape = 1;
            }
        Bontrou = 0;
        Initbarre = 1;
        tm2.blink();
        strip.clear();
        strip.show();
    }  // Retour Initialisation barre

    Hors ligne berunours

    • Serial Bartopeur
    • Passionné
    • *
    • Messages: 156
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #19 le: Dimanche 18 Avril 2021, 19:25:27 pm »
  • Pas mal la vidéo, ça avance bien, par contre désolé pour la remarque mais ton code est particulièrement mal mis en forme et illisible. Tu devrais prendre un petit moment pour le remettre au propre. Ca ne pourra être que bénéfique le jour où tu voudras y remettre les mains dedans.

    J'avoue, je suis extrêmement bordélique ! Et pas que niveau code...
    Merci pour tes conseils, je vais essayer de m'appliquer, surtout que je veux rendre tout accessible.
    Si je n'arrive parfois pas à me relire, j'ose pas imaginer quelqu'un qui chope mon truc au pif :/

    Hors ligne kidicarus

    • Grand Pilier
    • *
    • Messages: 786
    • Localisation: Bruxelles Belgique
    • Fan de flippers de nintendo et retro gaming
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #20 le: Dimanche 18 Avril 2021, 21:02:59 pm »
  • très chouette projet ^-^  je suis cela de près
    Je cherche une playchoice 10 et une pcb super system nintendo un playfield skateball ; evel knievel

    Hors ligne berunours

    • Serial Bartopeur
    • Passionné
    • *
    • Messages: 156
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #21 le: Dimanche 02 Mai 2021, 19:01:49 pm »
  • Dernier jour de congé... J'ai bossé un peu dessus:

     J'ai reçu de nouveaux afficheurs plus grands, un arduino mega et mes Df mini player.

    Du coup on a câblé le tout, même l'entièreté des capteur infra rouges:



    C'est un bordel de câble sans nom...

    J'ai codé le son. En gros, on envoie juste l'info "joue telle chanson" au Df player et il se débrouille tout seul.
    J'ai aussi essayé de remettre un peu d'ordre dans mon code pour qu'il soit plus lisible. Je n'arrive pas à développer entièrement et n'avoir qu'une seule instruction  par ligne, mais j'essaie de n'avoir qu'un seul type à la fois. Genre:
    - les afficheur  // descriptif vite fait
    - les leds         //  blablabla
    - les opé algo  //  leur rôle

    Quand ce sera fini, je ferai ça mieux. Mais déjà, je trouve que je progresse :p

    //-------------- LIBRAIRIES ----------------------//****************************************************************

    #include <SevenSegmentAsciiMap.h>       //
    #include <SevenSegmentExtended.h>       // Librairies pour les afficheurs 4 digits 7 segments
    #include <SevenSegmentTM1637.h>         //

    #include "Arduino.h"                    //
    #include "SoftwareSerial.h"             // Librairies Dfmini
    #include "DFRobotDFPlayerMini.h"        //

    #include <Adafruit_NeoPixel.h>          // Librairie pour les leds

    #include "Arduino.h"                    //
    #include "SoftwareSerial.h"             //  Librairie pour le Dfmini
    #include "DFRobotDFPlayerMini.h"        //

    //-------------- DECLARATION MATOS ---------------//****************************************************************

    SevenSegmentTM1637    TM1(24, 22);  //afficheur du BAS déclaration     -- CLK 24 -- DIO 22 --
    SevenSegmentTM1637    TM2(28, 26);  //afficheur du CENTRE déclaration  -- CLK 28 -- DIO 26 --
    SevenSegmentTM1637    TM3(32, 30);  //afficheur du HAUT déclaration    -- CLK 32 -- DIO 30 --

    Adafruit_NeoPixel STRIP(8, 34, NEO_GRBW + NEO_KHZ800);   // Bande led déclaration -- NBR LED 8 -- DIO 34 --

    SoftwareSerial mySoftwareSerial(13, 12);     // Dfmini déclaration -- RX 12 -- TX 13 -- DOIVENT ETRES PWR
    DFRobotDFPlayerMini myDFPlayer;              //
    void printDetail(uint8_t type, int value);   //

    //------------- DECLARATION VARIAVLES -------------//***************************************************************

    int Latence = 50;                            // Pour gérer le delay de l'arduino (multiple de 50 sinon ce sera la merde !!!!!)
    int TempAFF = 0;                              // Temporaire pour les Afficheurs
    int TempLED = 0;                              // Temporaire pour les Leds
    int TempLEDBRILL = 0; int TempLEDBRILLAD = 0; // Tempoiraire scintillement Leds
    int TempBONUS = 0;                            // Tempoiraire décompte bonus

    int Highscore = 0;                            // Highscore
    int Bille = 0;                                // Bille on bar
    int Etape = 0;                                // Trou demandé
    int Bonus = 0;                                // Variable bonus
    int Score = 0;                                // variable Score

    int BTNcredit = 0;                             // Bouton Credit                   


    int Amode = 1;        // Boucle ATTRACK MODE
    int Debutpartie = 0;  // Initialisation de la partie après le crédit
    int Initbarre = 0;    // Pour que les barres aillent chercher une nouvelle bille
    int Principale = 0;   // Boucle principale avec bougeage des barres, bonus qui descent, billes qui passent dans un trou etc...
    int Trou = 0;         // Trou dans laquelle est tombé la Bille
    int BonTrou = 0;      // Boucle Bille dans le bon trou
    int BadTrou = 0;      // Boucle Bille dans le mauvais trou
    int Gameover = 0;     // Boucle Gamover


    void setup() {

        TM1.begin(); TM1.setPrintDelay(500); TM1.clear();                         // Afficheur du BAS initialisation (début / brightness / RAZ)
        TM2.begin(); TM2.setPrintDelay(500); TM2.clear();                         // Afficheur du CENTRE initialisation
        TM3.begin(); TM3.setPrintDelay(500); TM3.clear();                         // Afficheur du HAUT initialisation

        STRIP.begin(); STRIP.clear(); STRIP.show(); STRIP.setBrightness(30);      // Bande led initialisation (début, clear + affichage, brightness)

        mySoftwareSerial.begin(9600); Serial.begin(115200);                       // Dfmini comm serie
        !myDFPlayer.begin(mySoftwareSerial);                                      // Dfmini initialisation
        myDFPlayer.volume(15);                                                    // Dfmini volume (0~30)
       
        pinMode (36, INPUT_PULLUP);                                               // Bouton Crédit en PULLUP -- PIN 36 --

        pinMode(23, INPUT);    // Mauvais Trou
        pinMode(43, INPUT);    // Trou 1
        pinMode(41, INPUT);    // Trou 2
        pinMode(39, INPUT);    // Trou 3
        pinMode(37, INPUT);    // Trou 4
        pinMode(35, INPUT);    // Trou 5
        pinMode(33, INPUT);    // Trou 6
        pinMode(31, INPUT);    // Trou 7
        pinMode(29, INPUT);    // Trou 8
        pinMode(27, INPUT);    // Trou 9
        pinMode(25, INPUT);    // Trou 10


    Serial.begin(9600);    //Pour la console

    }

    void loop() {

    delay(Latence);      // millisecondes de mise a jour de la boucle


    //--------------------------------------------------- ATTRACK MODE -------------------------------------------------
      if (Amode == 1){ 
         
         BTNcredit = digitalRead(36);                                                                   // Verif si boutton coin est appuyé
              if (BTNcredit == LOW) { Amode =  0; Debutpartie = 1; Etape = 1;                           // Sortie d'Attrack mode et Debut de Partie
                                      myDFPlayer.playMp3Folder(6);                                      // Dfmini SON pièce qui tombe
                                      delay(1000);                                                      //
                                      TM1.clear(); TM2.clear();TM3.clear();                             // On efface les Afficheurs
                                      STRIP.clear(); STRIP.show(); STRIP.setBrightness(30);             // RAZ valeurs Bandes LEDs
                                      TempLEDBRILL = 0; TempLEDBRILLAD = 5; TempAFF = 0; TempLED = 0;}  // RAZ Valeurs Tempo   

         
         TempAFF++; int TempAFF2 = TempAFF * Latence;
            switch (TempAFF2) {                                                // Faire defiler text ecran du bas
              case (1000): TM1.clear(); TM1.print("PLAY"); break;
              case (2000): TM1.clear(); TM1.print("ICE"); break;
              case (3000): TM1.clear(); TM1.print("COLD"); break;
              case (4000): TM1.clear(); TM1.print("BEER"); break;
              case (5000): TM1.clear(); break;
              case (6000): TM1.clear(); TM1.setCursor(1, DECALAGE (Highscore)); TM1.print(Highscore); TempAFF = 0;  break;}
               
         TempLED++; 
             if ( TempLED <= 10 ) { STRIP.setBrightness(60);STRIP.setPixelColor(TempLED, 240, 240, 20); STRIP.setPixelColor(TempLED-1, 130, 130, 50);  STRIP.show();}
             if ( TempLED > 10 && TempLED <= 20 ){ STRIP.setPixelColor(TempLED-12, 0, 0, 0);  STRIP.show(); }
             if ( TempLED > 20 && TempLED <= 30 ){ STRIP.setPixelColor(TempLED-20, 240, 240, 20); STRIP.setPixelColor(TempLED-21, 130, 130, 50); STRIP.setPixelColor(TempLED-22, 0, 0, 0);  STRIP.show(); }
             if ( TempLED >= 30 && TempLED <= 40 ){ STRIP.setPixelColor(TempLED-32, 130, 130, 50);  STRIP.show();}
             if ( TempLED >= 50 && TempLED <= 60 ){ STRIP.setPixelColor(TempLED-52, 0, 0, 0);  STRIP.show(); }
             if ( TempLED == 60 ){ for (int i= 0; i<8; i++ ) {TempLEDBRILL = 20; STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(i, 230, 230 ,230);  STRIP.show(); TempLEDBRILLAD=10;}}
             if ( TempLED > 60 && TempLED <=180) {TempLEDBRILL = TempLEDBRILL + TempLEDBRILLAD ; STRIP.setBrightness(TempLEDBRILL);  STRIP.show(); if (TempLEDBRILL >70 || TempLEDBRILL < 20){TempLEDBRILLAD=-TempLEDBRILLAD;} }
             if ( TempLED == 180 ){ for (int i= 0; i<8; i++ ) {TempLEDBRILL = 20; STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(i, 0, 0 ,0);  STRIP.show();}}
             if (TempLED >= 200) { TempLED=0;}


      } //----- FIN DE ATTRACK MODE

    //--------------------------------------------------- DEBUT DE PARTIE ---------------------------------
      if (Debutpartie == 1){ Bille++; Debutpartie =0; Initbarre = 1;                         // Sortie Debut de Partie vers Initialisation des barres
                             TM3.clear(); TM3.print(Bille);                                             // Affichage Bille on barre
                             STRIP.clear();STRIP.setPixelColor(Etape-1, 240, 240, 20);STRIP.show();}    // Allumage LED trou demandé

    //----------------------------------------- INITIALISATION DES BARRES ET BONUS ------------------------
     
      if (Initbarre ==1){ Bonus = Etape *100; TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);  // Affichage Bonus
                          TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score);                      // Affichage Score
                          myDFPlayer.playMp3Folder(1);                                                            // Dfmini SON Debut de partie               
                          delay (5000);                                               //--- <><><><><> --- Attendre que lesw barres prennent la bille
                         
                          Initbarre = 0; Principale = 1; TempBONUS = 0;}                                          // Sortie Initialisation barres vers Principale

    //----------------------------------------------------BOUCLE PRINCIPALE--------------------------------

    if (Principale == 1) { delay(Latence);  // Delais (latence voulu)
           
            TempBONUS++; if (TempBONUS > (2000/Latence) && Bonus > 0) {Bonus = Bonus - 10;              // Décompte Bonus
                             myDFPlayer.playMp3Folder(5);                                               // Dfmini Bonus -10
                             TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);         //
                             TempBONUS = 0;}
                             //
            TempLEDBRILL = TempLEDBRILL + TempLEDBRILLAD;
            STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(Etape-1, 240, 240, 20); 
            STRIP.show();
                         if (TempLEDBRILL >70 ){TempLEDBRILLAD=-10;};
                         if (TempLEDBRILL <10 ){TempLEDBRILLAD= 10;}
           
            //-----Detection du Trou

         int Troudetect = 0; Trou=0;
             Troudetect = digitalRead(23); if (Troudetect == LOW){ Trou=20;}       // Mauvais Trou
             Troudetect = digitalRead(43); if (Troudetect == LOW){ Trou=1;}        // Trou 1
             Troudetect = digitalRead(41); if (Troudetect == LOW){ Trou=2;}        // Trou 2
             Troudetect = digitalRead(39); if (Troudetect == LOW){ Trou=3;}        // Trou 3
             Troudetect = digitalRead(37); if (Troudetect == LOW){ Trou=4;}        // Trou 4
             Troudetect = digitalRead(35); if (Troudetect == LOW){ Trou=5;}        // Trou 5
             Troudetect = digitalRead(33); if (Troudetect == LOW){ Trou=6;}        // Trou 6
             Troudetect = digitalRead(31); if (Troudetect == LOW){ Trou=7;}        // Trou 7
             Troudetect = digitalRead(29); if (Troudetect == LOW){ Trou=8;}        // Trou 8
             Troudetect = digitalRead(27); if (Troudetect == LOW){ Trou=9;}        // Trou 9
             Troudetect = digitalRead(25); if (Troudetect == LOW){ Trou=10;}       // Trou 10
         
         if (Trou != 0 && Trou == Etape) { BonTrou =1 ; Principale = 0 ;}          // Bille tombé dans le Bon Trou      :D
         if (Trou != 0 && Trou != Etape) { BadTrou =1 ; Principale = 0 ;}          // Bille tombé dans le Mauvais Trou  :(


       
    } //----- FIN DE BOUCLE PRINCIPALE

    //----------------------------------------------------------BON Trou-----------------------------------
      if (BonTrou == 1) {
                   myDFPlayer.playMp3Folder(3);                                             // Dfmini SON Bon trou
                   TM2.blink(); TempBONUS = Bonus/10;
                   for ( int i=0; i < TempBONUS; i++){                                      // Décompte du bonus
                       Bonus= Bonus -10; Score = Score +10;
                       myDFPlayer.playMp3Folder(4); delay (200- (i));                     // Dfmini SON Bonus decompte         
                       TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);   // Affichage Bonus
                       TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score);}  // Affichage Score
                   
                   Etape++; if (Etape > 10) {Etape=1;} BonTrou =0; Initbarre =1;TM1.blink();STRIP.clear();STRIP.show();}  // Retour Initialisation barre
     
    //--------------------------------------------------------MAUVAIS Trou----------------------------------
      if (BadTrou == 1){
              for (int i= 0; i<10; i++ ) {STRIP.setPixelColor(i, 230, 0 ,0);  STRIP.show();}                     // LEDS en Rouge
                 TM3.clear(); TM3.print("-"); TM2.clear(); TM2.print("----"); TM1.clear(); TM1.print("OUPS");    // OUPS Message
                 myDFPlayer.playMp3Folder(9);                                                                    // Dfmini SON Mauvais trou
                 delay (3000);                                                                                   
              if (Bille == 3) { Gameover = 1;}                                                                   // Verif si GAME OVER
              Debutpartie = 1; BadTrou = 0;}                                                                     // Retour debut de partie

    //----------------------------------------------------------GAME OVER------------------------------------
      if (Gameover == 1) { myDFPlayer.playMp3Folder(8);                                                          // Dfmini SON GAME OVER
                 TM1.clear(); TM2.clear(); TM3.clear();
                 TM1.print("    GAME OVER   YOUR Score   ");
                 TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score); delay (500);
                 TM2.blink(); delay (1000); TM1.clear();
            if ( Score > Highscore) { Highscore = Score;
                  TM1.clear(); TM1.print(" NEW"); TM1.blink(); TM1.print("HIGH"); TM1.blink(); TM1.print("SCOR"); TM1.blink(); TM1.clear();}
         Amode = 1; Gameover = 0; Debutpartie = 0; Bille = 0; Etape = 0; Score = 0;}
     
    Serial.println (Trou);
    //printDetail(myDFPlayer.readType(), myDFPlayer.read());

    }//----- FIN LOOP




    // Fonction pour trouver decalage des afficheurs *******************

    int DECALAGE (int Adecaler) {         
        int Decal = 0;
        if ( Adecaler <1000){Decal = 1;}
        if ( Adecaler <100){Decal = 2;}
        if ( Adecaler <10){Decal = 3;}
        return Decal;       
    }

    // Fonction Comm Dfmini ************************ *******************

    void printDetail(uint8_t type, int value){
      switch (type) {
        case TimeOut: Serial.println(F("Time Out!")); break;
        case WrongStack: Serial.println(F("Stack Wrong!")); break;
        case DFPlayerCardInserted: Serial.println(F("Card Inserted!")); break;
        case DFPlayerCardRemoved: Serial.println(F("Card Removed!")); break;
        case DFPlayerCardOnline: Serial.println(F("Card Online!")); break;
        case DFPlayerUSBInserted: Serial.println("USB Inserted!"); break;
        case DFPlayerUSBRemoved: Serial.println("USB Removed!"); break;
        case DFPlayerPlayFinished: Serial.print(F("Number:")); Serial.print(value); Serial.println(F(" Play Finished!")); break;
        case DFPlayerError: Serial.print(F("DFPlayerError:"));
        switch (value) {
            case Busy: Serial.println(F("Card not found")); break;
            case Sleeping: Serial.println(F("Sleeping")); break;
            case SerialWrongStack: Serial.println(F("Get Wrong Stack")); break;
            case CheckSumNotMatch: Serial.println(F("Check Sum Not Match")); break;
            case FileIndexOut: Serial.println(F("File Index Out of Bound")); break;
            case FileMismatch: Serial.println(F("Cannot Find File")); break;
            case Advertise: Serial.println(F("In Advertise")); break;
            default: break;
         }
          break; default: break;
      }
    }

    Du coup, j'vous ai fait une petite vidéo. Comme ma femme faisait la sieste pas loin, je n'ai pas pu dire grand chose mais je vous ai mis des sous-titres pour que ce soit plus claire.
    Pareil, le Df mini est réglé à 40 % de son volume max et le haut parleur est branché en direct. Pour la version final, je passerai peut-être par un petit ampli histoire d'avoir un son plus audible.


    Pour les sons, je me suis fourni chez sushy18, après les avoir isolé, ils rendent pas trop mal. Je suppose qu'il y a encore un peu de travail à faire de ce côté là.

    Prochaine étape: commander des moteurs... Je vais faire ça dans la semaine. Si tout va bien, je m'y remets pour le pont du 13 mai.

    Hors ligne APPLE//C

    • Accro
    • *
    • Messages: 203
    • Localisation: Belgique à fond la bibine
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #22 le: Mercredi 05 Mai 2021, 08:52:17 am »
  • ça promet !  :-)=

    Hors ligne Little_Rabbit

    • ✌(◕‿◕)✌ Donateur 2021
    • Staff
    • Dieu de l' Arcade
    • *****
    • Messages: 6104
    • Localisation: Nantes
    • The early 80's : the arcade golden age !!
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #23 le: Mercredi 05 Mai 2021, 23:28:37 pm »
  • Salut,

    Ça prend sacrément forme !  ^-^

    C'est un bordel de câbles sans nom...

    Tu trouves ?? Au contraire, je trouve qu'avec les solutions "modernes" que tu as adoptées, le câblage est plutôt optimisé 8). Une Ice Cold Beer originale doit avoir un paquet de fils en plus je pense ! :)

    Ton code a vachement gagné en clarté !  ^-

    J'entends déjà les "Ah je vous ai battu, à vous de payer la tournée !" :D
     
    A+
    Recherche bornes dédiées ou PCB originaux: Miss Pacman, Dig Dug, Galaga, Mappy, Asteroids, Battlezone, Missile Command, Tempest, Star Wars, Donkey Kong (+ Jr), Mario Bros, Moon Patrol, Defender, Joust, Frogger, Gyruss, Pooyan, Space Tactics, Zaxxon, etc. Flip : Gottlieb des années 80 (Spirit, Amazon Hunt, ...), Baby Pac Man. Divers :  Ice Cold Beer
    Trois fois rien quoi ! :D

    Hors ligne sushy18

    • ✌(◕‿◕)✌ Donateur 2019 Bootlegger de cendrier Dealer de tokens
    • Game Cheater
    • *
    • Messages: 2265
    • Localisation: Bourges/Paris/cluster60
    • Dans l'arcade de pere en fils depuis aout 2014
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #24 le: Jeudi 06 Mai 2021, 08:31:47 am »
  • Bravo !!!  ^-^ même si je suis un poil jaloux  ::) :D
     je note l'excellent travail.
    vraiment  top !

    suggestion : le décompte de points peut être un peu accéléré ?


    au passage je suis le travail d'un turc sur Facebook ( son origine en s'en bat les reins c'est surtout qu'il publie en turc  (:x )
    Milker Ulucay  ;)
    Il vend des bornes inspirées de ICB et Zeke's peak



    je l'ai tellement saoulé avec mes questions  et avec beaucoup d'humour qu'il m'a fait une proposition de design:

    puis dit travailler sur :


    déja en v3.0  :o ^-


    ce que je trouve surtout intéressant c'est son system, un peu différent de l'ICB  pour monter et descendre le coté de la barre:
    il ne s'est pas fait chié de barres verticales  et me semble adapté pour un format mini :





    « Modifié: Jeudi 06 Mai 2021, 08:52:45 am par sushy18 »
    Si tu ne sais pas demande, si tu sais partage !!
    Faudrait pas perdre de vue qu'une borne d'arcade c'est pas une console, c'est rarement plug n play, plus souvent plug n pschitt... (Funkycochise 2008)
    "Gratuit ? C'est déjà trop cher !!" ( Crying Freeman 2016)

    Hors ligne berunours

    • Serial Bartopeur
    • Passionné
    • *
    • Messages: 156
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #25 le: Jeudi 06 Mai 2021, 13:23:48 pm »
  • Bravo !!!  ^-^ même si je suis un poil jaloux  ::) :D
     je note l'excellent travail.
    vraiment  top !
    Merci, mais sans ton taf de défrichage, rien n'aurait été possible.
    J'suis très motivé a essayer de te permettre de finir ton projet. J''espère au moins te faire avancer, notamment sur le code qui devrait pouvoir facilement se transposer sur la tienne.
    suggestion : le décompte de points peut être un peu accéléré ?
    Je viens de le ralentir car les sons "merdouillaient" un peu, mais je vais corriger ça.

    au passage je suis le travail d'un turc sur Facebook ( son origine en s'en bat les reins c'est surtout qu'il publie en turc  (:x )
    Milker Ulucay  ;)
    Il vend des bornes inspirées de ICB et Zeke's peak

    https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506084105-sushy18-177013513-271449394712220-2671097409251752953-n.jpg
    https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506084142-sushy18-173900417-285779893127687-3507596279168130928-n.jpg
    je l'ai tellement saoulé avec mes questions  et avec beaucoup d'humour qu'il m'a fait une proposition de design:
    https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506084913-sushy18-179783792-1155678471562411-8002074352329338532-n.jpg
    puis dit travailler sur :
    https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20210506084317-sushy18-180829543-10223201473117879-8027998242673347509-n.jpg

    déja en v3.0  :o ^-


    ce que je trouve surtout intéressant c'est son system, un peu différent de l'ICB  pour monter et descendre le coté de la barre:
    il ne s'est pas fait chié de barres verticales  et me semble adapté pour un format mini :



    J'avoue, sa solution est très élégante, elle a l'aire parfaitement jouable. Je risque de la copier m'en inspirer fortement  ;)
    J'avais déjà prévu d'utiliser des moteurs type Nema 17 et des poulies / courroies GT2. Mais ma réflexion se portait sur un système beaucoup compliqué à mettre en place.
    Là, je vais gagner énormément de temps, je suis joie !

    Ps: je viens de recevoir mes moteurs, je vais surement essayer de les faire fonctionner ce week-end.
    « Modifié: Jeudi 06 Mai 2021, 13:25:21 pm par berunours »

    Hors ligne ɐɹqoƆ‾ɥƃᴉH

    • Webmaster
    • Dieu de l' Arcade
    • *****
    • Messages: 12245
    • Localisation: Montréal
    • Je suis juste un multi-nick d'AsPiC...
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #26 le: Jeudi 06 Mai 2021, 13:55:57 pm »
  • Sinon, toujours avec des moteurs pas à pas, tu peux aussi t'inspirer des axes Z des imprimantes 3D, ça peut faire une bonne base de travail.

    Hors ligne berunours

    • Serial Bartopeur
    • Passionné
    • *
    • Messages: 156
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #27 le: Jeudi 06 Mai 2021, 17:41:09 pm »
  • Sinon, toujours avec des moteurs pas à pas, tu peux aussi t'inspirer des axes Z des imprimantes 3D, ça peut faire une bonne base de travail.
    J'étais parti sur ça au départ, mais je pense que ce sera trop lent.
    Ce qu'a fait notre confrère Milker Ulucay est tellement simple et efficace que je me sens un peu bête de ne pas y avoir pensé plus tôt.

    Hors ligne -fab-

    • Addict
    • *
    • Messages: 302
    • Localisation: [54] Meuthe et Moselle
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #28 le: Jeudi 06 Mai 2021, 18:12:40 pm »
  • Sur le système de  Milker Ulucay , c'est le code qui gère la fin de course pour pas que le support de la  barre vienne en butée sur l'axe du moteur ou la poulie ?
    Gottlieb Diamond Lady | Gottlieb Génésis | Williams Aces & Kings | Séga Blast City | Occulus Rift

    Hors ligne Little_Rabbit

    • ✌(◕‿◕)✌ Donateur 2021
    • Staff
    • Dieu de l' Arcade
    • *****
    • Messages: 6104
    • Localisation: Nantes
    • The early 80's : the arcade golden age !!
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #29 le: Jeudi 06 Mai 2021, 18:54:12 pm »
  • Salut,

    En Googlant rapidement, je suis tombé sur cette vidéo intéressante de WIP car on voit dans le détail comment est foutu le système de poulies et entraînement de la barre sur l'original Taito (avec un bel accent Québécois en prime :) ):


    (par contre, il bouge tellement sa caméra dans tous les sens que ça peut limite donner la gerbe à la longue ! :-\)

    Et si j'ai bien compris, il utilise du tube de lave-glace en guise de courroie !  :o

    @berunours : que penses-tu prendre pour la barre télescopique sur laquelle la bille roule ?

    A+
    Recherche bornes dédiées ou PCB originaux: Miss Pacman, Dig Dug, Galaga, Mappy, Asteroids, Battlezone, Missile Command, Tempest, Star Wars, Donkey Kong (+ Jr), Mario Bros, Moon Patrol, Defender, Joust, Frogger, Gyruss, Pooyan, Space Tactics, Zaxxon, etc. Flip : Gottlieb des années 80 (Spirit, Amazon Hunt, ...), Baby Pac Man. Divers :  Ice Cold Beer
    Trois fois rien quoi ! :D

    Hors ligne berunours

    • Serial Bartopeur
    • Passionné
    • *
    • Messages: 156
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #30 le: Jeudi 06 Mai 2021, 21:17:49 pm »
  • Sur le système de  Milker Ulucay , c'est le code qui gère la fin de course pour pas que le support de la  barre vienne en butée sur l'axe du moteur ou la poulie ?
    Pour le haut, oui surement, avec les moteurs pas à pas, tu peux savoir précisément de combien ils se sont déplacés.
    Par contre, tu dois forcément (selon moi) avoir une info de l'origine (ou d'un repère quelconque) quelque part. Je ne sais pas trop comment il fait :/

    EDIT:
    Il y a bien 2 capteur en bas pour la position "origine" des barres:



    Salut,

    En Googlant rapidement, je suis tombé sur cette vidéo intéressante de WIP car on voit dans le détail comment est foutu le système de poulies et entraînement de la barre sur l'original Taito (avec un bel accent Québécois en prime :) ):

    youtube.com/watch?v=3SlB4BfR14s

    (par contre, il bouge tellement sa caméra dans tous les sens que ça peut limite donner la gerbe à la longue ! :-\)

    Et si j'ai bien compris, il utilise du tube de lave-glace en guise de courroie !  :o

    @berunours : que penses-tu prendre pour la barre télescopique sur laquelle la bille roule ?

    A+

    J'ai épluché toutes ses vidéos sur la ICB, idem pour la Hangon d'ailleurs... J'ai hate de vois la suite de sa Space harrier.

    Je n'ai pas trop encore réfléchi à la barre sur laquelle la bille roule. J'pensais à la base avoir du bol en trouvant une barre pleine de 6mm qui rentrerai pile poil dans un tube creux de 8mm. J'ai même envisager prendre des mini tringles a rideau télescopique qui se fixent sur les fenêtre PVC  ;D

    Ce que je trouve génial justement avec le système de Milker Ulucay, c'est quelle n'a pas besoin d'être télescopique.
    En fixant la barre directement sur les courroies, on a suffisamment de jeu pour éviter d'avoir a gérer la longueur de la barre.
    Et vue qu'on utilise des stepper motor (pas à pas), on peut limiter leur différence de hauteur (par le code) et éviter d'avoir une barre avec 2 point de fixation trop loin.

    D'ailleurs, voila ces petits machins tout mignons et qui vont surement bien m'embêter ce week-end avant que j'arrive à les faire fonctionner correctement ...



    « Modifié: Jeudi 06 Mai 2021, 21:21:43 pm par berunours »

    Hors ligne berunours

    • Serial Bartopeur
    • Passionné
    • *
    • Messages: 156
      • Voir le profil
    Ice cold beer mini à l'étude
    « Réponse #31 le: Dimanche 16 Mai 2021, 17:43:38 pm »
  • Mise a jour:

    J'ai fini par me motiver à intégrer les moteurs...
    Pour l'instant 1 seul avec un A4988 pour le driver et un contacteur fin de course pour la position basse. Le tout sera doublé prochainement.

    Petite vidéo de mon taf d'aujourd'hui:


    Niveau code, c'est un peu chiant... Je vais devoir jongler au niveau du delay de ma boucle principale.
    En gros, j'ai normalement un delay (une pause) de 50 millisecondes dans ma boucle principale afin d'éviter d'avoir un truc ultra speed qui finisse par merdouiller.
    Maintenant, quand un moteur bougera, je devrais le faire sauter afin d'avoir des mouvement smouth des moteur (éviter les à-coups).
    Ca va m'obliger à faire plein de calculs avec des microsecondes / millisecondes le tout en fonction de la latence choisie pour le programe.
    Du coup, comme c'est l'heure de l'apéro, je mets ça de côté.

    L'état actuel du code (un peu brut au niveau du moteur):

    //-------------- LIBRAIRIES ----------------------//****************************************************************

    #include <SevenSegmentAsciiMap.h>       //
    #include <SevenSegmentExtended.h>       // Librairies pour les afficheurs 4 digits 7 segments
    #include <SevenSegmentTM1637.h>         //

    #include "Arduino.h"                    //
    #include "SoftwareSerial.h"             // Librairies Dfmini
    #include "DFRobotDFPlayerMini.h"        //

    #include <Adafruit_NeoPixel.h>          // Librairie pour les leds


    //-------------- DECLARATION MATOS ---------------//****************************************************************

    SevenSegmentTM1637    TM1(24, 22);  //afficheur du BAS déclaration     -- CLK 24 -- DIO 22 --
    SevenSegmentTM1637    TM2(28, 26);  //afficheur du CENTRE déclaration  -- CLK 28 -- DIO 26 --
    SevenSegmentTM1637    TM3(32, 30);  //afficheur du HAUT déclaration    -- CLK 32 -- DIO 30 --

    Adafruit_NeoPixel STRIP(8, 34, NEO_GRBW + NEO_KHZ800);   // Bande led déclaration -- NBR LED 8 -- DIO 34 --

    SoftwareSerial mySoftwareSerial(13, 12);     // Dfmini déclaration -- RX 12 -- TX 13 -- DOIVENT ETRES PWR
    DFRobotDFPlayerMini myDFPlayer;              //
    void printDetail(uint8_t type, int value);   //

    //------------- DECLARATION VARIAVLES -------------//***************************************************************

    int Latence = 50;                             // Pour gérer le delay de l'arduino (multiple de 50 sinon ce sera la merde !!!!!)
    int TempAFF = 0;                              // Temporaire pour les Afficheurs
    int TempLED = 0;                              // Temporaire pour les Leds
    int TempLEDBRILL = 0; int TempLEDBRILLAD = 0; // Tempoiraire scintillement Leds
    int TempBONUS = 0;                            // Tempoiraire décompte bonus

    int Highscore = 0;                            // Highscore
    int Bille = 0;                                // Bille on bar
    int Etape = 0;                                // Trou demandé
    int Bonus = 0;                                // Variable bonus
    int Score = 0;                                // variable Score

    int BTNcredit = 0;                            // Bouton Credit                   

    const int stepPinMotor1 = 5;                  // Step Moteur 1 -- PIN 5 --
    const int dirPinMotor1 = 4;                   // Direction Moteur 1 -- PIN 4 --
    int Motor1Bouge = 0;

    int Amode = 1;        // Boucle ATTRACK MODE
    int Debutpartie = 0;  // Initialisation de la partie après le crédit
    int Initbarre = 0;    // Initialisation Bonus et partie
    int DescenteBarre = 0;// Pour que les barres aillent chercher une nouvelle bille
    int MonteBarre = 0;   // Pour que les barres remonteent
    int Principale = 0;   // Boucle principale avec bougeage des barres, bonus qui descent, billes qui passent dans un trou etc...
    int Trou = 0;         // Trou dans laquelle est tombé la Bille
    int BonTrou = 0;      // Boucle Bille dans le bon trou
    int BadTrou = 0;      // Boucle Bille dans le mauvais trou
    int Gameover = 0;     // Boucle Gamover


    void setup() {

        TM1.begin(); TM1.setPrintDelay(500); TM1.clear();                         // Afficheur du BAS initialisation (début / brightness / RAZ)
        TM2.begin(); TM2.setPrintDelay(500); TM2.clear();                         // Afficheur du CENTRE initialisation
        TM3.begin(); TM3.setPrintDelay(500); TM3.clear();                         // Afficheur du HAUT initialisation

        STRIP.begin(); STRIP.clear(); STRIP.show(); STRIP.setBrightness(30);      // Bande led initialisation (début, clear + affichage, brightness)

        mySoftwareSerial.begin(9600); Serial.begin(115200);                       // Dfmini comm serie
        !myDFPlayer.begin(mySoftwareSerial);                                      // Dfmini initialisation
        myDFPlayer.volume(15);                                                    // Dfmini volume (0~30)
       
        pinMode (36, INPUT_PULLUP);                                               // Bouton Crédit en PULLUP -- PIN 36 --

        pinMode(stepPinMotor1,OUTPUT);                                            // Step Moteur 1
        pinMode(dirPinMotor1,OUTPUT);                                             // Direction Moteur 1
        pinMode (38, INPUT_PULLUP);                                               // Fin de course bas Moteur 1 -- PIN 38 --

        pinMode(23, INPUT);    // Mauvais Trou
        pinMode(43, INPUT);    // Trou 1
        pinMode(41, INPUT);    // Trou 2
        pinMode(39, INPUT);    // Trou 3
        pinMode(37, INPUT);    // Trou 4
        pinMode(35, INPUT);    // Trou 5
        pinMode(33, INPUT);    // Trou 6
        pinMode(31, INPUT);    // Trou 7
        pinMode(29, INPUT);    // Trou 8
        pinMode(27, INPUT);    // Trou 9
        pinMode(25, INPUT);    // Trou 10


    Serial.begin(9600);    //Pour la console

    }

    void loop() {

    if (Motor1Bouge == 0) {delay(Latence);}      // millisecondes de mise a jour de la boucle si moteurs immobiles


    //--------------------------------------------------- ATTRACK MODE -------------------------------------------------
      if (Amode == 1){ 
         
         BTNcredit = digitalRead(36);                                                                   // Verif si boutton coin est appuyé
              if (BTNcredit == LOW) { Amode =  0; Debutpartie = 1; Etape = 1;                           // Sortie d'Attrack mode et Debut de Partie
                                      myDFPlayer.playMp3Folder(6);                                      // Dfmini SON pièce qui tombe
                                      delay(1000);                                                      //
                                      TM1.clear(); TM2.clear();TM3.clear();                             // On efface les Afficheurs
                                      STRIP.clear(); STRIP.show(); STRIP.setBrightness(30);             // RAZ valeurs Bandes LEDs
                                      TempLEDBRILL = 0; TempLEDBRILLAD = 5; TempAFF = 0; TempLED = 0;}  // RAZ Valeurs Tempo   

         
         TempAFF++; int TempAFF2 = TempAFF * Latence;
            switch (TempAFF2) {                                                // Faire defiler text ecran du bas
              case (1000): TM1.clear(); TM1.print("PLAY"); break;
              case (2000): TM1.clear(); TM1.print("ICE"); break;
              case (3000): TM1.clear(); TM1.print("COLD"); break;
              case (4000): TM1.clear(); TM1.print("BEER"); break;
              case (5000): TM1.clear(); break;
              case (6000): TM1.clear(); TM1.setCursor(1, DECALAGE (Highscore)); TM1.print(Highscore); TempAFF = 0;  break;}
               
         TempLED++; 
             if ( TempLED <= 10 ) { STRIP.setBrightness(60);STRIP.setPixelColor(TempLED, 240, 240, 20); STRIP.setPixelColor(TempLED-1, 130, 130, 50);  STRIP.show();}
             if ( TempLED > 10 && TempLED <= 20 ){ STRIP.setPixelColor(TempLED-12, 0, 0, 0);  STRIP.show(); }
             if ( TempLED > 20 && TempLED <= 30 ){ STRIP.setPixelColor(TempLED-20, 240, 240, 20); STRIP.setPixelColor(TempLED-21, 130, 130, 50); STRIP.setPixelColor(TempLED-22, 0, 0, 0);  STRIP.show(); }
             if ( TempLED >= 30 && TempLED <= 40 ){ STRIP.setPixelColor(TempLED-32, 130, 130, 50);  STRIP.show();}
             if ( TempLED >= 50 && TempLED <= 60 ){ STRIP.setPixelColor(TempLED-52, 0, 0, 0);  STRIP.show(); }
             if ( TempLED == 60 ){ for (int i= 0; i<8; i++ ) {TempLEDBRILL = 20; STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(i, 230, 230 ,230);  STRIP.show(); TempLEDBRILLAD=10;}}
             if ( TempLED > 60 && TempLED <=180) {TempLEDBRILL = TempLEDBRILL + TempLEDBRILLAD ; STRIP.setBrightness(TempLEDBRILL);  STRIP.show(); if (TempLEDBRILL >70 || TempLEDBRILL < 20){TempLEDBRILLAD=-TempLEDBRILLAD;} }
             if ( TempLED == 180 ){ for (int i= 0; i<8; i++ ) {TempLEDBRILL = 20; STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(i, 0, 0 ,0);  STRIP.show();}}
             if (TempLED >= 200) { TempLED=0;}


      } //----- FIN DE ATTRACK MODE

    //--------------------------------------------------- DEBUT DE PARTIE ---------------------------------
      if (Debutpartie == 1){ Bille++; Debutpartie =0; Initbarre = 1;                         // Sortie Debut de Partie vers Initialisation des barres
                             TM3.clear(); TM3.print(Bille);                                             // Affichage Bille on barre
                             STRIP.clear();STRIP.setPixelColor(Etape-1, 240, 240, 20);STRIP.show();}    // Allumage LED trou demandé

    //----------------------------------------- INITIALISATION DES BARRES ET BONUS ------------------------
     
      if (Initbarre ==1){ Bonus = Etape *100; TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);  // Affichage Bonus
                          TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score);                      // Affichage Score
                          Initbarre = 0; DescenteBarre = 1; TempBONUS = 0;}                                       // Sortie Initialisation barres vers DescenteBarre

    //-------------------------------------------------- DESCENTE DES BARRES ------------------------------
      if (DescenteBarre ==1){
              digitalWrite(dirPinMotor1,HIGH);                                            // Direction Moteur 1 vers le bas
              int ConFinDeCourse1 = digitalRead(38);                                      // Lecteur Contacteur Fin de course Moteur 1
                 if (ConFinDeCourse1 == HIGH) {
                          Motor1Bouge = 1;                                                // Pour faire sauter le delais de la boucle principale
                          digitalWrite(stepPinMotor1,HIGH);
                          delayMicroseconds(500);
                          digitalWrite(stepPinMotor1,LOW);
                          delayMicroseconds(500); }               

                         
                  if (ConFinDeCourse1 == LOW) {
                          Motor1Bouge = 0;               
                          myDFPlayer.playMp3Folder(1);                                    // Dfmini SON Debut de partie   
                          DescenteBarre = 0; MonteBarre = 1;}}                            // Sortie DescenteBarre barres vers MonteBarre

    //-------------------------------------------------- MONTE DES BARRES ------------------------------
      if (MonteBarre ==1){
               digitalWrite(dirPinMotor1,LOW);                                           // Direction Moteur 1 vers le bas
                          for (int i = 0 ; i < 3000; i++) {
                            digitalWrite(stepPinMotor1,HIGH);
                            delayMicroseconds(700);
                            digitalWrite(stepPinMotor1,LOW);
                            delayMicroseconds(700); }   
                         
                          MonteBarre = 0; Principale = 1;}                               // Sortie MonteBarre barres vers Principale

    //----------------------------------------------------BOUCLE PRINCIPALE--------------------------------

    if (Principale == 1) { delay(Latence);  // Delais (latence voulu)
           
            TempBONUS++; if (TempBONUS > (2000/Latence) && Bonus > 0) {Bonus = Bonus - 10;              // Décompte Bonus
                             myDFPlayer.playMp3Folder(5);                                               // Dfmini Bonus -10
                             TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);         //
                             TempBONUS = 0;}
                             //
            TempLEDBRILL = TempLEDBRILL + TempLEDBRILLAD;
            STRIP.setBrightness(TempLEDBRILL); STRIP.setPixelColor(Etape-1, 240, 240, 20); 
            STRIP.show();
                         if (TempLEDBRILL >70 ){TempLEDBRILLAD=-10;};
                         if (TempLEDBRILL <10 ){TempLEDBRILLAD= 10;}
           
            //-----Detection du Trou

         int Troudetect = 0; Trou=0;
             Troudetect = digitalRead(23); if (Troudetect == LOW){ Trou=20;}       // Mauvais Trou
             Troudetect = digitalRead(43); if (Troudetect == LOW){ Trou=1;}        // Trou 1
             Troudetect = digitalRead(41); if (Troudetect == LOW){ Trou=2;}        // Trou 2
             Troudetect = digitalRead(39); if (Troudetect == LOW){ Trou=3;}        // Trou 3
             Troudetect = digitalRead(37); if (Troudetect == LOW){ Trou=4;}        // Trou 4
             Troudetect = digitalRead(35); if (Troudetect == LOW){ Trou=5;}        // Trou 5
             Troudetect = digitalRead(33); if (Troudetect == LOW){ Trou=6;}        // Trou 6
             Troudetect = digitalRead(31); if (Troudetect == LOW){ Trou=7;}        // Trou 7
             Troudetect = digitalRead(29); if (Troudetect == LOW){ Trou=8;}        // Trou 8
             Troudetect = digitalRead(27); if (Troudetect == LOW){ Trou=9;}        // Trou 9
             Troudetect = digitalRead(25); if (Troudetect == LOW){ Trou=10;}       // Trou 10
         
         if (Trou != 0 && Trou == Etape) { BonTrou =1 ; Principale = 0 ;}          // Bille tombé dans le Bon Trou      :D
         if (Trou != 0 && Trou != Etape) { BadTrou =1 ; Principale = 0 ;}          // Bille tombé dans le Mauvais Trou  :(


       
    } //----- FIN DE BOUCLE PRINCIPALE

    //----------------------------------------------------------BON Trou-----------------------------------
      if (BonTrou == 1) {
                   myDFPlayer.playMp3Folder(3);                                             // Dfmini SON Bon trou
                   TM2.blink(); TempBONUS = Bonus/10;
                   for ( int i=0; i < TempBONUS; i++){                                      // Décompte du bonus
                       Bonus= Bonus -10; Score = Score +10;
                       myDFPlayer.playMp3Folder(4); delay (200- (i));                     // Dfmini SON Bonus decompte         
                       TM2.clear(); TM2.setCursor(1, DECALAGE (Bonus)); TM2.print(Bonus);   // Affichage Bonus
                       TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score);}  // Affichage Score
                   
                   Etape++; if (Etape > 10) {Etape=1;} BonTrou =0; Initbarre =1;TM1.blink();STRIP.clear();STRIP.show();}  // Retour Initialisation barre
     
    //--------------------------------------------------------MAUVAIS Trou----------------------------------
      if (BadTrou == 1){
              for (int i= 0; i<10; i++ ) {STRIP.setPixelColor(i, 230, 0 ,0);  STRIP.show();}                     // LEDS en Rouge
                 TM3.clear(); TM3.print("-"); TM2.clear(); TM2.print("----"); TM1.clear(); TM1.print("OUPS");    // OUPS Message
                 myDFPlayer.playMp3Folder(9);                                                                    // Dfmini SON Mauvais trou
                 delay (3000);                                                                                   
              if (Bille == 3) { Gameover = 1;}                                                                   // Verif si GAME OVER
              Debutpartie = 1; BadTrou = 0;}                                                                     // Retour debut de partie

    //----------------------------------------------------------GAME OVER------------------------------------
      if (Gameover == 1) { myDFPlayer.playMp3Folder(8);                                                          // Dfmini SON GAME OVER
                 TM1.clear(); TM2.clear(); TM3.clear();
                 TM1.print("    GAME OVER   YOUR Score   ");
                 TM1.clear(); TM1.setCursor(1, DECALAGE (Score)); TM1.print(Score); delay (500);
                 TM2.blink(); delay (1000); TM1.clear();
            if ( Score > Highscore) { Highscore = Score;
                  TM1.clear(); TM1.print(" NEW"); TM1.blink(); TM1.print("HIGH"); TM1.blink(); TM1.print("SCOR"); TM1.blink(); TM1.clear();}
         Amode = 1; Gameover = 0; Debutpartie = 0; Bille = 0; Etape = 0; Score = 0;}

      int ConFinDeCourse1 = digitalRead(38);
    Serial.println (ConFinDeCourse1);
    //printDetail(myDFPlayer.readType(), myDFPlayer.read());

    }//----- FIN LOOP




    // Fonction pour trouver decalage des afficheurs *******************

    int DECALAGE (int Adecaler) {         
        int Decal = 0;
        if ( Adecaler <1000){Decal = 1;}
        if ( Adecaler <100){Decal = 2;}
        if ( Adecaler <10){Decal = 3;}
        return Decal;       
    }

    // Fonction Comm Dfmini ************************ *******************

    void printDetail(uint8_t type, int value){
      switch (type) {
        case TimeOut: Serial.println(F("Time Out!")); break;
        case WrongStack: Serial.println(F("Stack Wrong!")); break;
        case DFPlayerCardInserted: Serial.println(F("Card Inserted!")); break;
        case DFPlayerCardRemoved: Serial.println(F("Card Removed!")); break;
        case DFPlayerCardOnline: Serial.println(F("Card Online!")); break;
        case DFPlayerUSBInserted: Serial.println("USB Inserted!"); break;
        case DFPlayerUSBRemoved: Serial.println("USB Removed!"); break;
        case DFPlayerPlayFinished: Serial.print(F("Number:")); Serial.print(value); Serial.println(F(" Play Finished!")); break;
        case DFPlayerError: Serial.print(F("DFPlayerError:"));
        switch (value) {
            case Busy: Serial.println(F("Card not found")); break;
            case Sleeping: Serial.println(F("Sleeping")); break;
            case SerialWrongStack: Serial.println(F("Get Wrong Stack")); break;
            case CheckSumNotMatch: Serial.println(F("Check Sum Not Match")); break;
            case FileIndexOut: Serial.println(F("File Index Out of Bound")); break;
            case FileMismatch: Serial.println(F("Cannot Find File")); break;
            case Advertise: Serial.println(F("In Advertise")); break;
            default: break;
         }
          break; default: break;
      }
    }

    Voilà, ça avance doucement... Je vous tient au courant de la suite. Bisous