/*=========== Lecture 2voies  proportionnelles pour piloter 4 relais  ================
Les 2 manches au neutre à la mise en route       ==> les  4 relais sont "off"
Pour les radios programmablles, débattements à 100%
Malheureusement les relais chinois que j'utilise fonctionne en logique inverse, donc relai appelé lorsque sortie Arduino = LOW
Donc ce programme est adapté en consequence (les sortie sont HIGH au repos)

Voie 1 en haut (v1h) une première fois         ==>Relais 1 est "on"
Voie 1 en haut (v1h) une deuxième fois         ==>Relais 1 est "off"
Voie 1 en bas (v1b) une première fois          ==>Relais 2 est "on"
Voie 1 en bas (v1b) une deuxième fois          ==>Relais 2 est "off"
Voie 2 à gauche (v2g) une première fois        ==>Relais 3 est "on"
Voie 2 à gauche (v2g) une deuxième fois        ==>Relais 3 est "off"
Voie 2 à droite(v2d) une première fois        ==>Relais 4 est "on"
Voie 2 à droite(v2d) une deuxième fois        ==>Relais 4 est "off"
                    
========================================================================= */
int signal1 = 2;         // Déclare le signal voie 1 sur le pin 2
int val1;                // Valeur du signal voie 1

int comptv1h = 0;        // Compteur passage v1h
int etatv1h = LOW;       // L'état de la position voie 1 en haut
int memv1h = LOW;        // La mémoire de l'état de la position voie 1 en haut

int comptv1b = 0;       // Compteur passage v1h
int etatv1b = LOW;      // L'état de la position voie 1 en bas
int memv1b = LOW;       // La mémoire de l'état de la position voie 1 en bas

int signal2 = 3;        // Déclare le signal voie 2 sur le pin 3
int val2;               // Valeur du signal voie 2

int comptv2g = 0;        // Compteur passage v2g
int etatv2g = LOW;       // L'état de la position voie 2 à gauche
int memv2g = LOW;        // La mémoire de l'état de la position voie 2 à gauche

int comptv2d = 0;       // Compteur passage v2d
int etatv2d = LOW;      // L'état de la position voie 2 à droite
int memv2d = LOW;       // La mémoire de l'état de la position voie 2 à droite


int mini = 1000;        // Valeur mini du signal
int maxi = 2000;        // Valeur maxi du signal

const int rel1 = 4;     // Relais 1 monté par voie 1 haute (v1h)
const int rel2 = 5;     // Relais 2 monté par voie 1 basse (v1b)
const int rel3 = 6;     // Relais 3 monté par voie 2 gauche (v2g)
const int rel4 = 7;     // Relais 4 monté par voie 2 droite (v2d)

void setup()
{
  
  
  pinMode(signal1, INPUT); // Déclare signal 1 comme une entrée
  pinMode(signal2, INPUT); // Déclare signal 2 comme une entrée
  pinMode(rel1, OUTPUT);      // Déclare le pin 4 en sortie
  pinMode(rel2, OUTPUT);      // Déclare le pin 5 en sortie
  pinMode(rel3, OUTPUT);      // Déclare le pin 6 en sortie
  pinMode(rel4, OUTPUT);      // Déclare le pin 7 en sortie

  digitalWrite(rel1, HIGH);        // SORTIE4 (OFF) 
  digitalWrite(rel2, HIGH);        // SORTIE5 (OFF)
  digitalWrite(rel3, HIGH);        // SORTIE6 (OFF) 
  digitalWrite(rel4, HIGH);        // SORTIE7 (OFF)
  
}

void loop()
{
  val1 = pulseIn(signal1, HIGH), 30000;          //Lire signal voie1 et de le stocker en tant que val1
  val1 = map(val1, mini, maxi, 1000, 2000);      //Met en forme le signal entre 1000 et 2000
  val1 = constrain(val1, 1000, 2000);            //Contraint le signal entre 1000 et 2000

  
  val2 = pulseIn(signal2, HIGH), 30000;          //Lire signal voie 2 et de le stocker en tant que val2
  val2 = map(val2, mini, maxi, 1000, 2000);      //Met en forme le signal entre 1000 et 2000
  val2 = constrain(val2, 1000, 2000);            //Contraint le signal entre 1000 et 2000
   
  
  //---------------------------------------------------------------------------------- 
  // TRAITEMENT SIGNAL VOIE 1, POINT HAUT
  //---------------------------------------------------------------------------------- 
  
  // Si le signal voie 1 à sa valeur haute >1900, on passe son état à HIGH

  if ((val1 > 1900) && (val1 < 2001))  // Voie1 en haut
      {
   etatv1h = HIGH;     //on passe l'état voie 1 en haut à HIGH
      }
   else
       {
   etatv1h = LOW;     //Sinon, on passe l'état voie 1 en haut à LOW
         }
  
  //---------------------------------------------------------------------------------- 
  
  if((etatv1h != memv1h) && (etatv1h == HIGH) && (comptv1h == 0))   // Si le signal voie 1 haute a un état différent de celui enregistré et que cet état est "haut" + compteur=0 
    
    {
    
        comptv1h = 1;                // on passe le compteur à 1
        memv1h = etatv1h;           // on enregistre en mémoire l'état de la position voie 1 en haut pour le tour suivant
        digitalWrite(rel1, LOW);   // relais 1 passe à ON (logique inverse)
    }
 
  //---------------------------------------------------------------------------------- 
  
  if((etatv1h != memv1h) && (etatv1h == LOW) && (comptv1h == 1))   // Si le signal voie 1 haute a un état différent de celui enregistré et que cet état est "LOW" + compteur=1  (on à quitté le point haut)
    
    {
    
        
        memv1h = 0;          // on enregistre en mémoire l'état de la position voie 1  pour le tour suivant
        comptv1h = 2;        // on passe le compteur à 2
    }  
  //---------------------------------------------------------------------------------- 
  
  if((etatv1h != memv1h) && (etatv1h == HIGH) && (comptv1h == 2))   // Si le signal voie 1 haute a un état différent de celui enregistré et que cet état est "haut" + compteur=2  (deuxième tour)
    
    {
        memv1h = etatv1h;           // on enregistre en mémoire l'état de la position voie 1 en haut pour le tour suivant
        comptv1h = 3;                // on passe le compteur à 3
        digitalWrite(rel1, HIGH);    // relais 1 passe à OFF (logique inverse)
    }
 //---------------------------------------------------------------------------------- 
  
  if((etatv1h != memv1h) && (etatv1h == LOW) && (comptv1h == 3))   // Si le signal voie 1 haute a un état différent de celui enregistré et que cet état est "LOW" + compteur=3  (on à quitté le point haut, deuxième tour)
    
    {
    
        
        memv1h = 0;          // on enregistre en mémoire l'état de la position voie 1  pour le tour suivant
        comptv1h = 0;        // on passe le compteur à 0
    }  
   
  //---------------------------------------------------------------------------------- 
  // TRAITEMENT SIGNAL VOIE 1, POINT BAS
  //----------------------------------------------------------------------------------  
  // Si le signal voie 1 à sa valeur basse <1100, on passe son état à HIGH

  if ((val1 < 1100) && (val1 > 999))  // Voie1 en bas
      {
   etatv1b = HIGH;     //on passe l'état voie 1 en bas à HIGH
      }
   else
       {
   etatv1b = LOW;     //Sinon, on passe l'état voie 1 en bas à LOW
      }
  //---------------------------------------------------------------------------------- 
  
  if((etatv1b != memv1b) && (etatv1b == HIGH) && (comptv1b == 0))   // Si le signal voie 1 basse a un état différent de celui enregistré et que cet état est "haut" + compteur=0 
    
    {
    
        comptv1b = 1;                // on passe le compteur à 1
        memv1b = etatv1b;           // on enregistre en mémoire l'état de la position voie 1 en bas pour le tour suivant
        digitalWrite(rel2, LOW);   // relais 2 passe à ON (logique inverse)
    }
  //---------------------------------------------------------------------------------- 
  
  if((etatv1b != memv1b) && (etatv1b == LOW) && (comptv1b == 1))   // Si le signal voie 1 basse a un état différent de celui enregistré et que cet état est "LOW" + compteur=1  (on à quitté le point bas)
    
    {
    
        
        memv1b = 0;          // on enregistre en mémoire l'état de la position voie 1  pour le tour suivant
        comptv1b = 2;        // on passe le compteur à 2
    }  
  //---------------------------------------------------------------------------------- 
   if((etatv1b != memv1b) && (etatv1b == HIGH) && (comptv1b == 2))   // Si le signal voie 1 basse a un état différent de celui enregistré et que cet état est "haut" + compteur=2  (deuxième tour)
    
    {
        memv1b = etatv1b;           // on enregistre en mémoire l'état de la position voie 1 en bas pour le tour suivant
        comptv1b = 3;                // on passe le compteur à 3
        digitalWrite(rel2, HIGH);    // relais 2 passe à OFF (logique inverse)
    }
 //---------------------------------------------------------------------------------- 
  
  if((etatv1b != memv1b) && (etatv1b == LOW) && (comptv1b == 3))   // Si le signal voie 1 basse a un état différent de celui enregistré et que cet état est "LOW" + compteur=3  (on à quitté le point bas, deuxième tour)
    
    {
    
        
        memv1b = 0;          // on enregistre en mémoire l'état de la position voie 1  pour le tour suivant
        comptv1b = 0;        // on passe le compteur à 0
    }  
   
 //---------------------------------------------------------------------------------- 
  // TRAITEMENT SIGNAL VOIE 2, A GAUCHE
  //---------------------------------------------------------------------------------- 
  
  // Si le signal voie 2 à sa valeur haute >1900, on passe son état à HIGH

  if ((val2 > 1900) && (val2 < 2001))  // Voie 2 à gauche
      {
   etatv2g = HIGH;     //on passe l'état voie 2 à gauche à HIGH
      }
   else
       {
   etatv2g = LOW;     //Sinon, on passe l'état voie 2 à gauche à LOW
         }
  
  //---------------------------------------------------------------------------------- 
  
  if((etatv2g != memv2g) && (etatv2g == HIGH) && (comptv2g == 0))   // Si le signal  Voie 2 à gauche a un état différent de celui enregistré et que cet état est "haut" + compteur=0 
    
    {
    
        comptv2g = 1;                // on passe le compteur à 1
        memv2g = etatv2g;           // on enregistre en mémoire l'état de la position Voie 2 à gauche pour le tour suivant
        digitalWrite(rel3, LOW);   // relais 3 passe à ON (logique inverse)
    }
 
  //---------------------------------------------------------------------------------- 
  
  if((etatv2g != memv2g) && (etatv2g == LOW) && (comptv2g == 1))   // Si le signal Voie 2 à gauche a un état différent de celui enregistré et que cet état est "LOW" + compteur=1  (on a quitté le point gauche)
    
    {
    
        
        memv2g = 0;          // on enregistre en mémoire l'état de la position  Voie 2 pour le tour suivant
        comptv2g = 2;        // on passe le compteur à 2
    }  
  //---------------------------------------------------------------------------------- 
  
  if((etatv2g != memv2g) && (etatv2g == HIGH) && (comptv2g == 2))   // Si le signal Voie 2 à gauche a un état différent de celui enregistré et que cet état est "haut" + compteur=2  (deuxième tour)
    
    {
        memv2g = etatv2g;           // on enregistre en mémoire l'état de la position Voie 2 à gauche pour le tour suivant
        comptv2g = 3;                // on passe le compteur à 3
        digitalWrite(rel3, HIGH);    // relais 3 passe à OFF (logique inverse)
    }
 //---------------------------------------------------------------------------------- 
  
  if((etatv2g != memv2g) && (etatv2g == LOW) && (comptv2g == 3))   // Si le signal Voie 2 à gauche a un état différent de celui enregistré et que cet état est "LOW" + compteur=3  (on a quitté le point gauche, deuxième tour)
    
    {
    
        
        memv2g = 0;          // on enregistre en mémoire l'état de la position Voie 2  pour le tour suivant
        comptv2g = 0;        // on passe le compteur à 0
    }  
   
  //---------------------------------------------------------------------------------- 
  // TRAITEMENT SIGNAL VOIE 2, POINT A DROITE
  //----------------------------------------------------------------------------------  
  // Si le signal voie 2 à sa valeur basse <1100, on passe son état à HIGH

  if ((val2 < 1100) && (val2 > 999))  // Voie 2 à droite
      {
   etatv2d = HIGH;     //on passe l'état voie 2 à droite à HIGH
      }
   else
       {
   etatv2d = LOW;     //Sinon, on passe l'état voie 2 à droite à LOW
      }
  //---------------------------------------------------------------------------------- 
  
  if((etatv2d != memv2d) && (etatv2d == HIGH) && (comptv2d == 0))   // Si le signal Voie 2 à droite a un état différent de celui enregistré et que cet état est "haut" + compteur=0 
    
    {
    
        comptv2d = 1;                // on passe le compteur à 1
        memv2d = etatv2d;           // on enregistre en mémoire l'état de la position  Voie 2 à droite pour le tour suivant
        digitalWrite(rel4, LOW);   // relais 4 passe à ON (logique inverse)
    }
  //---------------------------------------------------------------------------------- 
  
  if((etatv2d != memv2d) && (etatv2d == LOW) && (comptv2d == 1))   // Si le signal Voie 2 à droite a un état différent de celui enregistré et que cet état est "LOW" + compteur=1  (on à quitté le point droit)
    
    {
    
        
        memv2d = 0;          // on enregistre en mémoire l'état de la position voie 2  pour le tour suivant
        comptv2d = 2;        // on passe le compteur à 2
    }  
  //---------------------------------------------------------------------------------- 
   if((etatv2d != memv2d) && (etatv2d == HIGH) && (comptv2d == 2))   // Si le signal Voie 2 à droite a un état différent de celui enregistré et que cet état est "haut" + compteur=2  (deuxième tour)
    
    {
        memv2d = etatv2d;           // on enregistre en mémoire l'état de la position Voie 2 à droite pour le tour suivant
        comptv2d = 3;                // on passe le compteur à 3
        digitalWrite(rel4, HIGH);    // relais 4 passe à OFF (logique inverse)
    }
 //---------------------------------------------------------------------------------- 
  
  if((etatv2d != memv2d) && (etatv2d == LOW) && (comptv2d == 3))   // Si le signal Voie 2 à droite a un état différent de celui enregistré et que cet état est "LOW" + compteur=3  (on à quitté le point droit, deuxième tour)
    
    {
    
        
        memv2d = 0;          // on enregistre en mémoire l'état de la position voie 1  pour le tour suivant
        comptv2d = 0;        // on passe le compteur à 0
    }  
   
  //----------------------------------------------------------------------------------
     
       }