1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| #include <LiquidCrystal.h>
float temps_tour; //temps d'un tour du volant-moteur
float temps_dernier_tour; //temps au début du dernier tour
int etat; //état du tour (1: tour d'injection, 2: tour d'allumage, 3: état d'attente)
float temps_signal[6] = {1, 1, 10, 10, 1, 0.1}, angle_signal[5]; //temps et angles correspondant aux débuts et fins des signaux (avances puis temps d'injections, avance puis temps d'allumage)
bool signaux_emis[4] = {false, false, false, false}; //si les signaux de début et fin d'injections sont émis ou non
int broche_signal[3] = {6, 7, 8}, broche_capteur = 9; //broches des signaux et du capteur
int capteur_positif = LOW, signal_positif = HIGH, signal_negatif = LOW; //signaux reçus et émis comme signaux positifs
String texte_signal = " ";
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //connection des différentes broches de l'afficheur
void setup()
{
lcd.begin(16,4); //initialize LCD
Serial.begin(9600);
pinMode(broche_signal[0], OUTPUT); //broche d'injection du carburant
pinMode(broche_signal[1], OUTPUT); //broche d'injection de l'air
pinMode(broche_signal[2], OUTPUT); //broche d'allumage
pinMode(broche_capteur, INPUT); //broche du capteur
pinMode(A0, INPUT); //potentiomètre relié à l'avance à l'injection du carburant, la valeur obtenue entre 0 et +1023 est divisée par 64 pour obtenir l'avance à l'injection
pinMode(A1, INPUT); //potentiomètre relié à l'avance à l'injection de l'air, idem
pinMode(A2, INPUT); //potentiomètre relié à l'avance à allumage
pinMode(A3, INPUT); //potentiomètre relié à l'injection du carburant
pinMode(A4, INPUT); //potentiomètre relié à l'injection de l'air
lcd.begin(16, 4); //initialisation de l'écran LCD à 4 lignes
temps_tour = 40;
delay(40);
temps_dernier_tour = 0; //le tour a commencé à 0 millisecondes
etat = 1; //tour d'injection
}
void loop() {
if(digitalRead(broche_capteur) == capteur_positif){
if(etat != 3){ //on vérifie que le signal n'est pas un duplicata du signal précédent
angle_signal[0] = (float)analogRead(A0) / 64.0; //on lit l'avance à l'injection à partir du potentiomètre, et on la divise par 64 pour obtenir une avance à l'injection comprise entre 0 et +16 (plus précisément, entre 0 et +15.984375)
angle_signal[1] = (float)analogRead(A1) / 64.0; //les valeurs retournées par les capteurs sont entières, entre 0 et +1023. elles doivent donc être d'abord converties en float pour que la division ne retourne pas un nombre entier
angle_signal[4] = (float)analogRead(A2) / 64.0; //il s'agit ici d'angles, la véritable avance est donc également proportionnelle au temps moyen d'un tour
angle_signal[2] = (float)analogRead(A3) * 300.0 / 1024.0; //les valeurs sont cette fois-ci comprises entre 0 et +300 (afin de ne pas déborder sur le tour suivant)
angle_signal[3] = (float)analogRead(A4) * 300.0 / 1024.0;
temps_tour = millis() - temps_dernier_tour; //actualisation des données sur la durée d'un tour et sur le début du dernier tour
temps_dernier_tour = millis();
for(int i = 0; i < 5; i++){ //affichage des données sur l'écran LCD
temps_signal[i] = angle_signal[i];
lcd.setCursor(8*(i%2), i/2+1);
texte_signal = temps_signal[i];
lcd.print(texte_signal);
}
for(int i = 0; i < 4; i++){
signaux_emis[i] = false;
}
if(etat == 1) { //tour d'injection
lcd.setCursor(0, 0);
lcd.print("INJECTION");
temps_signal[2] += temps_signal[0]; //on ajoute le temps d'attente précédant le temps du signal
temps_signal[3] += temps_signal[1];
while(signaux_emis[0] == false || signaux_emis[1] == false || signaux_emis[2] == false || signaux_emis[3] == false){
for(int i = 0; i < 4; i++){ //on vérifie si un ou plusieurs des 4 signaux doivent être émis
if(millis() - temps_dernier_tour >= temps_signal[i] && signaux_emis[i] == false){
if(i < 2) digitalWrite(broche_signal[i], signal_positif);
else digitalWrite(broche_signal[i-2], signal_negatif);
signaux_emis[i] = true;
}
}
}
etat = 2;
}
else if(etat == 2) { //tour d'allumage
lcd.setCursor(0, 4);
lcd.print(" ALLUMAGE");
delayMicroseconds(100000 * temps_signal[4]);
digitalWrite(broche_signal[2], signal_positif); //on envoie le signal d'allumage
delayMicroseconds(100000 * temps_signal[5]);
digitalWrite(broche_signal[2], signal_negatif); //fin de l'envoi du signal d'allumage
etat = 3; //l'état d'attente évite de sortir de la boucle avec toujours le même signal que celui d'avant l'activation de l'allumage
}
}
} else if(etat == 3) { //si aucun signal n'est détecté et que l'on est en état d'attente, on peut passer à l'état d'injection (celui permettant d'activer l'injection une fois qu'un nouveau signal arrive)
etat = 1;
}
} |
Partager