//DEFINITION DES VARIABLES //On définit la broche d'entrée utilisée // Le canal 3 Manche côté droit de la RC Graupner MC 15 à fond en BAS ( mini) et à fond en HAUT (maxi) int Signal_Canal_3 = 10; // Signal du récepteur du canal 3 Broche D10 int Duree_Signal_Canal_3; // Durée du signal du canal 3 en microseconde ( pour visualiser le temps mini et temps maxi sur le moniteur série) int Valeur_Signal_Canal_3; // Valeur de la durée du signal du canal 3 convertie en pourcentage ( pour commander les relais) int Temps_Mini_3 = 1070; // Durée mini de l'impulsion du signal en microseconde ( manche au mini) ( pour débugger) int Temps_Maxi_3 = 1870; // Durée maxi de l'impulsion du signal en microseconde ( manche au maxi) ( pour débugger) //On définit les broches de sorties utilisées const int Relais_1 = 2; // (D2) Relais 1 ( Feux de route rouge et vert ) const int Relais_2 = 3; // (D3) Relais 2 ( Feux de proue et poupe blancs ) const int Relais_3 = 4; // (D4) Relais 3 ( Feux de pêche vert et blanc superposés ) const int Relais_4 = 5; // (D5) Relais 4 ( Feux d'impossibilité de manœuvre rouges superposés ) const int Relais_5 = 6; // (D6) Relais 5 ( Projecteurs avant ) const int Relais_6 = 7; // (D7) Relais 6 (( Projecteurs arrière) const int Relais_7 = 8; // (D8) Relais 7 ( Radar ) const int Relais_8 = 9; // (D9) Relais 8 ( Ventilateur de refroidissement du moteur et du variateur commander par une sonde thermique ) //on définit les temporisations int Tempo_Cycle_Impulsions= 0;// Temporisation du cycle d'impulsions sur le manche du canal 3 int Tempo_Impulsion_Longue= 0;// Temporisation de l'impulsion longue sur le manche du canal 3 int Temps_Tempo_Cycle_Impulsions=0; // Temps de validation de la temporisation du cycle d'impulsions sur le manche du canal 3 //on définit les mémoires utilisées int Memoire_Impulsion_Longue = 0; // Mémoire d'activation de l'impulsion longue int Memoire_Valeur_Haute_Canal_3 = 0; // Mémoire de la valeur haute du signal du canal 3 ( +5 volts pour éviter de compter des impulsions lors du maintien du manche en position maxi ou mini) // On définit le compteur d'impulsion du canal 3 int Compteur_Impulsions= 0; // On définit la variable du temps actuel en ms unsigned long Temps; // On définit la variable du temps de départ en ms pour mémoriser le temps écoulé depuis l'activation de la temporisation de cycle d'impulsions unsigned long Temps_Depart_Tempo_Cycle_Impulsions; // On définit la variable du temps de départ en ms pour mémoriser le temps écoulé depuis l'activation de la temporisation de l'impulsion longue unsigned long Temps_Depart_Tempo_Impulsion_Longue; void setup() { Serial.begin(9600); // Vitesse de transmission pinMode(Relais_1,OUTPUT); //Configuration de la broche 2 en tant que sortie numérique digitalWrite(Relais_1,LOW);//On initialise le relais 1 à l'état 0 pinMode(Relais_2,OUTPUT); //Configuration de la broche 3 en tant que sortie numérique digitalWrite(Relais_2,LOW);//On initialise le relais 2 à l'état 0 pinMode(Relais_3,OUTPUT); //Configuration de la broche 4 en tant que sortie numérique digitalWrite(Relais_3,LOW);//On initialise le relais 3 à l'état 0 pinMode(Relais_4,OUTPUT); //Configuration de la broche 5 en tant que sortie numérique digitalWrite(Relais_4,LOW);//On initialise le relais 4 à l'état 0 pinMode(Relais_5,OUTPUT); //Configuration de la broche 6 en tant que sortie numérique digitalWrite(Relais_5,LOW);//On initialise le relais 5 à l'état 0 pinMode(Relais_6,OUTPUT); //Configuration de la broche 7 en tant que sortie numérique digitalWrite(Relais_6,LOW);//On initialise le relais 6 à l'état 0 pinMode(Relais_7,OUTPUT); //Configuration de la broche 8 en tant que sortie numérique digitalWrite(Relais_7,LOW);//On initialise le relais 7 à l'état 0 pinMode(Relais_8,OUTPUT); //Configuration de la broche 9 en tant que sortie numérique digitalWrite(Relais_8,LOW);//On initialise le relais 8 à l'état 0 } void loop() { // ACQUISITION ET TRAITEMENT DU SIGNAL DU CANAL 3 DE L'EMETTEUR RC // On Mesure la durée du signal canal 3 Duree_Signal_Canal_3 = pulseIn(Signal_Canal_3, HIGH); // On Convertit la durée du signal du canal 3 en pourcentage ( -100% = au manche mini, +100% = au manche maxi, le neutre étant à 0%) Valeur_Signal_Canal_3 = map(Duree_Signal_Canal_3,Temps_Mini_3,Temps_Maxi_3,-100,100); // Si le signal du canal 3 n'est pas dans la plage de temps ( mini ou maxi) avec une tolérance if ( Duree_Signal_Canal_3 <= 1055 || Duree_Signal_Canal_3 >= 1895 ) { Valeur_Signal_Canal_3=0; // On considère que la valeur du signal du canal 3 est égale à 0% ( manche au neutre) Compteur_Impulsions=0; Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } // COMPTAGE DES IMPULSIONS DU MANCHE DU CANAL 3 if (Memoire_Valeur_Haute_Canal_3 == 0) // Si la mémoire de la valeur haute du canal 3 est égale à 0 (0V) { if((Valeur_Signal_Canal_3)>=80) //Si la valeur du signal du canal 3 est supérieure ou égale 80% ( manche considéré au maxi) { Memoire_Valeur_Haute_Canal_3 = 1;// On active la mémoire de la valeur haute du signal du canal 3 Tempo_Cycle_Impulsions= 1;// On active la temporisation du cycle d'impulsions sur le manche du canal 3 Tempo_Impulsion_Longue= 1;// On active la temporisation de l'impulsion longue sur le manche du canal 3 Compteur_Impulsions++;// On incrémente de 1 dans le compteur delay(100); // Attente 100ms } if((Valeur_Signal_Canal_3)<=-80)//Si la valeur du signal du canal 3 est égale -80% ( manche considéré au mini) { Memoire_Valeur_Haute_Canal_3 = 1;// On active la mémoire de la valeur haute du signal du canal 3 Tempo_Cycle_Impulsions= 1;// On active la temporisation du cycle d'impulsions sur le manche du canal 3 Tempo_Impulsion_Longue= 1;// On active la temporisation de l'impulsion longue sur le manche du canal 3 Compteur_Impulsions--;// On décrémente de 1 dans le compteur delay(100); // On attend 100ms } } if((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))//Si la valeur du signal du canal 3 est comprise entre -10% et 10% { Memoire_Valeur_Haute_Canal_3= 0;// On désactive la mémoire de la valeur haute du signal du canal 3 } // ACTIVATION DE LA TEMPORISATION DE L'IMPULSION LONGUE SUR LE MANCHE DU CANAL 3 if (( Tempo_Impulsion_Longue)==0 )// Si la temporisation de l'impulsion longue sur le manche du canal 3 est désactivée { Temps_Depart_Tempo_Impulsion_Longue = millis();// On charge le temps actuel dans la variable temps de départ de la temporisation de l'impulsion longue sur le manche du canal 3(temps départ temporisation n°2 = temps actuel) } if (( Tempo_Impulsion_Longue)==1 )// Si la temporisation de l'impulsion longue sur le manche du canal 3 est activée, { Temps = millis();// On charge le temps actuel dans la variable temps if (Temps-Temps_Depart_Tempo_Impulsion_Longue >= 1000 )//Si la temporisation de l'impulsion longue sur le canal 3 est supérieure ou égale à 1.5 seconde { Memoire_Impulsion_Longue = 1;// On active la mémoire de l'impulsion longue sur le manche du canal 3 } } // DESACTIVATION DE LA TEMPORISATION DE L'IMPULSION LONGUE SUR LE MANCHE DU CANAL 3 if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))//Si la valeur du signal du canal 3 est comprise entre -10% et 10% { Tempo_Impulsion_Longue= 0;// On désactive la temporisation d'impulsion longue sur le manche du canal 3 } // CALCUL DU TEMPS DE LA TEMPORISATION DU CYCLE D'IMPULSIONS SUR LE MANCHE DU CANAL 3 if ( Memoire_Impulsion_Longue == 0)//Si la temporisation d'impulsion longue sur le manche du canal 3 n'est pas est activée { Temps_Tempo_Cycle_Impulsions= abs(Compteur_Impulsions)*700+1000; // Le temps de cycle d'impulsions est égal 0.7s x nbre d'impulsions plus 1 seconde soit 3.8 secondes pour 4 impulsions } if ( Memoire_Impulsion_Longue == 1)//Si la temporisation d'impulsion longue sur le manche du canal 3 est activée { Temps_Tempo_Cycle_Impulsions = abs(Compteur_Impulsions)*700+2500; // Le temps de cycle d'impulsions est égal 0.7s x nbre d'impulsions plus 2.5 secondes soit 5.3 secondes pour 4 impulsions } // ACTIVATION DE LA TEMPORISATION DU CYCLE D'MPULSIONS SUR LE MANCHE DU CANAL 3 if (( Tempo_Cycle_Impulsions)==0 ) // Si la temporisation de cycle d'impulsions est désactivée { Temps_Depart_Tempo_Cycle_Impulsions = millis();// On charge le temps actuel dans la variable temps de départ de la temporisation (temps départ temporisation = temps actuel) } // TRAITEMENT DES IMPULSIONS DU CANAL 3, DE LA POSITION DU POTENTIOMETRE LINEAIRE DU CANAL 6 ET DES SORTIES RELAIS if (( Tempo_Cycle_Impulsions)==0 )// Si la temporisation est désactivée du cycle d'impulsions sur le manche du canal 3 { Temps_Depart_Tempo_Cycle_Impulsions = millis();// On charge le temps actuel dans la variable temps de départ de la temporisation (temps départ temporisation = temps actuel) } if (( Tempo_Cycle_Impulsions)==1 )// Si la temporisation de cycle d'impulsions est activée, { Temps = millis();// On charge le temps actuel dans la variable temps if (Temps-Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions )//Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé { if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3 au neutre ) { if( Memoire_Impulsion_Longue == 0)// Si la mémoire de l'impulsion longue est désactivée { //RELAIS 1 if ((Compteur_Impulsions==1)&&(digitalRead (Relais_1)== LOW))//Si le compteur est égal 1 et que le relais 1 est desactivé { digitalWrite (Relais_1 ,HIGH);//On active le relais 1 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } if ((Compteur_Impulsions==1)&&(digitalRead (Relais_1)== HIGH ))// Si le compteur est égal 1 et que le relais 1 est activé { digitalWrite (Relais_1 ,LOW);//on désactive le relais 1 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } //RELAIS 2 if ((Compteur_Impulsions==2)&&(digitalRead (Relais_2)== LOW))//Si le compteur est égal 2 et que le relais 2 est desactivé { digitalWrite (Relais_2 ,HIGH);//On active le relais 2 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } if ((Compteur_Impulsions==2)&&(digitalRead (Relais_2)== HIGH ))// Si le compteur est égal 2 et que le relais 2 est activé { digitalWrite (Relais_2 ,LOW);//on désactive le relais 2 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } //RELAIS 3 if ((Compteur_Impulsions==3)&&(digitalRead (Relais_3)== LOW)) //Si le compteur est égal 3 et que le relais 3 est desactivé { digitalWrite (Relais_3 ,HIGH);//On active le relais 3 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } if ((Compteur_Impulsions==3)&&(digitalRead (Relais_3)== HIGH ))// Si le compteur est égal 3 et que le relais 3 est activé { digitalWrite (Relais_3 ,LOW);//On désactive le relais 3 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } //DESACTIVATION DES RELAIS 1,2 ET 3 if ((Compteur_Impulsions==4))// Si le compteur est égal 4 { digitalWrite (Relais_1 ,LOW);//On désactive le relais 1 digitalWrite (Relais_2 ,LOW);//On désactive le relais 2 digitalWrite (Relais_3 ,LOW);//On désactive le relais 3 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation } //RELAIS 4 if ((Compteur_Impulsions==-1)&&(digitalRead (Relais_4)== LOW))// Si le compteur est égal -1 et que le relais 4 est désactivé { digitalWrite (Relais_4 ,HIGH);//On active le relais 4 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } if ((Compteur_Impulsions==-1)&&(digitalRead (Relais_4)== HIGH ))// Si le compteur est égal -1 et que le relais 4 est activé { digitalWrite (Relais_4 ,LOW);//on désactive le relais 4 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } //RELAIS 5 if ((Compteur_Impulsions==-2)&&(digitalRead (Relais_5)== LOW))// Si le compteur est égal -2 et que le relais 5 est desactivé { digitalWrite (Relais_5 ,HIGH);//On active le relais 5 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } if ((Compteur_Impulsions==-2)&&(digitalRead (Relais_5)== HIGH ))// Si le compteur est égal -2 et que le relais 5 est activé { digitalWrite (Relais_5 ,LOW);//On désactivé le relais 5 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } //RELAIS 6 if ((Compteur_Impulsions==-3)&&(digitalRead (Relais_6)== LOW))// Si le compteur est égal -3 et que le relais 6 est desactivé { digitalWrite (Relais_6 ,HIGH);//On active le relais 6 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } if ((Compteur_Impulsions==-3)&&(digitalRead (Relais_6)== HIGH ))// Si le compteur est égal -3 et que le relais 6 est activé { digitalWrite (Relais_6 ,LOW);//On désactive le relais 6 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } //DESACTIVATION DES RELAIS 4,5 ET 6 if (Compteur_Impulsions==-4)// Si le compteur est égal -4 { digitalWrite (Relais_4 ,LOW);//On désactive le relais 4 digitalWrite (Relais_5 ,LOW);//On désactive le relais 5 digitalWrite (Relais_6 ,LOW);//On désactive le relais 6 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Impulsion_Longue= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } } if( Memoire_Impulsion_Longue == 1)//Si la mémoire de l'impulsion longue est activé { //RELAIS 7 if ((Compteur_Impulsions==1)&&(digitalRead (Relais_7)== LOW)) // Si le compteur est égal 1 et que le relais 7 est désactivé { digitalWrite (Relais_7 ,HIGH);//On active le relais 7 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3 } if ((Compteur_Impulsions==1)&&(digitalRead (Relais_7)== HIGH ))// Si le compteur est égal 1 et que le relais 7 est activé { digitalWrite (Relais_7 ,LOW);//on désactive le relais 7 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3 } //RELAIS 8 if ((Compteur_Impulsions==2)&&(digitalRead (Relais_8)== LOW)) // Si le compteur est égal 2 et que le relais 8 est désactivé { digitalWrite (Relais_8 ,HIGH);//On active le relais 8 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3 } if ((Compteur_Impulsions==2)&&(digitalRead (Relais_8)== HIGH ))// Si le compteur est égal 2 et que le relais 8 est activé { digitalWrite (Relais_8 ,LOW);//on désactive le relais 8 Compteur_Impulsions=0;// On reset le compteur à 0 Tempo_Cycle_Impulsions= 0;// On désactive la temporisation de cycle d'impulsions sur le manche du canal 3 } } } Compteur_Impulsions = 0;// On désactive le compteur si aucune condition ci-dessus est vraie Tempo_Cycle_Impulsions= 0;// On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie } } // DESACTIVATION DE LA MEMOIRE DE LA TEMPORISATION N° 2 if (Compteur_Impulsions==0) { Memoire_Impulsion_Longue = 0;// On désactive la mémoire de la temporisation de l'impulsion longue sur le manche du canal 3 } // AFFICHAGE DES INFORMATIONS SUR LE MONITEUR SERIE //On affiche la durée d'impulsion en microseconde sur la liaison série( pour débugger) //Serial.print("Durée d'impulsion du signal 3 en microseconde = "); //Serial.println(Duree_Signal_Canal_3); // On affiche la valeur convertie en % du signal du canal 3 sur la liaison série ( pour débugger) // Serial.print("Valeur 3 en %= "); // Serial.println(Valeur_Signal_Canal_3); // On affiche la valeur du compteur sur le moniteur série Serial.print(" Compteur = "); Serial.println(Compteur_Impulsions); // On affiche l'état de la temporisation sur le moniteur série ( pour débugger) //Serial.print("Tempo Active="); //Serial.println(Tempo_Active); // On affiche l'état de la mémoire de la valeur haute du canal 3 sur le moniteur série ( pour débugger) // Serial.print("Mémoire Valeur Haute="); // Serial.println(Memoire_Valeur_Haute_Canal_3); // On affiche l'état de la temporisation sur le moniteur série ( pour débugger) // Serial.print("Tempo Active 2="); // Serial.println(Tempo_Active_2); // On affiche l'état de la mémoire de la temporisation de l'impulsion longue sur le manche du canal 3 sur le moniteur série ( pour débugger) Serial.print("Mémoire Tempo 2="); Serial.println(Memoire_Impulsion_Longue); delay (00); // Pas nécessaire mais on attend 0.1 seconde avant d'afficher d'autres valeurs sur le moniteur série ( pour débugger) } |