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 113 114 115 116 117 118 119 120 121 122 123
| //Injection_banc_BT120919
//Details sur http://a110a.free.fr/SPIP172/article.php3?id_article=192
//Pilotage d'un injecteur en fonction de:
//Nt/mn (4 cylindres), Dinj durée d'injection en microsecondes
//et du
//Nombre total d'injections à effectuer( option smartphone )
//La Led de l' Arduino s'allume pendant l'injection
//Ces valeurs sont entrées au choix
//--par deux potards pour N et Dinj, mode par defaut
//--par Sphone via Bluetooth ou PC pour N, Dinj et total injections
//Si on affiche N=1000 et Dinj = 5 ms aux potards, on doit voir la led clignoter
//Pour le mode smartphone, tourner N au maxi AVANT la mise sous tension
//Pour le Sphone l'appli conseillée est Bluetooth Terminal HC-05(OK aussi pour HC06)
//Pour un moniteur de PC, 3 commentaires sont à modifier dans LireVal()
#include"TimerOne.h"
#include <SoftwareSerial.h> //Pour Bluetooth BT
SoftwareSerial BT(10, 11); // RX,TX respectivement vers le HC05/06 à 9600bps
#define Nmax 6000 //en t/mn
#define Dinjmax 20000 // en microseconds
#define potN A0 //Potard affichage Nt/mn sur A0
#define potDinj A1 //Potard durée injection sur A1
#define Inj1 3//Injecteur 1 sur D3( gate de l'IGBT)
#define Led 13 //Celle de l'Arduino
int N_aff = 0; //Valeur 0/1023 lue du potard
int Dinj_aff = 0; //Valeur 0/1023 lue du potard
int long unsigned TotInj = 1;//Nb total d'injections
int long unsigned Val = 0; // Nombre entré au clavier
float N = 0; //En t/mn pour calcul du cycle soit D720
float Dinj = 0; //En µs durée d'injection
float D720 = 0; //En ms, durée d'un cycle: 720°, 2 tours moteur
int Mode = 0; //1pour Sphone, 0 pour potards
//**************************************
void GameOver()
{ Serial.println("Fin de test, ou erreur de saisie, redemarrer avec le bouton de Reset sur l'Arduino");
BT.println("Fin de test, ou erreur de saisie, redemarrer avec le bouton de Reset sur l'Arduino");
while (1); //Attente infinie
}
//*****************************************
void Init() //Résupère 3 nombres entrés au clavier
{ Mode = 1; // On est en mode Sphone
Serial.println("****Essais injection****"); BT.println("****Essais injection****");
Serial.println(); BT.println();
Serial.println("Duree d'injection en microsecondes ( 1 -- 20 000)");
BT.println("Duree d'injection en microsecondes "); BT.println(" 1 -- 20 000");
LireVal();// Lecture du clavier
Serial.println(Val); BT.println(Val);
if ((Val < 1) || (Val > 20000))GameOver(); //Erreur redemarrer
Dinj = Val;
Serial.println("Regime moteur 4 cylindres N t/mn ( 1000 -- 8 000)");
BT.println("Regime moteur 4 cylindres N t/mn "); BT.println(" 1000 -- 8 000");
LireVal();// Lecture du clavier
Serial.println(Val); BT.println(Val);
if ((Val < 1000) || (Val > 8000))GameOver(); //Erreur redemarrer
D720 = 60000 / Val; //Durée du cycle en ms
Serial.println("Nombre total d'injections( 1 -- 10 000) ");
BT.println("Nombre total d'injections "); BT.println(" 1 -- 10 000");
LireVal();// Lecture du clavier
Serial.println(Val); BT.println(Val);
if ((Val < 1) || (Val > 10000))GameOver(); //Erreur redemarrer
TotInj = Val;
}
//*****************************************************
void isr_Fin_injection()
{ Timer1.stop();
digitalWrite(Inj1, 1); //Couper l'injecteur
digitalWrite(Led, 0);
}
//****************************************************
void LireVal()
//Attend une ligne de car terminée par CR ou LF et la convertit en entiers
{ char carLu; // Stock le car lu
String Ligne = ""; //Accumule les car reçus du clavier
while (1)
{ //On en sortira par CR ou LF
// while (Serial.available() == 0); //Attendre un car pour le moniteur
while (BT.available() == 0); //Attendre un car
// carLu = Serial.read(); //Lit ce car pour le moniteur
carLu = BT.read(); //Lit ce car
delay(100); //Indispensable
if ((carLu == 13 ) || (carLu == 10)) break;//Sortir
Ligne = Ligne + carLu; //cumuler
}
Val = Ligne.toInt(); // convertir en entier, en general c'est utile
// while (Serial.available() != 0)carLu = Serial.read(); //Purge pour le moniteur
while (BT.available() != 0)carLu = BT.read(); //Purge
}
//***************************************************
void setup()
{
Serial.begin(9600); //Pour moniteur PC
BT.begin(9600); //Pour Sphone, Bluetooth
Timer1.attachInterrupt(isr_Fin_injection); //Tmr1 deconnecte l'injecteur
pinMode(Inj1, OUTPUT); //Gate de l'IGBT qui commande l'injecteur
pinMode(Led, OUTPUT);
if (analogRead(potN) > 900)Init(); //Mode Sphone, PotN était au maxi au demarrage
}
//****************************************************
void loop()
{
digitalWrite(Inj1, 1); //par precaution
if (Mode == 0) //Mode Potards, lire les valeurs dynamiques
{ N_aff = analogRead(potN);
Dinj_aff = analogRead(potDinj);
N = map(N_aff, 0, 1023, 0, Nmax); // N de 0 à 8000t/mn
Dinj = map(Dinj_aff, 0, 1023, 0, Dinjmax); // Dinj de 0 à 20ms
D720 = 60000 / N; //Un cycle en ms
}
else TotInj--; //Mode Sphone, decompter cette injection
Timer1.initialize(Dinj);//Lancer TMR1 qui coupera l'injection
digitalWrite(Inj1, 0); //Alimenter l'injecteur
digitalWrite(Led, 1);
delay(D720);// Attendre fin du cycle
if (TotInj == 0)GameOver(); //Fin du test, jamais executé en mode Potard
} |
Partager