Pong 2D avec son en Erreur

Bonjour a tous j'ai un projet en cours et je me trouve embêter. On veut faire un Pong 2D (ca sa fonctionne) mais avec un son lue a chaque fois qu'un joueur renvoie la balle.

J'ai dons une carte micro sd de marque AZ-Delivery et un Arduino UNO

la borne CS est sur le pin 10
le Speaker sur le 6

mais j'ai toujours des erreurs lors de la compilation

Je vous mais le code dessous, je suis tous nouveau en Arduino et je comprend pas trop j'ai donc pris plusieurs code et j'ai fait ma sauce

Merci d' avance a tous ce qui prendrons le temps de lire



/*
   NDG
*/
//Libraries
#include <FastLED.h>
#include <SD.h>
#include <TMRpcm.h>
//Constants
#define SD_ChipSelectPin 10//4 
//Variables
unsigned long previousTime = 0;
unsigned long interval = 1000;
//Objects
TMRpcm tmrpcm;

// Definition des couleurs
const CRGB NOIR  = CRGB(0,   0,   0  );
const CRGB BLANC = CRGB(255, 255, 255);
const CRGB ROUGE = CRGB(255, 0,   0  );
const CRGB VERT  = CRGB(0,   255, 0  );
const CRGB BLEU  = CRGB(0,   0,   255);
const CRGB JAUNE = CRGB(255, 255, 0  );
const CRGB ROSE  = CRGB(255, 0,   255);
const CRGB CYAN  = CRGB(0,   255, 255);



// Definition des notes de musique
char* file1 = "1.wav";
char* file2 = "2.wav";


/******************************
   PARAMETRES DE BRANCHEMENTS
 ******************************/

const int LED_PIN = 8;            // Numero de branchement de la bande de LEDs
const int BUTTON1_PIN = 3;       // Numero de branchement du premier bouton
const int BUTTON2_PIN = 2;      // Numero de branchement du deuxieme bouton
const int speakerPin = 6;      // Numero de branchement du haut parleur (optionnel)

/******************************
   PARAMETRES GENERAUX DU JEU
 ******************************/
const int   NUM_LEDS = 58 ;        // Nombre de LEDs sur la bande
const float SPEED = 0.7;          // Vitesse de la balle
const float ACCELERATION = 5;    // Accelleration de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir
const int   HIT_ZONE = 10;      // Nombre de LED pendant lesquelles on peut renvoyer la balle
const int   MAX_SCORE = 6;

const CRGB  PLAYER1_COLOR = ROSE;    // Couleur player 1
const CRGB  PLAYER2_COLOR = VERT;    // Couleur player 2
const CRGB  BALL_COLOR = ROUGE;      // Couleur de la balle


// LEDs
CRGB leds[NUM_LEDS];

// Players
enum Player
{
  PERSONNE,
  PLAYER1,
  PLAYER2
};

// Etats du jeu
enum GameState
{
  START,
  GAME
};
GameState gameState = START;


// Fonctions de fonctionnement du jeu

// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2
void ledColor(Player player, int pos, CRGB color)
{
  if (player == PLAYER1)
  {
    leds[pos] = color;
  }
  else // player == PLAYER2
  {
    leds[NUM_LEDS - pos - 1] = color;
  }
}

// Fonction permettant de changer la couleur d'une LED
void ledColor(int pos, CRGB color)
{
  leds[pos] = color;
}

// Variables de fonctionnement du jeu
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton
float ballSpeed = SPEED;  // Vitesse de la balle
float ballPosition = 1; // Position de la balle sur la bande de led (Si ballPosition = 0, la balle est devant le player 1. Si ballPosition = 1, la balle est devant le player 2)
int player1Score = 0;   // Score du player 1
int player2Score = 0;   // Score du player 2
Player lastWinner = PERSONNE;

unsigned long lastMillis = 0;
unsigned long gameBegin = 0;
unsigned int counter = 0;


// Fonction servant à afficher les scores
void showScore()
{
  // On commence par effacer toutes les couleurs de led
  FastLED.clear();

  // On allume le nombre de led correspondant au score du player 1
  for (int i = 0; i < player1Score; i++)
  {
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);
  }

  // On allume le nombre de led correspondant au score du player 2
  for (int i = 0; i < player2Score; i++)
  {
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);
  }

  // On envoie les nouvelles couleurs a la bande de led
  FastLED.show();

  // On fait clignotter trois fois
  if (lastWinner == PLAYER1)
  {
    for (int i = 0; i < 3; i++)
    {
      // On eteint la derniere LED pendant 0.5s
      delay(500);
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);
      FastLED.show();

      // On allume la derniere LED pendant 0.5s
      delay(500);
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);
      FastLED.show();
    }
  }
  else // lastWinner == PLAYER2
  {
    for (int i = 0; i < 3; i++)
    {
      // On eteint la derniere LED pendant 0.5s
      delay(500);
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);
      FastLED.show();

      // On allume la derniere LED pendant 0.5s
      delay(500);
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);
      FastLED.show();
    }
  }

  // Si la partie est terminée on va a l'affichage de fin
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)
  {
    gameState = START;

    // On reinitialise les scores
    player1Score = 0;
    player2Score = 0;

    // On reinitialise la vitesse
    ballSpeed = SPEED;

    // On reinitialise les leds
    FastLED.clear();
  }
  // Sinon on reprend le jeu
  else
  {
    gameState = GAME;
    ballSpeed = SPEED;
  }
}



/****************************************************************
   Cette fonction s'execute une fois lorsque la carte s'allume.
 ****************************************************************/
void setup() {
 /* function setup */
 Serial.begin(9600);
 //Init sd shield
 if (!SD.begin(SD_ChipSelectPin)) {
   Serial.println("SD fail");
   return;
 }
 //Init speaker
 tmrpcm.speakerPin = speakerPin;
 tmrpcm.setVolume(9);
}
void loop() {
 /* function loop */
 if (millis() - previousTime > interval) {
   activateOutput();
   previousTime = millis();
 }
}
void setup() {
  Serial.begin(115200);
  // Initialisation des LEDs
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);

  // Initialisations des boutons
  pinMode(BUTTON1_PIN, INPUT_PULLUP);
  pinMode(BUTTON2_PIN, INPUT_PULLUP);

  // Initialisation du haut parleur
  

  // COULEUR DES LEDS EN DEBUT DE PARTIE
  FastLED.clear();
  // Couleurs player 1
  ledColor(PLAYER1, 0, PLAYER1_COLOR);
  ledColor(PLAYER1, 1, PLAYER1_COLOR);
  ledColor(PLAYER1, 2, PLAYER1_COLOR);
  ledColor(PLAYER1, 3, PLAYER1_COLOR);
  ledColor(PLAYER1, 4, PLAYER1_COLOR);

  // Couleurs player 2
  ledColor(PLAYER2, 0, PLAYER2_COLOR);
  ledColor(PLAYER2, 1, PLAYER2_COLOR);
  ledColor(PLAYER2, 2, PLAYER2_COLOR);
  ledColor(PLAYER2, 3, PLAYER2_COLOR);
  ledColor(PLAYER2, 4, PLAYER2_COLOR);

  // On envoie les changements a la bande de leds
  FastLED.show();
}

/*************************************************************
   Cette fonction s'execute en continue tout au long du jeu.
 *************************************************************/
void loop() {

  switch (gameState)
  {
    case START:
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur
      if (lastWinner == PLAYER1)
      {
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);
        FastLED.show();
      }
      else if (lastWinner == PLAYER2)
      {
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);
        FastLED.show();
      }

      // On regarde si un des boutons est appuye
      if (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW)
      {
        // La partie commence
        gameState = GAME;

        // Initialisation de la varable lastMillis
        lastMillis = millis();

        // Initialisation du temps de début de jeu
        gameBegin = millis();
      }
      break;

    case GAME:
      // Calcul du temps ecoule entre deux boucles
      unsigned long currentMillis = millis();

      // On calcule le numero de la LED allumee
      int ballLed = int(ballPosition * NUM_LEDS);

      // On s'assure que la position de la balle ne dépasse pas la taille de la bande de LED
      ballLed = min(ballLed, NUM_LEDS - 1);

      // On regarde qui est en train de jouer
      if (player == PLAYER1)
      {
        // On regarde si le player a appuye sur son bouton et si le délai de début de jeu est passé
        if (digitalRead(BUTTON1_PIN) == LOW && currentMillis - gameBegin > 500)
        {
          // Si la balle est hors de la zone de tir, l'autre player marque un point
          if (ballLed >= HIT_ZONE)
          {
            player2Score += 1;
            lastWinner = PLAYER2;
            ballPosition = 0;

            // On passe en mode affichage des scores
            showScore();

            // C'est a l'autre player de jouer
            player = PLAYER2;

            // Actualisation de la variable lastMillis
            lastMillis = millis();
          }
          else
          {
            // On accelere la balle
            ballSpeed *= 1.0 + ACCELERATION / 100;

            // C'est a l'autre player de jouer
            player = PLAYER2;

            // On joue la note de musique
            void activateOutput() {
           /* function activateOutput */
           Serial.println("Play sound");
           tmrpcm.play(file1);
           while (tmrpcm.isPlaying()) {} //wait until file is played
           //delay(1000);tmrpcm.stopPlayback(); // or wait 1sec and stop music
        }   
            }
            
            break;
        }

        // On fait avancer la balle
        ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;

        // On regarde si la balle est sortie de la zone
        if (ballPosition < 0.0f)
        {
          // Si oui le player 2 marque un point
          player2Score += 1;
          lastWinner = PLAYER2;
          ballPosition = 0;

          // On passe en mode affichage des scores
          showScore();

          // C'est a l'autre player de jouer
          player = PLAYER2;

          // Actualisation de la variable lastMillis
          lastMillis = millis();
          break;
        }
      }
      else // player == PLAYER2
      {
        // On regarde si le player a appuye sur son bouton et si le délai de début de jeu est passé
        if (digitalRead(BUTTON2_PIN) == LOW && currentMillis - gameBegin > 500)
        {
          // Si la balle est hors de la zone de tir, l'autre player marque un point
          if (ballLed < NUM_LEDS - HIT_ZONE)
          {
            player1Score += 1;
            lastWinner = PLAYER1;
            ballPosition = 1;

            // On passe en mode affichage des scores
            showScore();

            // C'est a l'autre player de jouer
            player = PLAYER1;

            // Actualisation de la variable lastMillis
            lastMillis = millis();
          }
          else
          {
            // On accelere la balle
            ballSpeed *= 1.1;

            // C'est a l'autre player de jouer
            player = PLAYER1;

            // On joue la note de musique
             void activateOutput() {
            /* function activateOutput */
             Serial.println("Play sound");
             tmrpcm.play(file2);
             while (tmrpcm.isPlaying()) {} //wait until file is played
             //delay(1000);tmrpcm.stopPlayback(); // or wait 1sec and stop music
          }
          
          }

          break;
        }

        // On fait avancer la balle dans l'autre sens
        ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;

        // On regarde si la balle est sortie de la zone
        if (ballPosition >= 1)
        {
          // Si oui le player 1 marque un point
          player1Score += 1;
          lastWinner = PLAYER1;
          ballPosition = 1;

          // On passe en mode affichage des scores
          showScore();
          // C'est a l'autre player de jouer
          player = PLAYER1;

          // Actualisation de la variable lastMillis
          lastMillis = millis();
          break;
        }
      }

      ///// AFFICHAGE BANDE DE LEDs /////
      // Premierement on efface toutes les couleurs precedentes
      FastLED.clear();

      // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote
      for (int i = 0; i < HIT_ZONE; i++)
      {
        // On allume de chaque cote
        ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante
        ledColor(PLAYER2, i, PLAYER2_COLOR / 10);
      }

      // Ensuite on allume faiblement les LEDs correspondant aux scores
      // Pour le player 1
      for (int i = 0; i < player1Score; i++)
      {
        ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);
      }
      // Pour le player 2
      for (int i = 0; i < player2Score; i++)
      {
        ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);
      }

      // Ensuite on actualise la position de la balle
      // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non

      // Si la balle est dans le camp d'un des player, elle est rouge.
      if (ballLed < HIT_ZONE || ballLed >= NUM_LEDS - HIT_ZONE)
      {
        ledColor(ballLed, ROUGE);
      }
      // Si elle en est proche, elle est jaune
      else if (ballLed < 2 * HIT_ZONE || ballLed >= NUM_LEDS - 2 * HIT_ZONE)
      {
        ledColor(ballLed, JAUNE);
      }
      // Sinon la balle a sa couleur par defaut
      else
      {
        ledColor(ballLed, BALL_COLOR);
      }

      // On envoie la couleur des leds a la bande de leds
      FastLED.show();

      // On actualise la variable lastMillis pour la boucle suivante
      lastMillis = currentMillis;
      break;
  }
}

Amicalement Fred

Il nous faudrait les messages d'erreur du compilateur, ça aiderait. Tu peux les copier avec le bouton de l'IDE et les coller dans un message sur le forum

Arduino : 1.8.19 (Windows Store 1.8.57.0) (Windows 10), Carte : "Arduino Uno"

In file included from C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:7:0:

C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/FastLED.h:14:21: note: #pragma message: FastLED version 3.004.000

 #    pragma message "FastLED version 3.004.000"

                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:31:15: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

 char* file1 = "1.wav";

               ^~~~~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:32:15: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

 char* file2 = "2.wav";

               ^~~~~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino: In function 'void loop()':

D1-Pong_Pong_V6_Fred___SON_3:208:4: error: 'activateOutput' was not declared in this scope

    activateOutput();

    ^~~~~~~~~~~~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino: In function 'void setup()':

D1-Pong_Pong_V6_Fred___SON_3:212:6: error: redefinition of 'void setup()'

 void setup() {

      ^~~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:193:6: note: 'void setup()' previously defined here

 void setup() {

      ^~~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino: In function 'void loop()':

D1-Pong_Pong_V6_Fred___SON_3:247:6: error: redefinition of 'void loop()'

 void loop() {

      ^~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:205:6: note: 'void loop()' previously defined here

 void loop() {

      ^~~~

D1-Pong_Pong_V6_Fred___SON_3:319:35: error: a function-definition is not allowed here before '{' token

             void activateOutput() {

                                   ^

D1-Pong_Pong_V6_Fred___SON_3:383:36: error: a function-definition is not allowed here before '{' token

              void activateOutput() {

                                    ^

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:426:46: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

         ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante

                                              ^~

In file included from C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/controller.h:9:0,

                 from C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/FastLED.h:47,

                 from C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:7:

C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/pixeltypes.h:809:13: note: candidate 1: CRGB operator/(const CRGB&, uint8_t)

 inline CRGB operator/( const CRGB& p1, uint8_t d)

             ^~~~~~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:426:46: note: candidate 2: operator/(int, int) <built-in>

         ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante

                                              ^~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:427:46: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

         ledColor(PLAYER2, i, PLAYER2_COLOR / 10);

                                              ^~

In file included from C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/controller.h:9:0,

                 from C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/FastLED.h:47,

                 from C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:7:

C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/pixeltypes.h:809:13: note: candidate 1: CRGB operator/(const CRGB&, uint8_t)

 inline CRGB operator/( const CRGB& p1, uint8_t d)

             ^~~~~~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:427:46: note: candidate 2: operator/(int, int) <built-in>

         ledColor(PLAYER2, i, PLAYER2_COLOR / 10);

                                              ^~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:434:67: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

         ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);

                                                                   ^~

In file included from C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/controller.h:9:0,

                 from C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/FastLED.h:47,

                 from C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:7:

C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/pixeltypes.h:809:13: note: candidate 1: CRGB operator/(const CRGB&, uint8_t)

 inline CRGB operator/( const CRGB& p1, uint8_t d)

             ^~~~~~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:434:67: note: candidate 2: operator/(int, int) <built-in>

         ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);

                                                                   ^~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:439:67: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

         ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);

                                                                   ^~

In file included from C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/controller.h:9:0,

                 from C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/FastLED.h:47,

                 from C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:7:

C:\Users\djmel\Documents\Arduino\libraries\FastLED\src/pixeltypes.h:809:13: note: candidate 1: CRGB operator/(const CRGB&, uint8_t)

 inline CRGB operator/( const CRGB& p1, uint8_t d)

             ^~~~~~~~

C:\Users\djmel\Desktop\PONG ARDUINO\D1-Pong_Pong_V6_Fred___SON_3\D1-Pong_Pong_V6_Fred___SON_3.ino:439:67: note: candidate 2: operator/(int, int) <built-in>

         ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);

                                                                   ^~

exit status 1

'activateOutput' was not declared in this scope



Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

Voila l'erreur que j'ai

à remplacer par
const char* file1 = "1.wav";

On ne sait pas trop ce que tu as voulu faire, la fonction a été collée au milieu d'un autre code à partir de la ligne 317 puis encore à partir de la ligne 381.

Comme indiqué, tu as 2 fonction setup()

et aussi 2 fonctions loop()

Ce serait déjà bien de régler ces points là avant de voir les autres

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.