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