/*=========== Lecture 2voies proportionnelles pour piloter 8 relais ================ Les 2 manches au neutre à la mise en route ==> les 8 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) On utilise les 8 positions cardinales des 2 manches pour piloter les 8 relais Dans ce sketch lecture de la valeur des voies sur le moniteur série (peu être supprimée) ========================================================================= */ int signal1 = 2; // Déclare le signal voie 1 sur le pin 2 int val1; // Valeur du signal voie 1 int signal2 = 3; // Déclare le signal voie 2 sur le pin 3 int val2; // Valeur du signal voie 2 int cpt1 = 0; // Compteur point 1 int etatpt1 = LOW; // L'état de la position point 1 (voie 1 en haut) int mempt1 = LOW; // La mémoire de l'état de la position point 1 (voie 1 en haut) int cpt2 = 0; // Compteur point 2 int etatpt2 = LOW; // L'état de la position point 2 (voie 1 en bas) int mempt2 = LOW; // La mémoire de l'état de la position point 2 (voie 1 en bas) int cpt3 = 0; // Compteur point 3 int etatpt3 = LOW; // L'état de la position point 3 (voie 2 à gauche) int mempt3 = LOW; // La mémoire de l'état de la position point 3 (voie 2 à gauche) int cpt4 = 0; // Compteur point 4 int etatpt4 = LOW; // L'état de la position point 4 (voie 2 à droite) int mempt4 = LOW; // La mémoire de l'état de la position point 4 (voie 2 à droite) int cpt5 = 0; // Compteur point 5 int etatpt5 = LOW; // L'état de la position point 5 (voie 1 en haut et voie 2 à gauche en position médiane) int mempt5 = LOW; // La mémoire de l'état de la position point 5 (voie 1 en haut et voie 2 à gauche en position médiane) int cpt6 = 0; // Compteur point 6 int etatpt6 = LOW; // L'état de la position point 6 (voie 1 en bas et voie 2 à droite en position médiane) int mempt6 = LOW; // La mémoire de l'état de la position point 6 (voie 1 en bas et voie 2 à droite en position médiane) int cpt7 = 0; // Compteur point 7 int etatpt7 = LOW; // L'état de la position point 7 (voie 1 en bas et voie 2 à gauche en position médiane) int mempt7 = LOW; // La mémoire de l'état de la position point 75 (voie 1 en bas et voie 2 à gauche en position médiane) int cpt8 = 0; // Compteur point 8 int etatpt8 = LOW; // L'état de la position point 8 (voie 1 en haut et voie 2 à droite en position médiane) int mempt8 = LOW; // La mémoire de l'état de la position point 6 (voie 1 en haut et voie 2 à droite en position médiane) int mini = 1000; // Valeur mini du signal int maxi = 2000; // Valeur maxi du signal const int rel1 = 4; // Relais 1 monté par pt1 const int rel2 = 5; // Relais 2 monté par pt2 const int rel3 = 6; // Relais 3 monté par pt3 const int rel4 = 7; // Relais 4 monté par pt4 const int rel5 = 8; // Relais 5 monté par pt5 const int rel6 = 9; // Relais 6 monté par pt6 const int rel7 = 10; // Relais 7 monté par pt7 const int rel8 = 11; // Relais 8 monté par pt8 void setup() { Serial.begin(9600); 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 pinMode(rel5, OUTPUT); // Déclare le pin 8 en sortie pinMode(rel6, OUTPUT); // Déclare le pin 9 en sortie pinMode(rel7, OUTPUT); // Déclare le pin 10 en sortie pinMode(rel8, OUTPUT); // Déclare le pin 11 en sortie digitalWrite(rel1, HIGH); // SORTIE4 (OFF) digitalWrite(rel2, HIGH); // SORTIE5 (OFF) digitalWrite(rel3, HIGH); // SORTIE6 (OFF) digitalWrite(rel4, HIGH); // SORTIE7 (OFF) digitalWrite(rel5, HIGH); // SORTIE8 (OFF) digitalWrite(rel6, HIGH); // SORTIE9 (OFF) digitalWrite(rel7, HIGH); // SORTIE10 (OFF) digitalWrite(rel8, HIGH); // SORTIE11 (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 (PT1) //---------------------------------------------------------------------------------- // Si le signal voie 1 à sa valeur haute >1900, on passe son état à HIGH if ((val1 > 1900) && (val1 < 2001) && (val2 < 1600) && (val2 > 1400)) // Voie1 en haut et voie 2 au milieu { etatpt1 = HIGH; //on passe l'état point 1 à HIGH } else { etatpt1 = LOW; //Sinon, on passe l'état point 1 à LOW } //---------------------------------------------------------------------------------- if((etatpt1 != mempt1) && (etatpt1 == HIGH) && (cpt1 == 0)) // Si le signal point 1 a un état différent de celui enregistré et que cet état est "haut" + compteur=0 { cpt1 = 1; // on passe le compteur à 1 mempt1 = etatpt1; // on enregistre en mémoire l'état de la position point 1 pour le tour suivant digitalWrite(rel1, LOW); // relais 1 passe à ON (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt1 != mempt1) && (etatpt1 == LOW) && (cpt1 == 1)) // Si le signal point 1 a un état différent de celui enregistré et que cet état est "LOW" + compteur=1 (on à quitté le point 1) { mempt1 = 0; // on enregistre en mémoire l'état de la position point 1 pour le tour suivant cpt1 = 2; // on passe le compteur à 2 } //---------------------------------------------------------------------------------- if((etatpt1 != mempt1) && (etatpt1 == HIGH) && (cpt1 == 2)) // Si le signal point 1 a un état différent de celui enregistré et que cet état est "haut" + compteur=2 (deuxième tour) { mempt1 = etatpt1; // on enregistre en mémoire l'état de la position point 1 pour le tour suivant cpt1 = 3; // on passe le compteur à 3 digitalWrite(rel1, HIGH); // relais 1 passe à OFF (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt1 != mempt1) && (etatpt1 == LOW) && (cpt1 == 3)) // Si le signal point 1 a un état différent de celui enregistré et que cet état est "LOW" + compteur=3 (on à quitté le point 1, deuxième tour) { mempt1 = 0; // on enregistre en mémoire l'état de la position point 1 pour le tour suivant cpt1 = 0; // on passe le compteur à 0 } //---------------------------------------------------------------------------------- // TRAITEMENT SIGNAL VOIE 1, POINT BAS (PT2) //---------------------------------------------------------------------------------- // Si le signal voie 1 à sa valeur basse <1100, on passe son état à HIGH if ((val1 < 1100) && (val1 > 999) && (val2 < 1600) && (val2 > 1400)) // Voie 1 en bas et voie 2 au milieu { etatpt2 = HIGH; //on passe l'état voie 1 en bas à HIGH } else { etatpt2 = LOW; //Sinon, on passe l'état voie 1 en bas à LOW } //---------------------------------------------------------------------------------- if((etatpt2 != mempt2) && (etatpt2 == HIGH) && (cpt2 == 0)) // Si le signal point 2 a un état différent de celui enregistré et que cet état est "haut" + compteur=0 { cpt2 = 1; // on passe le compteur à 1 mempt2 = etatpt2; // on enregistre en mémoire l'état de la position point 2 pour le tour suivant digitalWrite(rel2, LOW); // relais 2 passe à ON (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt2 != mempt2) && (etatpt2 == LOW) && (cpt2 == 1)) // Si le signal point 2 a un état différent de celui enregistré et que cet état est "LOW" + compteur=1 (on à quitté le point 2) { mempt2 = 0; // on enregistre en mémoire l'état de la position point 2 pour le tour suivant cpt2 = 2; // on passe le compteur à 2 } //---------------------------------------------------------------------------------- if((etatpt2 != mempt2) && (etatpt2 == HIGH) && (cpt2 == 2)) // Si le signal point 2 a un état différent de celui enregistré et que cet état est "haut" + compteur=2 (deuxième tour) { mempt2 = etatpt2; // on enregistre en mémoire l'état de la position point 2 pour le tour suivant cpt2 = 3; // on passe le compteur à 3 digitalWrite(rel2, HIGH); // relais 2 passe à OFF (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt2 != mempt2) && (etatpt2 == LOW) && (cpt2 == 3)) // Si le signal point 2 a un état différent de celui enregistré et que cet état est "LOW" + compteur=3 (on à quitté le point 2, deuxième tour) { mempt2 = 0; // on enregistre en mémoire l'état de la position point 2 pour le tour suivant cpt2 = 0; // on passe le compteur à 0 } //---------------------------------------------------------------------------------- // TRAITEMENT SIGNAL VOIE 2, A GAUCHE (POINT 3) //---------------------------------------------------------------------------------- // Si le signal voie 2 à sa valeur haute >1900, on passe son état à HIGH if ((val2 > 1900) && (val2 < 2001) && (val1 < 1600) && (val1 > 1400)) // Voie 2 à gauche et Voie 1 au milieu { etatpt3 = HIGH; //on passe l'état point 3 à HIGH } else { etatpt3 = LOW; //Sinon, on passe l'état point 3 à LOW } //---------------------------------------------------------------------------------- if((etatpt3 != mempt3) && (etatpt3 == HIGH) && (cpt3 == 0)) // Si le signal point 3 a un état différent de celui enregistré et que cet état est "haut" + compteur=0 { cpt3 = 1; // on passe le compteur à 1 mempt3 = etatpt3; // on enregistre en mémoire l'état de la position point 3 pour le tour suivant digitalWrite(rel3, LOW); // relais 3 passe à ON (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt3 != mempt3) && (etatpt3 == LOW) && (cpt3 == 1)) // Si le signal point 3 a un état différent de celui enregistré et que cet état est "LOW" + compteur=1 (on a quitté le point 3) { mempt3 = 0; // on enregistre en mémoire l'état de la position point 3 pour le tour suivant cpt3 = 2; // on passe le compteur à 2 } //---------------------------------------------------------------------------------- if((etatpt3 != mempt3) && (etatpt3 == HIGH) && (cpt3 == 2)) // Si le signal point 3 a un état différent de celui enregistré et que cet état est "haut" + compteur=2 (deuxième tour) { mempt3 = etatpt3; // on enregistre en mémoire l'état de la position point 3 pour le tour suivant cpt3 = 3; // on passe le compteur à 3 digitalWrite(rel3, HIGH); // relais 3 passe à OFF (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt3 != mempt3) && (etatpt3 == LOW) && (cpt3 == 3)) // Si le signal point 3 a un état différent de celui enregistré et que cet état est "LOW" + compteur=3 (on a quitté le point 3, deuxième tour) { mempt3 = 0; // on enregistre en mémoire l'état de la position Voie 2 pour le tour suivant cpt3 = 0; // on passe le compteur à 0 } //---------------------------------------------------------------------------------- // TRAITEMENT SIGNAL VOIE 2, A DROITE (POINT 4) //---------------------------------------------------------------------------------- // Si le signal voie 2 à sa valeur basse <1100, on passe son état à HIGH if ((val2 < 1100) && (val2 > 999) && (val1 < 1600) && (val1 > 1400)) // Voie 2 à droite et Voie 1 au milieu { etatpt4 = HIGH; //on passe l'état point 4 à HIGH } else { etatpt4 = LOW; //Sinon, on passe l'état point 4 à LOW } //---------------------------------------------------------------------------------- if((etatpt4 != mempt4) && (etatpt4 == HIGH) && (cpt4 == 0)) // Si le signal point 4 a un état différent de celui enregistré et que cet état est "haut" + compteur=0 { cpt4 = 1; // on passe le compteur à 1 mempt4 = etatpt4; // on enregistre en mémoire l'état de la position point 4 pour le tour suivant digitalWrite(rel4, LOW); // relais 4 passe à ON (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt4 != mempt4) && (etatpt4 == LOW) && (cpt4 == 1)) // Si le signal point 4 a un état différent de celui enregistré et que cet état est "LOW" + compteur=1 (on à quitté le point 4) { mempt4 = 0; // on enregistre en mémoire l'état de la position point 4 pour le tour suivant cpt4 = 2; // on passe le compteur à 2 } //---------------------------------------------------------------------------------- if((etatpt4 != mempt4) && (etatpt4 == HIGH) && (cpt4 == 2)) // Si le signal point 4 a un état différent de celui enregistré et que cet état est "haut" + compteur=2 (deuxième tour) { mempt4 = etatpt4; // on enregistre en mémoire l'état de la position point 4 pour le tour suivant cpt4 = 3; // on passe le compteur à 3 digitalWrite(rel4, HIGH); // relais 4 passe à OFF (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt4 != mempt4) && (etatpt4 == LOW) && (cpt4 == 3)) // Si le signal point 4 a un état différent de celui enregistré et que cet état est "LOW" + compteur=3 (on à quitté le point 4, deuxième tour) { mempt4 = 0; // on enregistre en mémoire l'état de la position point 4 pour le tour suivant cpt4 = 0; // on passe le compteur à 0 } //---------------------------------------------------------------------------------- // TRAITEMENT SIGNAL VOIE1 + VOIE 2, V1 en HAUT et V2 à GAUCHE EN POSITION MEDIANE (POINT 5) //---------------------------------------------------------------------------------- // Si le signal voie 1 à sa valeur comprise entre 1850 et 2001 ainsi que la voie 2, on est sur le point 5 if ((val1 < 2001) && (val1 > 1850) && (val2 < 2001) && (val2 > 1850)) // on est sur le point 5 { etatpt5 = HIGH; //on passe l'état point 5 à HIGH } else { etatpt5 = LOW; //Sinon, on passe l'état point 5 à LOW } //---------------------------------------------------------------------------------- if((etatpt5 != mempt5) && (etatpt5 == HIGH) && (cpt5 == 0)) // Si le signal point 5 a un état différent de celui enregistré et que cet état est "haut" + compteur=0 { cpt5 = 1; // on passe le compteur à 1 mempt5 = etatpt5; // on enregistre en mémoire l'état de la position point 5 pour le tour suivant digitalWrite(rel5, LOW); // relais 5 passe à ON (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt5 != mempt5) && (etatpt5 == LOW) && (cpt5 == 1)) // Si le signal point 5 a un état différent de celui enregistré et que cet état est "LOW" + compteur=1 (on à quitté le point 5) { mempt5 = 0; // on enregistre en mémoire l'état de la position point 5 pour le tour suivant cpt5 = 2; // on passe le compteur à 2 } //---------------------------------------------------------------------------------- if((etatpt5 != mempt5) && (etatpt5 == HIGH) && (cpt5 == 2)) // Si le signal point 5 a un état différent de celui enregistré et que cet état est "haut" + compteur=2 (deuxième tour) { mempt5 = etatpt5; // on enregistre en mémoire l'état de la position point 5 pour le tour suivant cpt5 = 3; // on passe le compteur à 3 digitalWrite(rel5, HIGH); // relais 5 passe à OFF (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt5 != mempt5) && (etatpt5 == LOW) && (cpt5 == 3)) // Si le signal point 5 a un état différent de celui enregistré et que cet état est "LOW" + compteur=3 (on à quitté le point 5, deuxième tour) { mempt5 = 0; // on enregistre en mémoire l'état de la position point 5 pour le tour suivant cpt5 = 0; // on passe le compteur à 0 } //---------------------------------------------------------------------------------- // TRAITEMENT SIGNAL VOIE1 + VOIE 2, V1 en BAS et V2 à DROITE EN POSITION MEDIANE (POINT 6) //---------------------------------------------------------------------------------- // Si le signal voie 1 à sa valeur comprise entre 1100 et 999 ainsi que la voie 2, on est sur le point 6 if ((val1 < 1100) && (val1 > 999) && (val2 < 1100) && (val2 > 999)) // on est sur le point 6 { etatpt6 = HIGH; //on passe l'état point 6 à HIGH } else { etatpt6 = LOW; //Sinon, on passe l'état point 6 à LOW } //---------------------------------------------------------------------------------- if((etatpt6 != mempt6) && (etatpt6 == HIGH) && (cpt6 == 0)) // Si le signal point 6 a un état différent de celui enregistré et que cet état est "haut" + compteur=0 { cpt6 = 1; // on passe le compteur à 1 mempt6 = etatpt6; // on enregistre en mémoire l'état de la position point 6 pour le tour suivant digitalWrite(rel6, LOW); // relais 6 passe à ON (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt6 != mempt6) && (etatpt6 == LOW) && (cpt6 == 1)) // Si le signal point 6 a un état différent de celui enregistré et que cet état est "LOW" + compteur=1 (on a quitté le point 6) { mempt6 = 0; // on enregistre en mémoire l'état de la position point 6 pour le tour suivant cpt6 = 2; // on passe le compteur à 2 } //---------------------------------------------------------------------------------- if((etatpt6 != mempt6) && (etatpt6 == HIGH) && (cpt6 == 2)) // Si le signal point 6 a un état différent de celui enregistré et que cet état est "haut" + compteur=2 (deuxième tour) { mempt6 = etatpt6; // on enregistre en mémoire l'état de la position point 6 pour le tour suivant cpt6 = 3; // on passe le compteur à 3 digitalWrite(rel6, HIGH); // relais 6 passe à OFF (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt6 != mempt6) && (etatpt6 == LOW) && (cpt6 == 3)) // Si le signal point 6 a un état différent de celui enregistré et que cet état est "LOW" + compteur=3 (on à quitté le point 6, deuxième tour) { mempt6 = 0; // on enregistre en mémoire l'état de la position point 6 pour le tour suivant cpt6 = 0; // on passe le compteur à 0 } //---------------------------------------------------------------------------------- // TRAITEMENT SIGNAL VOIE1 + VOIE 2, V1 en BAS et V2 à GAUCHE EN POSITION MEDIANE (POINT 7) //---------------------------------------------------------------------------------- // Si le signal voie 1 à sa valeur comprise entre 1100 et 999 1 et la voie 2 un signal compris entre 1850 et 2001, on est sur le point 7 if ((val1 < 1100) && (val1 > 999) && (val2 < 2001) && (val2 > 1850)) // on est sur le point 7 { etatpt7 = HIGH; //on passe l'état point 7 à HIGH } else { etatpt7 = LOW; //Sinon, on passe l'état point 7 à LOW } //---------------------------------------------------------------------------------- if((etatpt7 != mempt7) && (etatpt7 == HIGH) && (cpt7 == 0)) // Si le signal point 7 a un état différent de celui enregistré et que cet état est "haut" + compteur=0 { cpt7 = 1; // on passe le compteur à 1 mempt7 = etatpt7; // on enregistre en mémoire l'état de la position point 7 pour le tour suivant digitalWrite(rel7, LOW); // relais 7 passe à ON (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt7 != mempt7) && (etatpt7 == LOW) && (cpt7 == 1)) // Si le signal point 7 a un état différent de celui enregistré et que cet état est "LOW" + compteur=1 (on a quitté le point 7) { mempt7 = 0; // on enregistre en mémoire l'état de la position point 7 pour le tour suivant cpt7 = 2; // on passe le compteur à 2 } //---------------------------------------------------------------------------------- if((etatpt7 != mempt7) && (etatpt7 == HIGH) && (cpt7 == 2)) // Si le signal point 7 a un état différent de celui enregistré et que cet état est "haut" + compteur=2 (deuxième tour) { mempt7 = etatpt7; // on enregistre en mémoire l'état de la position point 7 pour le tour suivant cpt7 = 3; // on passe le compteur à 3 digitalWrite(rel7, HIGH); // relais 7 passe à OFF (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt7 != mempt7) && (etatpt7 == LOW) && (cpt7 == 3)) // Si le signal point 7 a un état différent de celui enregistré et que cet état est "LOW" + compteur=3 (on à quitté le point 7, deuxième tour) { mempt7 = 0; // on enregistre en mémoire l'état de la position point 7 pour le tour suivant cpt7 = 0; // on passe le compteur à 0 } //---------------------------------------------------------------------------------- // TRAITEMENT SIGNAL VOIE1 + VOIE 2, V1 en HAUT et V2 à DROITE EN POSITION MEDIANE (POINT 8) //---------------------------------------------------------------------------------- // Si le signal voie 1 à sa valeur comprise entre 1850 et 2001 et la voie 2 un signal compris entre 999 et 1100, on est sur le point 8 if ((val1 < 2001) && (val1 > 1850) && (val2 < 1100) && (val2 > 999)) // on est sur le point 8 { etatpt8 = HIGH; //on passe l'état point 8 à HIGH } else { etatpt8 = LOW; //Sinon, on passe l'état point 8 à LOW } //---------------------------------------------------------------------------------- if((etatpt8 != mempt8) && (etatpt8 == HIGH) && (cpt8 == 0)) // Si le signal point 8 a un état différent de celui enregistré et que cet état est "haut" + compteur=0 { cpt8 = 1; // on passe le compteur à 1 mempt8 = etatpt8; // on enregistre en mémoire l'état de la position point 8 pour le tour suivant digitalWrite(rel8, LOW); // relais 8 passe à ON (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt8 != mempt8) && (etatpt8 == LOW) && (cpt8 == 1)) // Si le signal point 8 a un état différent de celui enregistré et que cet état est "LOW" + compteur=1 (on a quitté le point 8) { mempt8 = 0; // on enregistre en mémoire l'état de la position point 8 pour le tour suivant cpt8 = 2; // on passe le compteur à 2 } //---------------------------------------------------------------------------------- if((etatpt8 != mempt8) && (etatpt8 == HIGH) && (cpt8 == 2)) // Si le signal point 8 a un état différent de celui enregistré et que cet état est "haut" + compteur=2 (deuxième tour) { mempt8 = etatpt8; // on enregistre en mémoire l'état de la position point 8 pour le tour suivant cpt8 = 3; // on passe le compteur à 8 digitalWrite(rel8, HIGH); // relais 7 passe à OFF (logique inverse) } //---------------------------------------------------------------------------------- if((etatpt8 != mempt8) && (etatpt8 == LOW) && (cpt8 == 3)) // Si le signal point 8 a un état différent de celui enregistré et que cet état est "LOW" + compteur=3 (on à quitté le point 8, deuxième tour) { mempt8 = 0; // on enregistre en mémoire l'état de la position point 7 pour le tour suivant cpt8 = 0; // on passe le compteur à 0 } //---------------------------------------------------------------------------------- Serial.print("val1 = "); Serial.println(val1); Serial.print("val2 = "); Serial.println(val2); delay(500); } |