//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)
}
|