//DEFINITION DES VARIABLES

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

// Le canal 3 Manche côté droit de la RC Graupner MC 15 à 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 é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, 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)
}