Aller au contenu


Photo
- - - - -

Interrompre un fichier audio en cours de lecture en fonction d'une variable


23 réponses à ce sujet

#1 paquito

paquito

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France

Posté 22 novembre 2021 - 08:51

Bonsoir à tous,

 

Etant débutant dans la programmation avec arduino, je vais essayer d'exposer le problème du projet le plus clairement possible, que je n'arrive pas à résoudre.

 

Le principe du code est de commander 12 fonctions pour un canal de récepteur de radiocommande avec un arduino nano sans modifier l'émetteur, à partir de 3 impulsions tout au plus sur le manche soit au maxi ou au mini, dans un temps variable dépendant du nombre de celles-ci afin augmenter la rapidité d’exécution.

 

A partir de ce code qui fonctionne correctement j'ai associé un lecteur de carte Micro SD SPI Reader Mémoire Lecteur Micro SD TF Memory Card Module Shield, j'arrive bien à écouter la mélodie choisie en fonction de la valeur d'un compteur, mais il faut j’attende que celle-ci soit terminée pour en sélectionner une autre, je souhaiterai pouvoir l'interrompre dès que mon compteur change de valeur.

 

Les 6 premières fonctions sont réalisées comme suivant :

 

-Fonction 1 : 1 impulsion courte du neutre vers le maxi

-Fonction 2 : 2 impulsions courtes du neutre vers le maxi

-Fonction 3 : 3 impulsions courtes du neutre vers le maxi

-Fonction 4 : 1 impulsions courte du neutre vers le mini

-Fonction 5 : 2 impulsions courtes du neutre vers le mini

-Fonction 6 : 3 impulsions courtes du neutre vers le mini

 

Note : une impulsion courte étant inférieure à 1 seconde

 

 

Les 6 dernières sont réalisées comme suivant :

 

-Fonction 7 :1 impulsion longue du neutre vers le maxi

-Fonction 8 : 2 impulsions dont 1 longue et 1 courte du neutre vers le maxi

-Fonction 9 : 3 impulsions dont 1 longue et 2 courtes du neutre vers le maxi

-Fonction 10 :1 impulsion longue du neutre vers le mini

-Fonction 11 : 2 impulsions dont 1 longue et 1 courte du neutre vers le mini

-Fonction 12 : 3 impulsions dont 1 longue et 2 courtes du neutre vers le mini

 

Note : une impulsion longue étant supérieure à 1 seconde et inférieure à 1,5 seconde

L'ordre de « position » de l'impulsion longue est indifférente

 

Le code est le suivant:

 

//DEFINITION DES VARIABLES


// Le canal 3 Manche côté droit de la RC Graupner à fond en BAS ( mini) et à fond en HAUT (maxi)


int Signal_Canal_3 = 2;      // Signal du récepteur du canal 3 Broche D2
int Duree_Signal_Canal_3;     // Durée du signal du canal 3 en microseconde  ( pour visualiser le temps mini et temps maxi sur le moniteur série)


int Valeur_Signal_Canal_3;    // Valeur de la durée du signal du canal 3 convertie en pourcentage ( pour commander les relais)


int Temps_Mini_3 = 1070;         // Durée mini de l'impulsion du signal en microseconde ( manche au mini)   ( pour débugger)
int Temps_Maxi_3 = 1870;         // Durée maxi de l'impulsion du signal en microseconde ( manche au maxi)   ( pour débugger)


//on définit les temporisations
int Tempo_Cycle_Impulsions = 0; // Temporisation du cycle d'impulsions sur le manche du canal 3
int Tempo_Impulsion_Longue = 0; // Temporisation de l'impulsion longue sur le manche du canal 3


int Temps_Tempo_Cycle_Impulsions = 0; // Temps de validation de la temporisation du cycle d'impulsions sur le manche du canal 3


//on définit les mémoires utilisées
int Memoire_Impulsion_Longue = 0; // Mémoire d'activation de l'impulsion longue
int Memoire_Valeur_Haute_Canal_3 = 0; // Mémoire de la valeur haute du signal du canal 3 ( +5 volts pour éviter de compter des impulsions lors du maintien du manche en position maxi ou mini)
int Memoire_Bruitage = 0; // Mémoire de la mélodie à écouter


// On définit le compteur d'impulsion du canal 3
int Compteur_Impulsions = 0;


// On définit la variable du temps actuel en ms
unsigned long Temps;


// On définit la variable du temps de départ en ms pour mémoriser le temps écoulé depuis l'activation de la temporisation de cycle d'impulsions
unsigned long Temps_Depart_Tempo_Cycle_Impulsions;


// On définit la variable du temps de départ en ms pour mémoriser le temps écoulé depuis l'activation de la temporisation de l'impulsion longue
unsigned long Temps_Depart_Tempo_Impulsion_Longue;


//on définit les librairies utilisées
#include <SPI.h>// Pour la communication avec la carte SD 
#include <SD.h>  //  Inclure la librairie SD
#include <TMRpcm.h> // bibliothèque de mélodie


TMRpcm tmrpcm;


// on définit la broche du CS du lecteur de carte SD (shield SD)
#define SDPIN 10


void setup()
{
  Serial.begin(9600);  // Vitesse de transmission


  if (!SD.begin(SDPIN)) // On initialise du lecteur de carte micro SD
  {
    Serial.println("initialisation ratée!");
    return;
  }
  tmrpcm.speakerPin = 9; // Speaker sur la broche 9
  tmrpcm.setVolume(5);// On définit la gestion du volume 0 à 7
  tmrpcm.quality(1); // qualité audio 0 ou 1


}


void loop()
{
  // ACQUISITION ET TRAITEMENT DU SIGNAL DU CANAL 3 DE L'EMETTEUR RC


  // On Mesure la durée du signal canal 3
  Duree_Signal_Canal_3 = pulseIn(Signal_Canal_3, HIGH);


  // On Convertit la durée du signal du canal 3 en pourcentage ( -100% = au manche mini, +100% = au manche maxi, le neutre étant à 0%)
  Valeur_Signal_Canal_3 = map(Duree_Signal_Canal_3, Temps_Mini_3, Temps_Maxi_3, -100, 100);


  // Si le signal du canal 3 n'est pas dans la plage de temps ( mini ou maxi) avec une tolérance
  if ( Duree_Signal_Canal_3 <= 1055  || Duree_Signal_Canal_3 >= 1895 )
  {
    Valeur_Signal_Canal_3 = 0; // On considère que la valeur du  signal du canal 3 est égale à 0% ( manche au neutre)
    Compteur_Impulsions = 0;
    Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
  }


  // COMPTAGE DES IMPULSIONS DU MANCHE DU CANAL 3


  if (Memoire_Valeur_Haute_Canal_3 == 0)  // Si la mémoire de la valeur haute du canal 3 est égale à 0 (0V)
  {
    if ((Valeur_Signal_Canal_3) >= 80) //Si la valeur du signal du canal 3 est supérieure ou égale 80% ( manche considéré au maxi)
    {
      Memoire_Valeur_Haute_Canal_3 = 1;// On active la mémoire de la valeur haute du signal du canal 3
      Tempo_Cycle_Impulsions = 1; // On active la temporisation du cycle d'impulsions sur le manche du canal 3
      Tempo_Impulsion_Longue = 1; // On active la temporisation de l'impulsion longue sur le manche du canal 3
      Compteur_Impulsions++;// On incrémente de 1 dans le compteur
      delay(100);  // Attente 100ms
    }
    if ((Valeur_Signal_Canal_3) <= -80) //Si la valeur du signal du canal 3 est égale -80% ( manche considéré au mini)
    {
      Memoire_Valeur_Haute_Canal_3 = 1;// On active la mémoire de la valeur haute du signal du canal 3
      Tempo_Cycle_Impulsions = 1; // On active la temporisation du cycle d'impulsions sur le manche du canal 3
      Tempo_Impulsion_Longue = 1; // On active la temporisation de l'impulsion longue sur le manche du canal 3
      Compteur_Impulsions--;// On décrémente de 1 dans le compteur
      delay(100);  // On attend 100ms
    }
  }


  if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10)) //Si la valeur du signal du canal 3 est comprise entre -10% et 10%
  {
    Memoire_Valeur_Haute_Canal_3 = 0; // On désactive la mémoire de la valeur haute du signal du canal 3
  }


  // ACTIVATION DE LA TEMPORISATION DE L'IMPULSION LONGUE SUR LE MANCHE DU CANAL 3


  if (( Tempo_Impulsion_Longue) == 0 ) //  Si la temporisation de l'impulsion longue sur le manche du canal 3 est désactivée
  {
    Temps_Depart_Tempo_Impulsion_Longue = millis();// On charge le temps actuel dans la variable  temps de départ de la temporisation de l'impulsion longue sur le manche du canal 3(temps départ temporisation n°2 = temps actuel)
  }


  if (( Tempo_Impulsion_Longue) == 1 ) // Si la temporisation de l'impulsion longue sur le manche du canal 3 est activée,
  {
    Temps = millis();// On charge le temps actuel dans la variable temps


    if (Temps - Temps_Depart_Tempo_Impulsion_Longue >= 1000 ) //Si la temporisation de l'impulsion longue sur le canal 3 est supérieure ou égale à 1.5 seconde
    {
      Memoire_Impulsion_Longue = 1;// On active la mémoire de l'impulsion longue sur le manche du canal 3
    }
  }


  // DESACTIVATION DE LA TEMPORISATION DE L'IMPULSION LONGUE SUR LE MANCHE DU CANAL 3


  if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))//Si la valeur du signal du canal 3 est comprise entre -10% et 10%
  {
    Tempo_Impulsion_Longue = 0; // On désactive la temporisation d'impulsion longue sur le manche du canal 3
  }




  // CALCUL DU TEMPS DE LA TEMPORISATION DU CYCLE D'IMPULSIONS SUR LE MANCHE DU CANAL 3


  if ( Memoire_Impulsion_Longue == 0)//Si la temporisation d'impulsion longue sur le manche du canal 3 n'est pas est activée
  {
    Temps_Tempo_Cycle_Impulsions = abs(Compteur_Impulsions) * 700 + 1000; // Le temps de cycle d'impulsions est égal 0.7s x nbre d'impulsions plus 1 seconde soit 3.8 secondes pour 4 impulsions
  }
  if ( Memoire_Impulsion_Longue == 1)//Si la temporisation d'impulsion longue sur le manche du canal 3 est activée


  {
    Temps_Tempo_Cycle_Impulsions = abs(Compteur_Impulsions) * 700 + 2500; // Le temps de cycle d'impulsions est égal 0.7s x nbre d'impulsions plus 2.5 secondes soit 5.3 secondes pour 4 impulsions
  }




  // ACTIVATION DE LA TEMPORISATION DU CYCLE D'MPULSIONS SUR LE MANCHE DU CANAL 3


  if (( Tempo_Cycle_Impulsions) == 0 ) //  Si la temporisation de cycle d'impulsions est désactivée
  {
    Temps_Depart_Tempo_Cycle_Impulsions = millis();// On charge le temps actuel dans la variable temps de départ de la temporisation (temps départ temporisation = temps actuel)


  }




  // TRAITEMENT DES IMPULSIONS DU CANAL 3 ET ACTIVATION DES MELODIES


  if (( Tempo_Cycle_Impulsions) == 0 ) //  Si la temporisation est désactivée du cycle d'impulsions sur le manche du canal 3
  {
    Temps_Depart_Tempo_Cycle_Impulsions = millis();// On charge le temps actuel dans la variable  temps de départ de la temporisation (temps départ temporisation = temps actuel)
  }


  if (( Tempo_Cycle_Impulsions) == 1 ) // Si la temporisation de cycle d'impulsions est activée,
  {
    Temps = millis();// On charge le temps actuel dans la variable temps


    if (Temps - Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  ) //Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
    {
      if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
      {


        //BRUITAGE
        if ( Memoire_Impulsion_Longue == 0) // Si la mémoire de l'impulsion longue est désactivée
        {


          // Alarme 1


          if (Compteur_Impulsions == 1) // Si le compteur d'impulsions est égal à 1
          {
            Memoire_Bruitage = 1; // On active la mémoire de bruitage à 1
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Alarm1.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }


          // Corne de brume


          if (Compteur_Impulsions == 2) // Si le compteur d'impulsions est égal à 2
          {
            Memoire_Bruitage = 2; // On active la mémoire de bruitage à 2
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Horn1.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }


          //Ancre


          if (Compteur_Impulsions == -1) //Si le compteur d'impulsions est égal à -1
          {
            Memoire_Bruitage = 4; // On active la mémoire de bruitage à 4
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Ancre.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }


          // Sonnette


          if (Compteur_Impulsions == -2) // Si le compteur d'impulsions est égal à -2
          {
            Memoire_Bruitage = 5; // On active la mémoire de bruitage à 5
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Ring.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }
        }
      }
      Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
      Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
    }
  }


  // DESACTIVATION DE LA MEMOIRE DE LA TEMPORISATION N° 2


  if (Compteur_Impulsions == 0)
  {
    Memoire_Impulsion_Longue = 0;// On désactive la mémoire de la temporisation de l'impulsion longue sur le manche du canal 3
  }




  // AFFICHAGE DES INFORMATIONS SUR LE MONITEUR SERIE


  // On affiche la valeur du compteur sur le moniteur série
  Serial.print(" Compteur = ");
  Serial.println(Compteur_Impulsions);


  // On affiche l'état de la mémoire de la temporisation de l'impulsion longue sur le manche du canal 3 sur le moniteur série ( pour débugger)
  Serial.print("Mémoire Tempo 2=");
  Serial.println(Memoire_Impulsion_Longue);


  delay (00); // Pas nécessaire mais on attend 0.1 seconde avant d'afficher d'autres valeurs sur le moniteur série ( pour débugger)
}









 

 

Pour information ce code avec la liaison série fonctionne correctement à mon souhait:



 


#include <SPI.h>


#include <SD.h> // Inclure la librairie SD


#define SDPIN 10 // Chip Select du lecteur SD


// Inclure la bibliothèque tmrpcm (gestion de fichiers .wav).


#include <TMRpcm.h>






TMRpcm tmrpcm;






char caractere;


// Définition du caractère pour la gestion dans le moniteur série






void setup() {


  Serial.begin(9600); // début de la communication série
  tmrpcm.speakerPin = 9; // Speaker sur la pin 9
  tmrpcm.setVolume(4); // gestion du volume de 0 à 7
  tmrpcm.quality(1); // qualitée audio 0 ou 1






  // Initialisation de la carte SD


  if (!SD.begin(SDPIN)) {
    Serial.println("initialisation ratée!");
    // S'il y a un soucis "initialisation ratée!" s'affichera au moniteur
    return;
  }


  Serial.println("tapez un caractere -> a, b ou c " );


}






void loop() {


  if (Serial.available()) {
    caractere = Serial.read();
    if (caractere == 'a') { // Si le caractère recu dans le moniteur série est "a"
      Serial.println("Lecture"); // Ecrit dans le moniteur série
      tmrpcm.play("Alarm1.wav"); //
    }


    if (caractere == 'b') { // Si le caractère recu dans le moniteur série est "b"
      Serial.println("Lecture"); // Ecrit dans le moniteur série
      tmrpcm.play("Horn1.wav"); // Joue le son "son8bit.wav"
    }


    if (caractere == 'c') { // Si le caractère reçu dans le moniteur série est "c"
      Serial.println("Lecture"); // Ecrit dans le moniteur série
      tmrpcm.play("Ancre.wav"); // Joue le son "son8bit.wav"
    }


  }


}

Dans l'attente de votre aide, je remercie par avance l'ensemble des membres de la communauté qui me permettront d'achever mon projet d'animation sonore de mon chalutier.

 

Cordialement

 

François



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 23 novembre 2021 - 03:04

Je ne suis pas sûr d'avoir bien compris le problème. 


Que se passe t-il si tu n'attends pas que la mélodie soit finie ? 

Est ce que ça plante ? Est ce que cela ne fait rien ? Est ce que les deux mélodie se jouent ? 

Est ce qu'arrêter la musique avant de jouer une nouvelle mélodie ne résoudrait pas ton problème par hasard ?

exemple : 
 

if(tmrpcm.isPlaying())        // if music is playing
  tmrpcm.stopPlayback();      // stops the music
tmrpcm.play("xxx.wav");       // play the new pusic


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 paquito

paquito

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France

Posté 23 novembre 2021 - 09:21

Bonjour,

 

Désolé pour le manque de précision, je vais décrire la problématique:

Lorsque que le compteur d'impulsions est égal à 1, on active la mémoire de bruitage à 1, on reset le compteur à 0, on joue la mélodie "Alarme 1", on reset la mémoire de bruitage et puis impossible de faire évoluer le valeur du compteur tant que la mélodie n'est pas terminée. Les deux mélodies ne sont pas jouées, le code ne plante pas mais il ne se passe rien.

 

J'ai essayé en modifiant une partie du code mais j'ai le même problème:

 

// Alarme 1               
                         
               if(Compteur_Impulsions==1)// Si le compteur d'impulsions est égal à 1
               {               
               
                tmrpcm.play("Alarm1.wav");// On diffuse la mélodie               
                Compteur_Impulsions=0;// On reset le compteur à 0
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
                     
                }   

 

J'ai essayé ce code mais j'ai le même problème:

 

 

// Alarme 1               
                         
               if(Compteur_Impulsions==1)// Si le compteur d'impulsions est égal à 1
               {               
                if(tmrpcm.isPlaying())        // if music is playing
                tmrpcm.stopPlayback();      // stops the music             
                tmrpcm.play("Alarm1.wav");// On diffuse la mélodie               
                Compteur_Impulsions=0;// On reset le compteur à 0
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3

                }



#4 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 23 novembre 2021 - 01:07

Bonjour,

à quoi correspond la variable "Memoire_Bruitage" ?

Car :

1) elle n'est jamais lue

2) Dans le code suivant, "Memoire_Bruitage" est à une valeur différente de 0 que pendant un moment extrêmement court (durant lequel on n'en fait rien). Si le but était de garder en mémoire le fait qu'on joue un morceau de musique, ça ne marche pas car (si j'ai bien compris) "tmrpcm.play" est non bloquant (ie la fonction juste lance le morceau de musique, mais n'attend pas qu'il soit fini)

 if (Compteur_Impulsions == 1) // Si le compteur d'impulsions est égal à 1
{
   Memoire_Bruitage = 1; // On active la mémoire de bruitage à 1
   Compteur_Impulsions = 0; // On reset le compteur à 0
   Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
   tmrpcm.play("Alarm1.wav");// On diffuse la mélodie
   Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
}

Si la variable ne sert à rien, alors autant l'enlever, ça simplifiera le code. Si dans ton raisonnement elle était sensée servir à quelque chose, alors c'est peut-être la cause du problème

 

 

 

 

 

Autre point qui attiré mon attention (pas très loin de la fin):

      Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
      Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie

si tu regardes les lignes au dessus, tu es en dehors des "if", mais tu n'as pas mis de "else" : ces deux lignes de codes sont donc systématiquement exécutées (avec le contenu des "if" parfois exécutés avant). Hors, le commentaire laisse penser que ces lignes sont sensées être exécutées SEULEMENT si on n'a pas exécuté le contenu des "if". Donc soit il y a là une erreur dans le code, soit c'est les commentaires qui sont faux.
 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#5 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 23 novembre 2021 - 07:30

Il n'y a pas de ; à la fin de cet instruction, l'instruction suivante fait donc partie du if. Non ? 

 if(tmrpcm.isPlaying())        // if music is playing



#6 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 23 novembre 2021 - 10:01

@Oracid : tmrpcm.isPlaying() est calculé pour savoir si on entre ou pas dans le if.

Vu que le if n'a pas d'accolades, seule l'instruction suivante ( "tmrpcm.stopPlayback();" ) est soumise au if


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#7 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 24 novembre 2021 - 07:57

@Oracid : tmrpcm.isPlaying() est calculé pour savoir si on entre ou pas dans le if.

Vu que le if n'a pas d'accolades, seule l'instruction suivante ( "tmrpcm.stopPlayback();" ) est soumise au if

Oui, mais est ce volontaire , ou est ce une erreur ?



#8 paquito

paquito

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France

Posté 24 novembre 2021 - 08:36

Bonjour,

 

Pour information j'ai réalisé le code suivant  qui fonctionne CORRECTEMENT à la base pour commander des relais alimentant des éclairages sur mon chalutier.

 

 
//DEFINITION DES VARIABLES


//On définit la broche d'entrée utilisée


// Le canal 3 Manche côté droit de la RC Graupner  à fond en BAS ( mini) et à fond en HAUT (maxi) 


int Signal_Canal_3 = 10;      // Signal du récepteur du canal 3 Broche D10 
int Duree_Signal_Canal_3;     // Durée du signal du canal 3 en microseconde  ( pour visualiser le temps mini et temps maxi sur le moniteur série)


int Valeur_Signal_Canal_3;    // Valeur de la durée du signal du canal 3 convertie en pourcentage ( pour commander les relais)


int Temps_Mini_3 = 1070;         // Durée mini de l'impulsion du signal en microseconde ( manche au mini)   ( pour débugger)
int Temps_Maxi_3 = 1870;         // Durée maxi de l'impulsion du signal en microseconde ( manche au maxi)   ( pour débugger)  


//On définit les broches de sorties utilisées
const int Relais_1 = 2;  //  (D2) Relais 1 ( Feux de route rouge et vert )
const int Relais_2 = 3;  //  (D3) Relais 2 ( Feux de proue et poupe blancs )
const int Relais_3 = 4;  //  (D4) Relais 3 ( Feux de pêche vert et blanc superposés )
const int Relais_4 = 5;  //  (D5) Relais 4 ( Feux d'impossibilité de manœuvre rouges superposés )
const int Relais_5 = 6;  //  (D6) Relais 5 ( Projecteurs avant )
const int Relais_6 = 7;  //  (D7) Relais 6 (( Projecteurs arrière)
const int Relais_7 = 8;  //  (D8) Relais 7 ( Radar )
const int Relais_8 = 9;  //  (D9) Relais 8 ( Ventilateur de refroidissement du moteur et du variateur commander par une sonde thermique )




//on définit les temporisations
int Tempo_Cycle_Impulsions= 0;// Temporisation du cycle d'impulsions sur le manche du canal 3
int Tempo_Impulsion_Longue= 0;// Temporisation de l'impulsion longue sur le manche du canal 3


int Temps_Tempo_Cycle_Impulsions=0; // Temps de validation de la temporisation du cycle d'impulsions sur le manche du canal 3


//on définit les mémoires utilisées
int Memoire_Impulsion_Longue = 0; // Mémoire d'activation de l'impulsion longue
int Memoire_Valeur_Haute_Canal_3 = 0; // Mémoire de la valeur haute du signal du canal 3 ( +5 volts pour éviter de compter des impulsions lors du maintien du manche en position maxi ou mini)


// On définit le compteur d'impulsion du canal 3
int Compteur_Impulsions= 0;


// On définit la variable du temps actuel en ms
unsigned long Temps;


// On définit la variable du temps de départ en ms pour mémoriser le temps écoulé depuis l'activation de la temporisation de cycle d'impulsions
unsigned long Temps_Depart_Tempo_Cycle_Impulsions;  


// On définit la variable du temps de départ en ms pour mémoriser le temps écoulé depuis l'activation de la temporisation de l'impulsion longue
unsigned long Temps_Depart_Tempo_Impulsion_Longue; 






void setup() 
{
Serial.begin(9600);  // Vitesse de transmission


pinMode(Relais_1,OUTPUT); //Configuration de la broche 2 en tant que sortie numérique
digitalWrite(Relais_1,LOW);//On initialise le relais 1 à l'état 0


pinMode(Relais_2,OUTPUT); //Configuration de la broche 3 en tant que sortie numérique
digitalWrite(Relais_2,LOW);//On initialise le relais 2 à l'état 0


pinMode(Relais_3,OUTPUT); //Configuration de la broche 4 en tant que sortie numérique
digitalWrite(Relais_3,LOW);//On initialise le relais 3 à l'état 0


pinMode(Relais_4,OUTPUT); //Configuration de la broche 5 en tant que sortie numérique
digitalWrite(Relais_4,LOW);//On initialise le relais 4 à l'état 0


pinMode(Relais_5,OUTPUT); //Configuration de la broche 6 en tant que sortie numérique
digitalWrite(Relais_5,LOW);//On initialise le relais 5 à l'état 0


pinMode(Relais_6,OUTPUT); //Configuration de la broche 7 en tant que sortie numérique
digitalWrite(Relais_6,LOW);//On initialise le relais 6 à l'état 0


pinMode(Relais_7,OUTPUT); //Configuration de la broche 8 en tant que sortie numérique
digitalWrite(Relais_7,LOW);//On initialise le relais 7 à l'état 0


pinMode(Relais_8,OUTPUT); //Configuration de la broche 9 en tant que sortie numérique
digitalWrite(Relais_8,LOW);//On initialise le relais 8 à l'état 0


}
void loop()
{
 // ACQUISITION ET TRAITEMENT DU SIGNAL DU CANAL 3 DE L'EMETTEUR RC
  
  // On Mesure la durée du signal canal 3 
  Duree_Signal_Canal_3 = pulseIn(Signal_Canal_3, HIGH); 
  
  // On Convertit la durée du signal du canal 3 en pourcentage ( -100% = au manche mini, +100% = au manche maxi, le neutre étant à 0%)
  Valeur_Signal_Canal_3 = map(Duree_Signal_Canal_3,Temps_Mini_3,Temps_Maxi_3,-100,100); 
  
  // Si le signal du canal 3 n'est pas dans la plage de temps ( mini ou maxi) avec une tolérance
  if ( Duree_Signal_Canal_3 <= 1055  || Duree_Signal_Canal_3 >= 1895 ) 
  {
      Valeur_Signal_Canal_3=0;  // On considère que la valeur du  signal du canal 3 est égale à 0% ( manche au neutre)
      Compteur_Impulsions=0;
      Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
  } 
                                                                   
 // COMPTAGE DES IMPULSIONS DU MANCHE DU CANAL 3
     
    if (Memoire_Valeur_Haute_Canal_3 == 0)  // Si la mémoire de la valeur haute du canal 3 est égale à 0 (0V)
     {
        if((Valeur_Signal_Canal_3)>=80) //Si la valeur du signal du canal 3 est supérieure ou égale 80% ( manche considéré au maxi) 
        {
          Memoire_Valeur_Haute_Canal_3 = 1;// On active la mémoire de la valeur haute du signal du canal 3           
          Tempo_Cycle_Impulsions= 1;// On active la temporisation du cycle d'impulsions sur le manche du canal 3
          Tempo_Impulsion_Longue= 1;// On active la temporisation de l'impulsion longue sur le manche du canal 3
          Compteur_Impulsions++;// On incrémente de 1 dans le compteur  
          delay(100);  // Attente 100ms
        }
        if((Valeur_Signal_Canal_3)<=-80)//Si la valeur du signal du canal 3 est inférieure ou égale -80% ( manche considéré au mini)
        {   
         Memoire_Valeur_Haute_Canal_3 = 1;// On active la mémoire de la valeur haute du signal du canal 3        
         Tempo_Cycle_Impulsions= 1;// On active la temporisation du cycle d'impulsions sur le manche du canal 3
         Tempo_Impulsion_Longue= 1;// On active la temporisation de l'impulsion longue sur le manche du canal 3
         Compteur_Impulsions--;// On décrémente de 1 dans le compteur  
         delay(100);  // On attend 100ms
        }    
     }


  if((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))//Si la valeur du signal du canal 3 est comprise entre -10% et 10%
  { 
   Memoire_Valeur_Haute_Canal_3= 0;// On désactive la mémoire de la valeur haute du signal du canal 3  
  }


 // ACTIVATION DE LA TEMPORISATION DE L'IMPULSION LONGUE SUR LE MANCHE DU CANAL 3


 if (( Tempo_Impulsion_Longue)==0 )//  Si la temporisation de l'impulsion longue sur le manche du canal 3 est désactivée
 {                        
   Temps_Depart_Tempo_Impulsion_Longue = millis();// On charge le temps actuel dans la variable  temps de départ de la temporisation de l'impulsion longue sur le manche du canal 3(temps départ temporisation d'impulsion longue = temps actuel)
 }
  
  if (( Tempo_Impulsion_Longue)==1 )// Si la temporisation de l'impulsion longue sur le manche du canal 3 est activée,
 {                
    Temps = millis();// On charge le temps actuel dans la variable temps
       
       if (Temps-Temps_Depart_Tempo_Impulsion_Longue >= 1000 )//Si la temporisation de l'impulsion longue sur le canal 3 est supérieure ou égale à 1 seconde
        {
          Memoire_Impulsion_Longue = 1;// On active la mémoire de l'impulsion longue sur le manche du canal 3


        }
 }


// DESACTIVATION DE LA TEMPORISATION DE L'IMPULSION LONGUE SUR LE MANCHE DU CANAL 3


 if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))//Si la valeur du signal du canal 3 est comprise entre -10% et 10%
  {
      Tempo_Impulsion_Longue= 0;// On désactive la temporisation d'impulsion longue sur le manche du canal 3
   }




 // CALCUL DU TEMPS DE LA TEMPORISATION DU CYCLE D'IMPULSIONS SUR LE MANCHE DU CANAL 3


    if ( Memoire_Impulsion_Longue == 0)//Si la temporisation d'impulsion longue sur le manche du canal 3 n'est pas est activée
     {
      Temps_Tempo_Cycle_Impulsions= abs(Compteur_Impulsions)*700+1000; // Le temps de cycle d'impulsions est égal 0.7s x nbre d'impulsions plus 1 seconde soit 3.8 secondes pour 4 impulsions
     }
   if ( Memoire_Impulsion_Longue == 1)//Si la temporisation d'impulsion longue sur le manche du canal 3 est activée
  
    {
    Temps_Tempo_Cycle_Impulsions = abs(Compteur_Impulsions)*700+2500; // Le temps de cycle d'impulsions est égal 0.7s x nbre d'impulsions plus 2.5 secondes soit 5.3 secondes pour 4 impulsions
    }




// ACTIVATION DE LA TEMPORISATION DU CYCLE D'MPULSIONS SUR LE MANCHE DU CANAL 3
  
   if (( Tempo_Cycle_Impulsions)==0 ) //  Si la temporisation de cycle d'impulsions est désactivée 
 {                        
   Temps_Depart_Tempo_Cycle_Impulsions = millis();// On charge le temps actuel dans la variable temps de départ de la temporisation (temps départ temporisation = temps actuel)


 } 


                                                                 
// TRAITEMENT DES IMPULSIONS DU CANAL 3, DE LA POSITION DU POTENTIOMETRE LINEAIRE DU CANAL 6 ET DES SORTIES RELAIS


 if (( Tempo_Cycle_Impulsions)==0 )//  Si la temporisation est désactivée du cycle d'impulsions sur le manche du canal 3
 {                        
   Temps_Depart_Tempo_Cycle_Impulsions = millis();// On charge le temps actuel dans la variable  temps de départ de la temporisation (temps départ temporisation = temps actuel)
 }


  if (( Tempo_Cycle_Impulsions)==1 )// Si la temporisation de cycle d'impulsions est activée,
   {                
    Temps = millis();// On charge le temps actuel dans la variable temps
       
       if (Temps-Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  )//Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
        {
          if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
          {             
              if( Memoire_Impulsion_Longue == 0)// Si la mémoire de l'impulsion longue est désactivée
              {
 //RELAIS 1               
              if ((Compteur_Impulsions==1)&&(digitalRead (Relais_1)== LOW))//Si le compteur est égal 1 et que  le relais 1 est desactivé
               {
              digitalWrite (Relais_1 ,HIGH);//On active le relais 1
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3       
               }
            
          
              if ((Compteur_Impulsions==1)&&(digitalRead (Relais_1)== HIGH ))// Si le compteur est égal 1 et que  le relais 1 est activé
             {          
              digitalWrite (Relais_1 ,LOW);//on désactive le relais 1
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
             }     
             




 //RELAIS 2            
              if ((Compteur_Impulsions==2)&&(digitalRead (Relais_2)== LOW))//Si le compteur est égal 2 et que  le relais 2 est desactivé
               {
              digitalWrite (Relais_2 ,HIGH);//On active le relais 2
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3       
               }
            
              if ((Compteur_Impulsions==2)&&(digitalRead (Relais_2)== HIGH ))// Si le compteur est égal 2 et que  le relais 2 est activé
             {          
              digitalWrite (Relais_2 ,LOW);//on désactive le relais 2
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
             }                     
                    
  //RELAIS 3 
  
           if ((Compteur_Impulsions==3)&&(digitalRead (Relais_3)== LOW)) //Si le compteur est égal 3 et que  le relais 3 est desactivé
            {
              digitalWrite (Relais_3 ,HIGH);//On active le relais 3
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3      
            } 
                  
          if ((Compteur_Impulsions==3)&&(digitalRead (Relais_3)== HIGH ))// Si le compteur est égal 3 et que  le relais 3 est activé
          {
              digitalWrite (Relais_3 ,LOW);//On désactive le relais 3
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
            }


 //DESACTIVATION DES RELAIS 1,2 ET 3
      
            if ((Compteur_Impulsions==4))// Si le compteur est égal 4
            {
              digitalWrite (Relais_1 ,LOW);//On désactive le relais 1
              digitalWrite (Relais_2 ,LOW);//On désactive le relais 2
              digitalWrite (Relais_3 ,LOW);//On désactive le relais 3 
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation
            }       


 //RELAIS 4 
  
           if ((Compteur_Impulsions==-1)&&(digitalRead (Relais_4)== LOW))// Si le compteur est égal -1 et que le relais 4 est désactivé
            {
              digitalWrite (Relais_4 ,HIGH);//On active le relais 4
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3       
            }
           if ((Compteur_Impulsions==-1)&&(digitalRead (Relais_4)== HIGH ))// Si le compteur est égal -1 et que le relais 4 est activé
            {
              digitalWrite (Relais_4 ,LOW);//on désactive le relais 4
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
             }     


 //RELAIS 5
           
            if ((Compteur_Impulsions==-2)&&(digitalRead (Relais_5)== LOW))// Si le compteur est égal -2 et que  le relais 5 est desactivé
            {
              digitalWrite (Relais_5 ,HIGH);//On active le relais 5
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3      
            } 
                  
           if ((Compteur_Impulsions==-2)&&(digitalRead (Relais_5)== HIGH ))// Si le compteur est égal -2 et que  le relais 5 est activé
            {
              digitalWrite (Relais_5 ,LOW);//On désactivé le relais 5
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
            }   


 //RELAIS 6 
                
          if ((Compteur_Impulsions==-3)&&(digitalRead (Relais_6)== LOW))// Si le compteur est égal -3 et que  le relais 6 est desactivé
            {
              digitalWrite (Relais_6 ,HIGH);//On active le relais 6
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3      
            } 
                  
          if ((Compteur_Impulsions==-3)&&(digitalRead (Relais_6)== HIGH ))// Si le compteur est égal -3 et que  le relais 6 est activé
          {
              digitalWrite (Relais_6 ,LOW);//On désactive le relais 6
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
            }
            
 //DESACTIVATION DES RELAIS 4,5 ET 6
      
            if (Compteur_Impulsions==-4)// Si le compteur est égal -4
            {
              digitalWrite (Relais_4 ,LOW);//On désactive le relais 4
              digitalWrite (Relais_5 ,LOW);//On désactive le relais 5
              digitalWrite (Relais_6 ,LOW);//On désactive le relais 6 
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Impulsion_Longue= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
            }           
          }
                 
      if( Memoire_Impulsion_Longue == 1)//Si la mémoire de l'impulsion longue est activé                
          {
            
  
//RELAIS 7        
           
           if ((Compteur_Impulsions==1)&&(digitalRead (Relais_7)== LOW)) // Si le compteur est égal 1 et que le relais 7 est désactivé
            {
              digitalWrite (Relais_7 ,HIGH);//On active le relais 7
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3     
            }


          
            if ((Compteur_Impulsions==1)&&(digitalRead (Relais_7)== HIGH ))// Si le compteur est égal 1 et que le relais 7 est activé
            {
              digitalWrite (Relais_7 ,LOW);//on désactive le relais 7
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
             }         
         
  //RELAIS 8        
           
           if ((Compteur_Impulsions==2)&&(digitalRead (Relais_8)== LOW)) // Si le compteur est égal 2 et que le relais 8 est désactivé
            {
              digitalWrite (Relais_8 ,HIGH);//On active le relais 8
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3     
            }      
          
          if ((Compteur_Impulsions==2)&&(digitalRead (Relais_8)== HIGH ))// Si le compteur est égal 2 et que le relais 8 est activé
            {
              digitalWrite (Relais_8 ,LOW);//on désactive le relais 8
              Compteur_Impulsions=0;// On reset le compteur à 0
              Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
             }                    
          }
         } 
      Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
      Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie        
  }    
 }


// DESACTIVATION DE LA MEMOIRE DE LA TEMPORISATION N° 2


   if (Compteur_Impulsions==0)
   {
     Memoire_Impulsion_Longue = 0;// On désactive la mémoire de la temporisation de l'impulsion longue sur le manche du canal 3
   }




// AFFICHAGE DES INFORMATIONS SUR LE MONITEUR SERIE


 //On affiche la durée d'impulsion en microseconde sur la liaison série( pour débugger)
  //Serial.print("Durée d'impulsion du signal 3 en microseconde = ");                                                                
  //Serial.println(Duree_Signal_Canal_3);    
  
 // On affiche la valeur convertie en % du signal du canal 3 sur la liaison série ( pour débugger)
 // Serial.print("Valeur 3 en %= ");                                                                       
//  Serial.println(Valeur_Signal_Canal_3);   


 // On affiche la valeur du compteur sur le moniteur série
 Serial.print(" Compteur = ");
 Serial.println(Compteur_Impulsions);
      
 // On affiche l'état de la temporisation sur le moniteur série ( pour débugger)
 //Serial.print("Tempo Active=");
 //Serial.println(Tempo_Active);


  // On affiche  l'état de la mémoire de la valeur haute du canal 3 sur le moniteur série ( pour débugger)
// Serial.print("Mémoire Valeur Haute=");
// Serial.println(Memoire_Valeur_Haute_Canal_3);
  
  // On affiche l'état de la temporisation sur le moniteur série ( pour débugger)
 // Serial.print("Tempo Active 2=");
 // Serial.println(Tempo_Active_2);


  
  // On affiche l'état de la mémoire de la temporisation de l'impulsion longue sur le manche du canal 3 sur le moniteur série ( pour débugger)
 Serial.print("Mémoire Tempo 2=");
 Serial.println(Memoire_Impulsion_Longue);


delay (00); // Pas nécessaire mais on attend 0.1 seconde avant d'afficher d'autres valeurs sur le moniteur série ( pour débugger)
}


#9 paquito

paquito

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France

Posté 24 novembre 2021 - 09:18

Je tiens à préciser que les 2 instructions suivantes en fin de code sont nécessaires si le compteur est supérieur à 4 pour le remettre à zéro. J'ai fait l'essais sans celles-ci  avec le compteur à 5  le compteur et la temporisation ne sont pas "resetés."

 

Faut-il modifier ces 2 instructions par un else?

 

 

   
Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
   Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
 
 
   Ensuite j'ai remplacé les relais par des mélodies à jouer, après de nombreux essais je pensais que le tmrpcm.play ( XXXX.wav) était bloquant  j'ai donc mis une mémoire bruitage qui à  la base n'existait pas pour" reseter" le compteur d'impulsion et la temporisation cycle impulsions. 
 
 
Donc le code était le suivant:
 
 
//Ancre 
             
               if(Compteur_Impulsions==-1) //Si le compteur d'impulsions est égal à -1
               {                     
                tmrpcm.play("Ancre.wav");// On diffuse la mélodie                              
                Compteur_Impulsions=0;// On reset le compteur à 0
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3               
                }              


// Sonnette
            
               if(Compteur_Impulsions==-2)// Si le compteur d'impulsions est égal à -2
               {
                tmrpcm.play("Ring.wav");// On diffuse la mélodie
                Compteur_Impulsions=0;// On reset le compteur à 0
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
                } 
            }                
         } 
      Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
      Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie        
  }    
 }
Mais depuis je bloque sur cette problématique que je n'arrive pas à résoudre, je "resete" bien mon compteur et ma tempo mais le compteur ne peux pas évoluer tant que  la mélodie n'est pas terminée.
 
Comment et ou doit-on écrire l'instruction  " tmrpcm.isPlaying() "car je n'ai pas tout compris à ce sujet?
 
Désolé d'être aussi long dans ma description, mais j'essaie de vous apporter plus de précisions à chaque fois n'hésiter pas à poser des questions.


#10 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 24 novembre 2021 - 10:18

Bonjour,

 

 

Je tiens à préciser que les 2 instructions suivantes en fin de code sont nécessaires si le compteur est supérieur à 4 pour le remettre à zéro. J'ai fait l'essais sans celles-ci  avec le compteur à 5  le compteur et la temporisation ne sont pas "resetés."

 

Faut-il modifier ces 2 instructions par un else?

 

 

   Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
   Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie

Honnêtement, j'ai toujours pas réussi à comprendre entièrement ton code. Donc à toi de nous dire si ces lignes doivent être exécutées uniquement quand les ifs sont tous faux (dans ce cas il faut un/des else), ou si c'est bon de les executer à chaque fois.

 

 

 

Comment et ou doit-on écrire l'instruction  " tmrpcm.isPlaying() "car je n'ai pas tout compris à ce sujet?

c'est pas sur qu'on en ait besoin.

Je te propose de tester le petit programme suivant, qui nous aidera à voir plus clair dans le fonctionnement de tmrpcm :

#include <SPI.h>
#include <SD.h> // Inclure la librairie SD

#define SDPIN 10 // Chip Select du lecteur SD

// Inclure la bibliothèque tmrpcm (gestion de fichiers .wav).
#include <TMRpcm.h>

TMRpcm tmrpcm;

char caractere;

void setup() {
  Serial.begin(9600); // début de la communication série
  tmrpcm.speakerPin = 9; // Speaker sur la pin 9
  tmrpcm.setVolume(4); // gestion du volume de 0 à 7
  tmrpcm.quality(1); // qualitée audio 0 ou 1
  // Initialisation de la carte SD


  if (!SD.begin(SDPIN)) {
    Serial.println("initialisation ratée!");
    // S'il y a un soucis "initialisation ratée!" s'affichera au moniteur
    return;
  }
}

void loop() {
  Serial.println(millis());
  Serial.println("alarm");
  tmrpcm.play("Alarm1.wav");
  delay(1000);
  Serial.println(millis());
  Serial.println("horn");
  tmrpcm.play("Horn1.wav");
  delay(1000);
}

Si tout vas bien (tmrpcm.play non bloquant, et autorisant de changer de son sans être arrêté au préalable), alors alarm et horn devraient jouer à tour de role pour une seconde à chaque fois. Les valeurs affichées par millis() devraient augmenter d'environ 1000 entre chaque affichage. Est-ce que tu peux exécuter le programme et confirmer (ou pas) ces hypothèses?

 

 

PS : ton programme des relais, il est sensé tourner sur la même arduino ou sur une arduino différente?
 

 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#11 paquito

paquito

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France

Posté 24 novembre 2021 - 06:45

Bonsoir,

 

Pour rappel:

  Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
   Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie

Ces 2 instructions sont exécutées si seulement le compteur est supérieur à 4 ou inférieur à -4, alors faut-il mettre un else? , je précise que cela fonctionne correctement dans le premier code pour commander les relais.

 

Pour information:

 

Ayant sur mon émetteur  de radiocommande, un potentiomètre linéaire pour sélectionner la commande des relais au point milieu

 

               if ((Valeur_Signal_Canal_6 >= -10) && (Valeur_Signal_Canal_6 <= 10))// Si la valeur du signal du canal 6 est comprise entre -10% et +10% ( potentiomètre linéaire du canal 6 au neutre )
           

 

ou au maxi pour jouer les  mélodies.

       

                     
         
  if (Valeur_Signal_Canal_6 >= 90)// Si la valeur du signal du canal 6 est supérieure à 90% ( potentiomètre linéaire du canal 6 au maxi )

Dans un 3ème temps je vais associer un bruiteur diesel, le son sera en fonction du canal de propulsion ( marche avant et arrière ), qui sera commandé par un voie TOR ( interrupteur à 2 positions sur mon émetteur ) que j'ai trouvé sur internet le tout sur le même nano si la mémoire de l'arduino le permet.

 

Etant tout débutant c'est mon premier projet, alors je suppose que le code n'est pas optimal mais nous avons tous commencé par faire des erreurs.

 

 

J'ai testé comme demandé le petit code ci-dessus, les mélodies "alarm" et "horn" sont bien jouées successivement l'une après l'autre, la valeur "millis" augmente d'environ 1000 ( 1 seconde).



#12 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 24 novembre 2021 - 08:05

Pour rappel:

 

   Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
   Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie

 

Ces 2 instructions sont exécutées si seulement le compteur est supérieur à 4 ou inférieur à -4, alors faut-il mettre un else? , je précise que cela fonctionne correctement dans le premier code pour commander les relais.

 

Il y a deux points de vue :

A) si tu veux que ces instructions soient exécutées uniquement quand le compteur est supérieur ou égal à 4 ou inférieur ou égal à -4, alors il faut modifier le code (en l'occurence, vu l'imbriquement des ifs, un simple else ne suffira pas, soit il en faudra plusieurs à plusieurs endroits, soit il faudrait restructurer le code). Actuellement, elle sont exécutées "systématiquements" si tu entres dans les 2 premiers "if" :

if (( Tempo_Cycle_Impulsions) == 1 ) // Si la temporisation de cycle d'impulsions est activée,
  {
    Temps = millis();// On charge le temps actuel dans la variable temps


    if (Temps - Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  ) //Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
    {

B) si tu regardes ton code plus en détail, tu verra que ces instructions sont de toute façon déjà exécutées dans les cas où tu joue une mélodie, donc ça ne fait rien de les exécuter une seconde fois. Là où ça fait une différence, c'est que le code est aussi exécuté si un des deux ifs suivant est faux :

 if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
      {


        //BRUITAGE
        if ( Memoire_Impulsion_Longue == 0) // Si la mémoire de l'impulsion longue est désactivée
        {

et là, pour le coup, je n'ai pas encore assez bien compris ton code pour comprendre si c'est un problème ou pas.
 

 

 

PS : est-ce que pour m'aider à y voir plus clair tu pourrais m'expliquer le sens précis des variables suivantes :

-Tempo_Cycle_Impulsions

-Temps_Depart_Tempo_Cycle_Impulsions

-Memoire_Impulsion_Longue

-Compteur_Impulsions


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#13 paquito

paquito

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France

Posté 24 novembre 2021 - 09:03

Pour info;

 

Ces 2 instructions ne sont à exécuter seulement si le compteur est strictement supérieur à 4 ou strictement inférieur à -4 car aucune condition n'est vraie.( dans mon code aucun relais n'est activé ou désactivé strictement après la valeur 4)

Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
   Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie 

 

-Tempo_Cycle_Impulsions : permet de déterminer le temps après lequel on vient "lire" le compteur d'impulsions 

 

-Temps_Depart_Tempo_Cycle_Impulsions: permet de fixer le temps de début de la temporisation du cycle d'impulsions après lequel on vient lire la valeur du compteur d'impulsions pour augmenter la rapidité d'exécution du pilotage des relais.

PS: j'aurai pu mettre un temps de cycle fixe par exemple 4 secondes, mais inutile d'attendre 2.3s pour piloter le "relais 1" car qu'il faut une seule impulsion ( dans mon cas 0.7s +1s total 1.7s)

// CALCUL DU TEMPS DE LA TEMPORISATION DU CYCLE D'IMPULSIONS SUR LE MANCHE DU CANAL 3

    if ( Memoire_Impulsion_Longue == 0)//Si la temporisation d'impulsion longue sur le manche du canal 3 n'est pas est activée
     {
      Temps_Tempo_Cycle_Impulsions= abs(Compteur_Impulsions)*700+1000; // Le temps de cycle d'impulsions est égal 0.7s x nbre d'impulsions plus 1 seconde soit 3.8 secondes pour 4 impulsions
     }
   if ( Memoire_Impulsion_Longue == 1)//Si la temporisation d'impulsion longue sur le manche du canal 3 est activée
  
    {
    Temps_Tempo_Cycle_Impulsions = abs(Compteur_Impulsions)*700+2500; // Le temps de cycle d'impulsions est égal 0.7s x nbre d'impulsions plus 2.5 secondes soit 5.3 secondes pour 4 impulsions
    }

Temps cycle impulsion =  Temps actuel -Temps_Depart_Tempo_Cycle_Impulsions

 

par exemple: temps du cycle d'impulsion = t1 - t0

 

Je l'ai mis pour ne pas confondre avec le Temps Départ Tempo Impulsion Longue

 

par exemple: temps d'impulsion longue= t2 - tx0

 

if (( Tempo_Cycle_Impulsions)==0 )//  Si la temporisation est désactivée du cycle d'impulsions sur le manche du canal 3
 {                        
   Temps_Depart_Tempo_Cycle_Impulsions = millis();// On charge le temps actuel dans la variable  temps de départ de la temporisation (temps départ temporisation = temps actuel)
 }


  if (( Tempo_Cycle_Impulsions)==1 )// Si la temporisation de cycle d'impulsions est activée,
   {                
    Temps = millis();// On charge le temps actuel dans la variable temps
       
       if (Temps-Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  )//Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
        {
          if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )

-Memoire_Impulsion_Longue : permet de mémoriser la présence d'une impulsion longue sur le manche ( au mini ou au maxi) d'une durée supérieure à 1 seconde

 

-Compteur_Impulsions : permet de compter le nombre d'impulsions effectuées sur le manche du canal ( au mini ou au maxi )  inférieures et supérieures à 1seconde



#14 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 24 novembre 2021 - 10:46

Ces 2 instructions ne sont à exécuter seulement si le compteur est strictement supérieur à 4 ou strictement inférieur à -4 car aucune condition n'est vraie.( dans mon code aucun relais n'est activé ou désactivé strictement après la valeur 4)

Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
   Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie 

OK, donc on exécute le code si toutes les conditions pour activer un relai/jouer un son seraient réunies, sauf que le nombre d'impulsions est invalide : c'est bien ça?


if (( Tempo_Cycle_Impulsions) == 1 ) // Si la temporisation de cycle d'impulsions est activée,
{
  Temps = millis();// On charge le temps actuel dans la variable temps

  if (Temps - Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  ) //Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
  {
    if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
    {
      if ( Memoire_Impulsion_Longue == 0) // Si la mémoire de l'impulsion longue est désactivée
      {
        //RELAIS 1
        if ((Compteur_Impulsions == 1) && (digitalRead (Relais_1) == LOW)) //Si le compteur est égal 1 et que  le relais 1 est desactivé
        {
          digitalWrite (Relais_1 , HIGH); //On active le relais 1
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }


        if ((Compteur_Impulsions == 1) && (digitalRead (Relais_1) == HIGH )) // Si le compteur est égal 1 et que  le relais 1 est activé
        {
          digitalWrite (Relais_1 , LOW); //on désactive le relais 1
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }





        //RELAIS 2
        if ((Compteur_Impulsions == 2) && (digitalRead (Relais_2) == LOW)) //Si le compteur est égal 2 et que  le relais 2 est desactivé
        {
          digitalWrite (Relais_2 , HIGH); //On active le relais 2
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }

        if ((Compteur_Impulsions == 2) && (digitalRead (Relais_2) == HIGH )) // Si le compteur est égal 2 et que  le relais 2 est activé
        {
          digitalWrite (Relais_2 , LOW); //on désactive le relais 2
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }

        //RELAIS 3

        if ((Compteur_Impulsions == 3) && (digitalRead (Relais_3) == LOW)) //Si le compteur est égal 3 et que  le relais 3 est desactivé
        {
          digitalWrite (Relais_3 , HIGH); //On active le relais 3
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }

        if ((Compteur_Impulsions == 3) && (digitalRead (Relais_3) == HIGH )) // Si le compteur est égal 3 et que  le relais 3 est activé
        {
          digitalWrite (Relais_3 , LOW); //On désactive le relais 3
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }


        //DESACTIVATION DES RELAIS 1,2 ET 3

        if ((Compteur_Impulsions == 4)) // Si le compteur est égal 4
        {
          digitalWrite (Relais_1 , LOW); //On désactive le relais 1
          digitalWrite (Relais_2 , LOW); //On désactive le relais 2
          digitalWrite (Relais_3 , LOW); //On désactive le relais 3
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation
        }


        //RELAIS 4

        if ((Compteur_Impulsions == -1) && (digitalRead (Relais_4) == LOW)) // Si le compteur est égal -1 et que le relais 4 est désactivé
        {
          digitalWrite (Relais_4 , HIGH); //On active le relais 4
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }
        if ((Compteur_Impulsions == -1) && (digitalRead (Relais_4) == HIGH )) // Si le compteur est égal -1 et que le relais 4 est activé
        {
          digitalWrite (Relais_4 , LOW); //on désactive le relais 4
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }


        //RELAIS 5

        if ((Compteur_Impulsions == -2) && (digitalRead (Relais_5) == LOW)) // Si le compteur est égal -2 et que  le relais 5 est desactivé
        {
          digitalWrite (Relais_5 , HIGH); //On active le relais 5
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }

        if ((Compteur_Impulsions == -2) && (digitalRead (Relais_5) == HIGH )) // Si le compteur est égal -2 et que  le relais 5 est activé
        {
          digitalWrite (Relais_5 , LOW); //On désactivé le relais 5
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }


        //RELAIS 6

        if ((Compteur_Impulsions == -3) && (digitalRead (Relais_6) == LOW)) // Si le compteur est égal -3 et que  le relais 6 est desactivé
        {
          digitalWrite (Relais_6 , HIGH); //On active le relais 6
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }

        if ((Compteur_Impulsions == -3) && (digitalRead (Relais_6) == HIGH )) // Si le compteur est égal -3 et que  le relais 6 est activé
        {
          digitalWrite (Relais_6 , LOW); //On désactive le relais 6
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }

        //DESACTIVATION DES RELAIS 4,5 ET 6

        if (Compteur_Impulsions == -4) // Si le compteur est égal -4
        {
          digitalWrite (Relais_4 , LOW); //On désactive le relais 4
          digitalWrite (Relais_5 , LOW); //On désactive le relais 5
          digitalWrite (Relais_6 , LOW); //On désactive le relais 6
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Impulsion_Longue = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
        }
      }

      if ( Memoire_Impulsion_Longue == 1) //Si la mémoire de l'impulsion longue est activé
      {


        //RELAIS 7

        if ((Compteur_Impulsions == 1) && (digitalRead (Relais_7) == LOW)) // Si le compteur est égal 1 et que le relais 7 est désactivé
        {
          digitalWrite (Relais_7 , HIGH); //On active le relais 7
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
        }



        if ((Compteur_Impulsions == 1) && (digitalRead (Relais_7) == HIGH )) // Si le compteur est égal 1 et que le relais 7 est activé
        {
          digitalWrite (Relais_7 , LOW); //on désactive le relais 7
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
        }

        //RELAIS 8

        if ((Compteur_Impulsions == 2) && (digitalRead (Relais_8) == LOW)) // Si le compteur est égal 2 et que le relais 8 est désactivé
        {
          digitalWrite (Relais_8 , HIGH); //On active le relais 8
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
        }

        if ((Compteur_Impulsions == 2) && (digitalRead (Relais_8) == HIGH )) // Si le compteur est égal 2 et que le relais 8 est activé
        {
          digitalWrite (Relais_8 , LOW); //on désactive le relais 8
          Compteur_Impulsions = 0; // On reset le compteur à 0
          Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
        }
      }
    }
    Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
    Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
  }
}

Si tu regardes bien, les deux lignes apparaissent aussi dans chaque cas valable : donc on peut les exécuter de manière systématique dès qu'on entre dans le if suivant :

    if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )

C'est bien ça?

Si oui, on peut simplifier pas mal le code (et résoudre le problème des 2 lignes), en l'écrivant de la manière suivante :


if (( Tempo_Cycle_Impulsions) == 1 ) // Si la temporisation de cycle d'impulsions est activée,
{
  Temps = millis();// On charge le temps actuel dans la variable temps

  if (Temps - Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  ) //Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
  {
    if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
    {
      if ( Memoire_Impulsion_Longue == 0) // Si la mémoire de l'impulsion longue est désactivée
      {
        //RELAIS 1
        if ((Compteur_Impulsions == 1) && (digitalRead (Relais_1) == LOW)) //Si le compteur est égal 1 et que  le relais 1 est desactivé
        {
          digitalWrite (Relais_1 , HIGH); //On active le relais 1
        }

        if ((Compteur_Impulsions == 1) && (digitalRead (Relais_1) == HIGH )) // Si le compteur est égal 1 et que  le relais 1 est activé
        {
          digitalWrite (Relais_1 , LOW); //on désactive le relais 1
        }

        //RELAIS 2
        if ((Compteur_Impulsions == 2) && (digitalRead (Relais_2) == LOW)) //Si le compteur est égal 2 et que  le relais 2 est desactivé
        {
          digitalWrite (Relais_2 , HIGH); //On active le relais 2
        }

        if ((Compteur_Impulsions == 2) && (digitalRead (Relais_2) == HIGH )) // Si le compteur est égal 2 et que  le relais 2 est activé
        {
          digitalWrite (Relais_2 , LOW); //on désactive le relais 2
        }

        //RELAIS 3
        if ((Compteur_Impulsions == 3) && (digitalRead (Relais_3) == LOW)) //Si le compteur est égal 3 et que  le relais 3 est desactivé
        {
          digitalWrite (Relais_3 , HIGH); //On active le relais 3
        }

        if ((Compteur_Impulsions == 3) && (digitalRead (Relais_3) == HIGH )) // Si le compteur est égal 3 et que  le relais 3 est activé
        {
          digitalWrite (Relais_3 , LOW); //On désactive le relais 3
        }

        //DESACTIVATION DES RELAIS 1,2 ET 3
        if ((Compteur_Impulsions == 4)) // Si le compteur est égal 4
        {
          digitalWrite (Relais_1 , LOW); //On désactive le relais 1
          digitalWrite (Relais_2 , LOW); //On désactive le relais 2
          digitalWrite (Relais_3 , LOW); //On désactive le relais 3
        }

        //RELAIS 4
        if ((Compteur_Impulsions == -1) && (digitalRead (Relais_4) == LOW)) // Si le compteur est égal -1 et que le relais 4 est désactivé
        {
          digitalWrite (Relais_4 , HIGH); //On active le relais 4
        }
        if ((Compteur_Impulsions == -1) && (digitalRead (Relais_4) == HIGH )) // Si le compteur est égal -1 et que le relais 4 est activé
        {
          digitalWrite (Relais_4 , LOW); //on désactive le relais 4
        }

        //RELAIS 5
        if ((Compteur_Impulsions == -2) && (digitalRead (Relais_5) == LOW)) // Si le compteur est égal -2 et que  le relais 5 est desactivé
        {
          digitalWrite (Relais_5 , HIGH); //On active le relais 5
        }

        if ((Compteur_Impulsions == -2) && (digitalRead (Relais_5) == HIGH )) // Si le compteur est égal -2 et que  le relais 5 est activé
        {
          digitalWrite (Relais_5 , LOW); //On désactivé le relais 5
        }

        //RELAIS 6
        if ((Compteur_Impulsions == -3) && (digitalRead (Relais_6) == LOW)) // Si le compteur est égal -3 et que  le relais 6 est desactivé
        {
          digitalWrite (Relais_6 , HIGH); //On active le relais 6
        }

        if ((Compteur_Impulsions == -3) && (digitalRead (Relais_6) == HIGH )) // Si le compteur est égal -3 et que  le relais 6 est activé
        {
          digitalWrite (Relais_6 , LOW); //On désactive le relais 6
        }

        //DESACTIVATION DES RELAIS 4,5 ET 6

        if (Compteur_Impulsions == -4) // Si le compteur est égal -4
        {
          digitalWrite (Relais_4 , LOW); //On désactive le relais 4
          digitalWrite (Relais_5 , LOW); //On désactive le relais 5
          digitalWrite (Relais_6 , LOW); //On désactive le relais 6
        }
      }

      if ( Memoire_Impulsion_Longue == 1) //Si la mémoire de l'impulsion longue est activé
      {

        //RELAIS 7
        if ((Compteur_Impulsions == 1) && (digitalRead (Relais_7) == LOW)) // Si le compteur est égal 1 et que le relais 7 est désactivé
        {
          digitalWrite (Relais_7 , HIGH); //On active le relais 7
        }

        if ((Compteur_Impulsions == 1) && (digitalRead (Relais_7) == HIGH )) // Si le compteur est égal 1 et que le relais 7 est activé
        {
          digitalWrite (Relais_7 , LOW); //on désactive le relais 7
        }

        //RELAIS 8
        if ((Compteur_Impulsions == 2) && (digitalRead (Relais_8) == LOW)) // Si le compteur est égal 2 et que le relais 8 est désactivé
        {
          digitalWrite (Relais_8 , HIGH); //On active le relais 8
        }

        if ((Compteur_Impulsions == 2) && (digitalRead (Relais_8) == HIGH )) // Si le compteur est égal 2 et que le relais 8 est activé
        {
          digitalWrite (Relais_8 , LOW); //on désactive le relais 8
        }
      }
      //on place les deux lignes ici : dès qu'on entre dans le "if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))"
      Compteur_Impulsions = 0;// On désactive le compteur si aucune condition ci-dessus est vraie
      Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
    }
    //on les enlève d'ici, où ils s'exécutaient dans des cas en plus
    //Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
    //Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
  }
}

Je te propose de tester avec les relais avec ce code, voir si tout fonctionne comme prévu (penses à faire une sauvegarde avant). Si oui, on pourra je crois faire la même correction + simplification sur le le code des sons.

 

 

Si jamais ça ne marche pas, il existe plusieurs autres manières de traiter vraiment le cas "où aucun test n'a réussi" qu'on pourra essayer :

if (test1)
{
   //si test1 est vrai
}
else if(test2)  //on fait le test2 seulement si le test1 a échoué
{
   //si le test1 est faux mais le test2 est vrai
}
else if(test3)  //on fait le test3 seulement si les tests 1 et 2 ont échoués
{
   //si les tests 1 et 2 sont faux mais le test3 est vrai
}
...
else if(testN)  //on fait le testN seulement si les tests 1 à N-1 ont échoués
{
   //si les tests 1 à N-1 sont faux mais le test N est vrai
}
else
{
   //si tous les tests sont faux
}

ou

bool un_test_a_reussi=false;
if(test1)
{
  un_test_a_reussi=true;
  //ce qu'on doit faire si le test1 a réussi
}
if(test2)
{
  un_test_a_reussi=true;
  //ce qu'on doit faire si le test2 a réussi
}
...
if(testN)
{
  un_test_a_reussi=true;
  //ce qu'on doit faire si le testN a réussi
}

if(un_test_a_reussi==faux)
{
  //ce qu'on doit faire si aucun test n'a réussi
}

ou, dans le cas où le test se fait uniquement sur une valeur :

switch(ma_valeur)
{
  case -3:
    //ce qu'on fait si la valeur est -3
    break;
  case 99:
    //ce qu'on fait si la valeur est 99
    break;
  ...
  case -1:
    //ce qu'on fait si la valeur est -1
    break;
  default :
    //ce qu'on fait si la valeur ne correspond à aucun des "case". NB : on place toujours default à la fin
    break
}

 

 

 

 

 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#15 paquito

paquito

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France

Posté 25 novembre 2021 - 09:47

Bonjour,

 

Pour info:

 

J'ai testé le code en supprimant les deux lignes qui pourraient éventuellement poser le problème

    
 Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
      Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie  

avec un compteur compris entre -2 et 2 mais j'ai toujours la même problématique,

 

  if (( Tempo_Cycle_Impulsions)==1 )// Si la temporisation de cycle d'impulsions est activée,
   {                
    Temps = millis();// On charge le temps actuel dans la variable temps
       
       if (Temps-Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  )//Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
        {
          if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
          {             
                      
//BRUITAGE           
              if( Memoire_Impulsion_Longue == 0)// Si la mémoire de l'impulsion longue est désactivée
               {
     
// Alarme 1               
                         
               if(Compteur_Impulsions==1)// Si le compteur d'impulsions est égal à 1
               {                         
                tmrpcm.play("Alarm1.wav");// On diffuse la mélodie               
                Compteur_Impulsions=0;// On reset le compteur à 0
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3           
                }               
                
// Corne de brume  
               
               if(Compteur_Impulsions==2)// Si le compteur d'impulsions est égal à 2
               {               
                tmrpcm.play("Horn1.wav");// On diffuse la mélodie             
                Compteur_Impulsions=0;// On reset le compteur à 0
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3              
                }
                         
//Ancre 
             
               if(Compteur_Impulsions==-1) //Si le compteur d'impulsions est égal à -1
               {                     
                tmrpcm.play("Ancre.wav");// On diffuse la mélodie                              
                Compteur_Impulsions=0;// On reset le compteur à 0
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3               
                }             

// Sonnette
            
               if(Compteur_Impulsions==-2)// Si le compteur d'impulsions est égal à -2
               {
                tmrpcm.play("Ring.wav");// On diffuse la mélodie
                Compteur_Impulsions=0;// On reset le compteur à 0
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
                }                     
            }                           
       }          
  }    
 }

J'ai aussi testé avec l'ajout d'une "rubrique" suivante:

 

// DESACTIVATION DU COMPTEUR D'IMPULSION ET DE LA TEMPORISATION DE CYCLE D'IMPULSIONS


   if (Compteur_Impulsions > 2 || Compteur_Impulsions <- 2)// Si le compteur est supérieur 2 ou inférieur à -2
   {
     Compteur_Impulsions = 0;//  On désactive le compteur         
     Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions
   } 

mais j'ai toujours la même problématique.

 

Alors de ce fait je ne pense pas que ces 2 lignes soient la cause de ce dysfonctionnement ??



#16 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 25 novembre 2021 - 10:54

Je crois qu'il y a un petit mal compris : je n'ai jamais dis que ces lignes devaient être supprimées complètement (si tu les supprime complètement, alors si tu fais trop d'impulsions, je penses que le programme est bloqué "pour toujours").

 

Il faut "simplement" les placer de manière à ce qu'il soient exécutés quand tu le désire, pour ça, tu as les 3 options :

 

1) regrouper les 2 lignes quasi à la fin (vu qu'elles s'exécutent dans les cas corrects après avoir joué le morceau et dans les cas incorects) : dans ce cas, il faut les passer juste au dessus l'accolade fermante qui était juste au dessus :

if (( Tempo_Cycle_Impulsions) == 1 ) // Si la temporisation de cycle d'impulsions est activée,
  {
    Temps = millis();// On charge le temps actuel dans la variable temps


    if (Temps - Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  ) //Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
    {
      if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
      {


        //BRUITAGE
        if ( Memoire_Impulsion_Longue == 0) // Si la mémoire de l'impulsion longue est désactivée
        {


          // Alarme 1


          if (Compteur_Impulsions == 1) // Si le compteur d'impulsions est égal à 1
          {
            Memoire_Bruitage = 1; // On active la mémoire de bruitage à 1
            //Compteur_Impulsions = 0; // On reset le compteur à 0
            //Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Alarm1.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }


          // Corne de brume


          if (Compteur_Impulsions == 2) // Si le compteur d'impulsions est égal à 2
          {
            Memoire_Bruitage = 2; // On active la mémoire de bruitage à 2
            //Compteur_Impulsions = 0; // On reset le compteur à 0
            //Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Horn1.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }


          //Ancre


          if (Compteur_Impulsions == -1) //Si le compteur d'impulsions est égal à -1
          {
            Memoire_Bruitage = 4; // On active la mémoire de bruitage à 4
            //Compteur_Impulsions = 0; // On reset le compteur à 0
            //Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Ancre.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }


          // Sonnette


          if (Compteur_Impulsions == -2) // Si le compteur d'impulsions est égal à -2
          {
            Memoire_Bruitage = 5; // On active la mémoire de bruitage à 5
            //Compteur_Impulsions = 0; // On reset le compteur à 0
            //Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Ring.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }
        }
        //on rajoute les deux lignes ici
        Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
        Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
      }
      //on les enlève ici
      //Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
      //Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
    }
  }

2) avec des else if (nb : il faut aussi déplacer les 2 lignes) :



if (( Tempo_Cycle_Impulsions) == 1 ) // Si la temporisation de cycle d'impulsions est activée,
  {
    Temps = millis();// On charge le temps actuel dans la variable temps


    if (Temps - Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  ) //Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
    {
      if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
      {


        //BRUITAGE
        if ( Memoire_Impulsion_Longue == 0) // Si la mémoire de l'impulsion longue est désactivée
        {


          // Alarme 1


          if (Compteur_Impulsions == 1) // Si le compteur d'impulsions est égal à 1
          {
            Memoire_Bruitage = 1; // On active la mémoire de bruitage à 1
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Alarm1.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }


          // Corne de brume


          else if (Compteur_Impulsions == 2) // Si le compteur d'impulsions est égal à 2
          {
            Memoire_Bruitage = 2; // On active la mémoire de bruitage à 2
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Horn1.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }


          //Ancre


          else if (Compteur_Impulsions == -1) //Si le compteur d'impulsions est égal à -1
          {
            Memoire_Bruitage = 4; // On active la mémoire de bruitage à 4
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Ancre.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }


          // Sonnette


          else if (Compteur_Impulsions == -2) // Si le compteur d'impulsions est égal à -2
          {
            Memoire_Bruitage = 5; // On active la mémoire de bruitage à 5
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Ring.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
          }

          //aucun autre cas ci dessus est vérifié
          else
          {
            //on rajoute les deux lignes ici
            Compteur_Impulsions = 0;// On désactive le compteur si aucune condition ci-dessus est vraie
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
          }
        }
      }
      //on les enlève ici
      //Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
      //Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
    }
  }

 3) avec le switch :



if (( Tempo_Cycle_Impulsions) == 1 ) // Si la temporisation de cycle d'impulsions est activée,
  {
    Temps = millis();// On charge le temps actuel dans la variable temps


    if (Temps - Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  ) //Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
    {
      if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
      {


        //BRUITAGE
        if ( Memoire_Impulsion_Longue == 0) // Si la mémoire de l'impulsion longue est désactivée
        {


          // Alarme 1


          switch (Compteur_Impulsions)
          {
          case 1: // Si le compteur d'impulsions est égal à 1
            Memoire_Bruitage = 1; // On active la mémoire de bruitage à 1
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Alarm1.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
            break;

          case 2:  // Corne de brume// Si le compteur d'impulsions est égal à 2
            Memoire_Bruitage = 2; // On active la mémoire de bruitage à 2
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Horn1.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
            break;


          case -1: //Ancre  //Si le compteur d'impulsions est égal à -1
            Memoire_Bruitage = 4; // On active la mémoire de bruitage à 4
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Ancre.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
            break;


          case -2: // Sonnette // Si le compteur d'impulsions est égal à -2
            Memoire_Bruitage = 5; // On active la mémoire de bruitage à 5
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Ring.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
            break;

          default : //aucun autre cas ci dessus est vérifié
            //on rajoute les deux lignes ici
            Compteur_Impulsions = 0;// On désactive le compteur si aucune condition ci-dessus est vraie
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
        }
      }
      //on les enlève ici
      //Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
      //Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
    }
  }

 

 

Sinon, tu as testé sur les relais : est-ce que le nouveau code a généré un problème (je demande, car 1) si ça en a généré, on sait que c'est la mauvaise piste et 2) si on ne trouve pas rapidement le bug "comme ça", je penses que le plus simple sera de repartir du code des relais qui marche (en utilisant des fonctions pour le rendre plus générique))

 


  • Mike118 aime ceci

Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#17 paquito

paquito

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France

Posté 25 novembre 2021 - 02:30

Pour info:
 
1- Le code suivant avec les relais, le compteur évolue et est reseté mais aucun relais n'est commandé 
 
      if( Memoire_Impulsion_Longue == 1)//Si la mémoire de l'impulsion longue est activé                
          {
            
  
//RELAIS 7        
           
           if ((Compteur_Impulsions==1)&&(digitalRead (Relais_7)== LOW)) // Si le compteur est égal 1 et que le relais 7 est désactivé
            {
              digitalWrite (Relais_7 ,HIGH);//On active le relais 7
              //Compteur_Impulsions=0;// On reset le compteur à 0
              //Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3     
            }


          
            if ((Compteur_Impulsions==1)&&(digitalRead (Relais_7)== HIGH ))// Si le compteur est égal 1 et que le relais 7 est activé
            {
              digitalWrite (Relais_7 ,LOW);//on désactive le relais 7
              //Compteur_Impulsions=0;// On reset le compteur à 0
              //Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
             }         
         
  //RELAIS 8        
           
           if ((Compteur_Impulsions==2)&&(digitalRead (Relais_8)== LOW)) // Si le compteur est égal 2 et que le relais 8 est désactivé
            {
              digitalWrite (Relais_8 ,HIGH);//On active le relais 8
              //Compteur_Impulsions=0;// On reset le compteur à 0
              //Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3     
            }      
          
          if ((Compteur_Impulsions==2)&&(digitalRead (Relais_8)== HIGH ))// Si le compteur est égal 2 et que le relais 8 est activé
            {
              digitalWrite (Relais_8 ,LOW);//on désactive le relais 8
              //Compteur_Impulsions=0;// On reset le compteur à 0
              //Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
             }                    
          }
       Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
      Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie   
         
         } 
      //Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
      //Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie        
  }    
 }

2- Avec le code suivant, j'ai bien la mélodie de jouée, le compteur est reseté mais le compteur n'évolue pas tant la mélodie n'est pas terminée

 if (( Tempo_Cycle_Impulsions)==1 )// Si la temporisation de cycle d'impulsions est activée,
   {                
    Temps = millis();// On charge le temps actuel dans la variable temps
       
       if (Temps-Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions  )//Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé
        {
          if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
          {             
                      
//BRUITAGE           
              if( Memoire_Impulsion_Longue == 0)// Si la mémoire de l'impulsion longue est désactivée
               {
     
// Alarme 1               
                         
               if(Compteur_Impulsions==1)// Si le compteur d'impulsions est égal à 1
               {               
                               
                Memoire_Bruitage=1;// On active la mémoire de bruitage à 1
                tmrpcm.play("Alarm1.wav");// On diffuse la mélodie               
                Memoire_Bruitage=0;// On reset la mémoire de bruitage à 0
                }               
                
// Corne de brume  
                
               if(Compteur_Impulsions==2)// Si le compteur d'impulsions est égal à 2
               {            
                Memoire_Bruitage=2;// On active la mémoire de bruitage à 2        
                tmrpcm.play("Horn1.wav");// On diffuse la mélodie
                Memoire_Bruitage=0;// On reset la mémoire de bruitage à 0            
                }
                         
//Ancre 
             
               if(Compteur_Impulsions==-1) //Si le compteur d'impulsions est égal à -1
               {         
                Memoire_Bruitage=4; // On active la mémoire de bruitage à 4                         
                tmrpcm.play("Ancre.wav");// On diffuse la mélodie
                Memoire_Bruitage=0;// On reset la mémoire de bruitage à 0
                }              


// Sonnette
            
               if(Compteur_Impulsions==-2)// Si le compteur d'impulsions est égal à -2
               {
                Memoire_Bruitage=5;// On active la mémoire de bruitage à 5
                tmrpcm.play("Ring.wav");// On diffuse la mélodie
                Memoire_Bruitage=0;// On reset la mémoire de bruitage à 0
                } 
            }                
      Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition  ci-dessus est vraie
     Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie         
       }        
  }    
 }

3- Avec le code suivant, j'ai bien la mélodie de jouée, le compteur est reseté mais le compteur n'évolue pas tant la mélodie n'est pas terminée.

 

même problématique  avec des else if 

//BRUITAGE           
              if( Memoire_Impulsion_Longue == 0)// Si la mémoire de l'impulsion longue est désactivée
               {
     
// Alarme 1               
                         
               if(Compteur_Impulsions==1)// Si le compteur d'impulsions est égal à 1
               {                                           
                Memoire_Bruitage=1;// On active la mémoire de bruitage à 1
                Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions 
                tmrpcm.play("Alarm1.wav");// On diffuse la mélodie               
                Memoire_Bruitage=0;// On reset la mémoire de bruitage à 0
                }               
                
// Corne de brume  
                
               else if(Compteur_Impulsions==2)// Si le compteur d'impulsions est égal à 2
               {            
                Memoire_Bruitage=2;// On active la mémoire de bruitage à 2        
                Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions
                tmrpcm.play("Horn1.wav");// On diffuse la mélodie
                Memoire_Bruitage=0;// On reset la mémoire de bruitage à 0            
                }
                         
//Ancre 
             
               else if(Compteur_Impulsions==-1) //Si le compteur d'impulsions est égal à -1
               {         
                Memoire_Bruitage=4; // On active la mémoire de bruitage à 4                         
                Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions
                tmrpcm.play("Ancre.wav");// On diffuse la mélodie
                Memoire_Bruitage=0;// On reset la mémoire de bruitage à 0
                }              


// Sonnette
            
               else if(Compteur_Impulsions==-2)// Si le compteur d'impulsions est égal à -2
               {
                Memoire_Bruitage=5;// On active la mémoire de bruitage à 5
                Compteur_Impulsions = 0;//  On désactive le compteur si aucune condition
                Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions
                tmrpcm.play("Ring.wav");// On diffuse la mélodie
                Memoire_Bruitage=0;// On reset la mémoire de bruitage à 0
                } 


               else
              {
               Compteur_Impulsions = 0;// On désactive le compteur si aucune condition ci-dessus est vraie
               Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
              }           
            }                     
       }        
  }    
 }

4- Avec le code suivant, j'ai bien la mélodie de jouée, le compteur n'est pas toujours ( nouveau bug ) reseté après 4 impulsions mais le compteur n'évolue pas tant la mélodie n'est pas terminée.

 

même problématique avec le switch :

//BRUITAGE           
              if( Memoire_Impulsion_Longue == 0)// Si la mémoire de l'impulsion longue est désactivée
               {
     
// Alarme 1               


          switch (Compteur_Impulsions)
          {
          case 1: // Si le compteur d'impulsions est égal à 1
            Memoire_Bruitage = 1; // On active la mémoire de bruitage à 1
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Alarm1.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
            break;


          case 2:  // Corne de brume// Si le compteur d'impulsions est égal à 2
            Memoire_Bruitage = 2; // On active la mémoire de bruitage à 2
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Horn1.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
            break;

          case -1: //Ancre  //Si le compteur d'impulsions est égal à -1
            Memoire_Bruitage = 4; // On active la mémoire de bruitage à 4
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Ancre.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
            break;

          case -2: // Sonnette // Si le compteur d'impulsions est égal à -2
            Memoire_Bruitage = 5; // On active la mémoire de bruitage à 5
            Compteur_Impulsions = 0; // On reset le compteur à 0
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3
            tmrpcm.play("Ring.wav");// On diffuse la mélodie
            Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0
            break;

          default : //aucun autre cas ci dessus est vérifié
            //on rajoute les deux lignes ici
            Compteur_Impulsions = 0;// On désactive le compteur si aucune condition ci-dessus est vraie
            Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie
        }
      }
    }
  }
 }

5- J'ai les 2 sorties A6 et A7 qui ne fonctionne pas, je l'ai remplacées par D5 et D6, la carte arduino (AZDelivery Mini Nano Card V3.0 Atmega328 CH340 Version à Puce soudée avec câble USB incluant Un E-Book!) a peut être une autre défaillance qui génère ma problématique, je viens d'en recommander une ( la même peut être une erreur de ma part!!!!) sur amazon que j'aurai théoriquement lundi 29/11/2021.

 

6- Ma carte AZDelivery 3 x SPI Reader Mémoire Lecteur Micro SD TF Memory Card Module Shield Compatible avec Arduino incluant Un E-Book! aurait-elle aussi un dysfonctionnement????

 

 

 



#18 paquito

paquito

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France

Posté 12 décembre 2021 - 09:42

Bonjour,

 

J'ai remplacer mon arduino nano atmega 328 ch 340 mais les broches a6 et a7 ne fonctionnent pas en sorties numériques, d'après  mes recherches sur internet cela semble normale.

 

Pouvez-vous me le confirmer?

 

Merci de votre aide



#19 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 12 décembre 2021 - 01:45

Bonjour,

 

J'ai remplacer mon arduino nano atmega 328 ch 340 mais les broches a6 et a7 ne fonctionnent pas en sorties numériques, d'après  mes recherches sur internet cela semble normale.

 

Pouvez-vous me le confirmer?

 

Merci de votre aide

 

En effet A6 et A7 sont uniquement des entrées analogiques.


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#20 paquito

paquito

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France

Posté 05 janvier 2022 - 08:12

Bonsoir à tous, 

 

A l'occasion de la nouvelle année je vous souhaite tous mes vœux de bonheur et surtout une bonne santé, je reviens vers vous concernant ma problématique qui n'est toujours pas résolue.

Afin de vous faciliter  la compréhension de mon code, je l'ai modifié pour qu'il soit  moins " imbriqué et compliqué " et compte 7 parties distinctes qui pourraient être comparées à des "fonctions":

 

- DEFINITION DES VARIABLES

- ACQUISITION ET TRAITEMENT DU SIGNAL DU CANAL 3 DE L'EMETTEUR RC

- COMPTAGE DES IMPULSIONS DU MANCHE DU CANAL 3

- TRAITEMENT DES IMPULSIONS DU CANAL 3

- ACTIVATION DES MELODIES

- DESACTIVATION DE LA MEMOIRE DE BRUITAGE

-  AFFICHAGE DES INFORMATIONS SUR LE MONITEUR SERIE

 

 

//DEFINITION DES VARIABLES


// Le canal 3 Manche côté droit de la RC Graupner à fond en BAS ( mini) et à fond en HAUT (maxi) 


int Signal_Canal_3 = 2;      // Signal du récepteur du canal 3 Broche D2 
int Duree_Signal_Canal_3;     // Durée du signal du canal 3 en microseconde  ( pour visualiser le temps mini et temps maxi sur le moniteur série)


int Valeur_Signal_Canal_3;    // Valeur de la durée du signal du canal 3 convertie en pourcentage ( pour commander les mélodies)


int Temps_Mini_3 = 1070;         // Durée mini de l'impulsion du signal en microseconde ( manche au mini)   ( pour débugger)
int Temps_Maxi_3 = 1870;         // Durée maxi de l'impulsion du signal en microseconde ( manche au maxi)   ( pour débugger)  


//on définit les temporisations
int Tempo_Cycle_Impulsions= 0;// Temporisation du cycle d'impulsions sur le manche du canal 3


//on définit les mémoires utilisées
int Memoire_Valeur_Haute_Canal_3 = 0; // Mémoire de la valeur haute du signal du canal 3 ( +5 volts pour éviter de compter des impulsions lors du maintien du manche en position maxi ou mini)
int Memoire_Bruitage = 0; // Mémoire de bruitage


// On définit le compteur d'impulsion du canal 3
int Compteur_Impulsions= 0;


// On définit la variable du temps actuel en ms
unsigned long Temps;


// On définit la variable du temps de la temporisation de cycle d'impulsions en ms pour mémoriser le temps écoulé depuis son activation 
unsigned long Temps_Tempo_Cycle_Impulsions;  


//on définit les librairies utilisées
#include <SPI.h>// Pour la communication avec la carte SD 
#include <SD.h>  //  Inclure la librairie SD
#include <TMRpcm.h> // bibliothèque de mélodie


TMRpcm tmrpcm;


// on définit la broche du CS du lecteur de carte SD (shield SD)
#define SDPIN 10 


void setup() 
{
Serial.begin(9600);  // Vitesse de transmission


if (!SD.begin(SDPIN)) // On initialise du lecteur de carte micro SD
{
Serial.println("initialisation ratée!");
 return;
}


tmrpcm.speakerPin = 9; // Speaker sur la broche 9
tmrpcm.setVolume(5);// On définit la gestion du volume 0 à 7
tmrpcm.quality(1); // qualité audio 0 ou 1  
}


void loop()
{


 // ACQUISITION ET TRAITEMENT DU SIGNAL DU CANAL 3 DE L'EMETTEUR RC
  
  // On Mesure la durée du signal canal 3 
  Duree_Signal_Canal_3 = pulseIn(Signal_Canal_3, HIGH); 
  
  // On Convertit la durée du signal du canal 3 en pourcentage ( -100% = au manche mini, +100% = au manche maxi, le neutre étant à 0%)
  Valeur_Signal_Canal_3 = map(Duree_Signal_Canal_3,Temps_Mini_3,Temps_Maxi_3,-100,100); 
  
  // Si le signal du canal 3 n'est pas dans la plage de temps ( mini ou maxi) avec une tolérance
  if ( Duree_Signal_Canal_3 <= 1055  || Duree_Signal_Canal_3 >= 1895 ) 
  {
      Valeur_Signal_Canal_3=0;  // On considère que la valeur du  signal du canal 3 est égale à 0% ( manche au neutre)
      Compteur_Impulsions=0;// On reset le compteur à 0
      Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3
  } 
                                                                    


 // COMPTAGE DES IMPULSIONS DU MANCHE DU CANAL 3
     
   if (Memoire_Valeur_Haute_Canal_3 == 0)  // Si la mémoire de la valeur haute du canal 3 est égale à 0 (0V)
   {
        if((Valeur_Signal_Canal_3)>=80) //Si la valeur du signal du canal 3 est supérieure ou égale 80% ( manche considéré au maxi) 
        {
          Memoire_Valeur_Haute_Canal_3 = 1;// On active la mémoire de la valeur haute du signal du canal 3           
          Tempo_Cycle_Impulsions= 1;// On active la temporisation du cycle d'impulsions sur le manche du canal 3
          Compteur_Impulsions++;// On incrémente de 1 dans le compteur  
          delay(100);  // Attente 100ms
        }
        if((Valeur_Signal_Canal_3)<=-80)//Si la valeur du signal du canal 3 est égale -80% ( manche considéré au mini)
        {   
         Memoire_Valeur_Haute_Canal_3 = 1;// On active la mémoire de la valeur haute du signal du canal 3        
         Tempo_Cycle_Impulsions= 1;// On active la temporisation du cycle d'impulsions sur le manche du canal 3
         Compteur_Impulsions--;// On décrémente de 1 dans le compteur  
         delay(100);  // On attend 100ms
        }    
   }


   if((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))//Si la valeur du signal du canal 3 est comprise entre -10% et 10%
   { 
   Memoire_Valeur_Haute_Canal_3= 0;// On désactive la mémoire de la valeur haute du signal du canal 3  
   }


                                                                 
// TRAITEMENT DES IMPULSIONS DU CANAL 3 


 if (( Tempo_Cycle_Impulsions)==0 )//  Si la temporisation est désactivée du cycle d'impulsions sur le manche du canal 3
 {                        
   Temps_Tempo_Cycle_Impulsions = millis();// On charge le temps actuel dans la variable  temps de départ de la temporisation (temps départ temporisation = temps actuel)
 }


  if (( Tempo_Cycle_Impulsions)==1 )// Si la temporisation de cycle d'impulsions est activée,
   {                
    Temps = millis();// On charge le temps actuel dans la variable temps
       
       if (Temps-Temps_Tempo_Cycle_Impulsions >= 3000)//Si la temporisation du cycle d'impulsions sur le manche du canal 3 est supérieure à 3 secondes
        {         
          if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3  au neutre )
          {             
           Memoire_Bruitage = Compteur_Impulsions;// On charge la valeur du compteur dans la mémoire de bruitage
           Compteur_Impulsions = 0;// On reset le compteur à 0
           Tempo_Cycle_Impulsions = 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3           


          }
        }
   }


          
//ACTIVATION DES MELODIES
     
// Alarme 1               
                         
  if(Memoire_Bruitage==1)// Si la mémoire de bruitage est égal à 1
  {                         
  tmrpcm.play("Alarm1.wav");// On diffuse la mélodie                        
  }               
                
// Corne de brume  
               
  if(Memoire_Bruitage==2)// Si la mémoire de bruitage est égal à 2
  {               
  tmrpcm.play("Horn1.wav");// On diffuse la mélodie                         
  }
                         
//Ancre 
             
  if(Memoire_Bruitage==-1) //Si la mémoire de bruitage est égal à -1
  {                     
  tmrpcm.play("Ancre.wav");// On diffuse la mélodie                                                          
  }              


// Sonnette
            
  if(Memoire_Bruitage==-2)// Si la mémoire de bruitage est égal à -2
  {
  tmrpcm.play("Ring.wav");// On diffuse la mélodie
  }




// DESACTIVATION DE LA MEMOIRE DE BRUITAGE


 if (Compteur_Impulsions==0)
 {
 Memoire_Bruitage=0;
 }




// AFFICHAGE DES INFORMATIONS SUR LE MONITEUR SERIE


 // On affiche la valeur du compteur sur le moniteur série
 Serial.print(" Compteur = ");
 Serial.println(Compteur_Impulsions);
      
 // On affiche la valeur de la mémoire de bruitage sur le moniteur série
 Serial.print(" Memoire de Bruitage = ");
 Serial.println(Memoire_Bruitage);


delay (100); // Pas nécessaire mais on attend 0.1 seconde avant d'afficher d'autres valeurs sur le moniteur série ( pour débugger)
}

Dans l'attente de vos réponses, je vous remercie à l'avance





Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users