/*================ Huit boutons sur une voie avec mémorisation d’un bouton à une action =====================  
Sketch de Mr Alain CLAVERIE modifié pour piloter des modules carte 8 relais chinois avec plus commun: http://bateaux.trucs.free.fr/huit_sorties_auto_v3.html
Nous trouvons un cavalier appelé (Mode_programmation)  sur le pin 10 et le GND
Le récepteur sur le pin 0
Les huit leds sur les pins  1,2,3,4,5,6,7,8
INITIALISATION
•  Ne pas mettre le cavalier
• Allumer l’émetteur 
• Allumer le récepteur (le led_1 clignote longuement, puis le clignotement cesse, toutes les leds restent allumées
• Appuyer  brièvement sur le bouton_1 du clavier (la led_1  s’éteint) 
• Appuyer  brièvement sur le bouton_2 du clavier (la led_2  s’éteint) 
• Appuyer  brièvement sur le bouton_3 du clavier (la led_3  s’éteint) 
• Appuyer  brièvement sur le bouton_4 du clavier (la led_4  s’éteint) 
• Appuyer  brièvement sur le bouton_5 du clavier (la led_5  s’éteint) 
• Appuyer  brièvement sur le bouton_6 du clavier (la led_6  s’éteint) 
• Appuyer  brièvement sur le bouton_7 du clavier (la led_7  s’éteint) 
• Appuyer  brièvement sur le bouton_8 du clavier (la led_8  s’éteint) 
• Toutes les leds sont éteintes, l’initialisation est terminée
• Eteindre le récepteur


FONCTIONNEMENT

• Mettre le cavalier en place
• Allumer l’émetteur
• Allumer le récepteur

REMARQUES 
les leds se programment successivement  dans l'ordre 1,2,3,4,5,6,7,8. mais nous ne sommes pas obligé d'appuyer successivement sur les boutons dans l'ordre 1,2,3,4,5,6,7,8. si par exemple on appuie dans cet ordre 4,2,1,3,5,6,7,8 alors la led_1 sera affectée au bouton_4. la led_2 au bouton_2. la led_3 au bouton_1 etc...
le problème du programme. si nous nous sommes trompé il faut tout recommencer
 
===============================================================================================*/
#include <EEPROM.h>  // Appel de la  librairie avr /eeprom 
#define signal                   0 
#define Mode_programmation       10 // Ici est connecté le cavalier
int MST =LOW ;                         // variable mise sous tension
int etatsortie =LOW;            // variable d'état de la LED
int led[] = {1,2,3,4,5,6,7,8}, Execution[8], x[8], val[8];
/******************************************************************************************************
/    La ligne suivante   "int choix[] = {1,1,1,1,0,0,0,0};"    Défini le mode de sortie des huit leds /
/    (1) type télé rupteur  un appui allume la led un deuxième appui éteint la led                    /
/        Dans notre exemple  c’est le cas des 4 premiers boutons                                       /
/    (0) Type bouton poussoir un appui maintenu allume la led un lâché du bouton éteint la led         /
/        Dans notre exemple  c’est le cas des 4 derniers boutons                                       /
********************************************************************************************************/
int choix[] = {1,1,0,0,0,0,0,1};    
int plage_Execution = 30;           // Plage de l'Execution, ne pas descendre en dessous de 20 par securité  
int n, i,val1, val2, Execution1, programmation, z=0, neutre;
//==================================================================================
void setup()
{ 
 
 pinMode(Mode_programmation, INPUT);  digitalWrite(Mode_programmation,HIGH);
 for ( n = 0; n < 8; n ++) { pinMode(led [n],OUTPUT); digitalWrite(led[n] ,etatsortie);}
 programmation = digitalRead(Mode_programmation);
 if (programmation == HIGH)     {  
 for ( i = 0; i < 20; i ++) { digitalWrite( led[z],HIGH); delay(30); digitalWrite(led[z],LOW); delay(30);}
}
 for ( n = 0; n < 8; n ++) {Execution[n] = 8* EEPROM.read (n); }
n=0;
}
 
//==================================================================================
void loop()
{ 
  if (programmation == HIGH) {  memorisation();}
  else {marche(); }
}
//==================================================================================
void memorisation(){
 delay(50);
 neutre = pulseIn(signal, HIGH); 
 delay(50);
 for( n = 0; n < 8;n ++){ 
 val1 = pulseIn(signal, HIGH);
   if (val1 < neutre - 50 || val1 > neutre + 50) {
     val[n]= val1/8;  EEPROM.write ( n,val[n]); delay(20); digitalWrite(led [n],HIGH); delay(1000);  } 
 else {n = n-1;}
 }
programmation = LOW; delay(100000);
}
//==================================================================================
void marche(){
 if (MST ==LOW) {for ( n = 0; n < 8; n ++) digitalWrite(led[n], HIGH);  delay(20);   MST= HIGH; }  
val1 = pulseIn(signal, HIGH);  delay(20);   val2 = pulseIn(signal, HIGH);
n = 0; test();   n = 1; test();   n = 2; test(); n = 3; test();
n = 4; test();   n = 5; test();   n = 6; test(); n = 7; test();
}
//----------------------------------- TEST ---------------------------------------------------------
void test(){
  if (choix[n] == 1){
     if (val1  > (Execution[n] - plage_Execution) && val1 < (Execution[n] + plage_Execution) &&
         val2  > (Execution[n] - plage_Execution) && val2 < (Execution[n] + plage_Execution)) { Action_1();  } 
     
}
  if (choix[n] == 0){
     if (val1  > (Execution[n] - plage_Execution) && val1 < (Execution[n] + plage_Execution) &&
         val2  > (Execution[n] - plage_Execution) && val2 < (Execution[n] + plage_Execution)) { Action_2();  }
        else { Action_3();} 
}
}
//----------------------------------- ACTION_1 ---------------------------------------------------------
void Action_1()
{  
   if (x[n] == HIGH) {digitalWrite(led[n], HIGH);delay(1000);      x[n] = !x[n]; }
                else {digitalWrite(led[n], LOW);  delay(1000);   x[n] = !x[n]; }                      
}
//----------------------------------- ACTION_2 ---------------------------------------------------------
void Action_2() {  { digitalWrite(led[n], LOW);  }  }
//----------------------------------- ACTION_3 ---------------------------------------------------------
void Action_3() {  { digitalWrite(led[n], HIGH);   }  }
//=========================== Fin du programme ====================================