/*================ 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 ==================================== |