//Injection_Banc_Graphique 040121 //Détails sur http://www.loutrel.org/Injectionbancessai.php /*Banc de test d'injection modifié et complété par une interface graphique par G Alquier Injection_banc_Smartphone - version avec appli spécifique sur Smartphone Pilotage d'un injecteur en fonction de: Nt/mn (4 cylindres), Dinj duree d'injection en microsecondes Nombre total d'injections a effectuer La Led de l' Arduino s'allume pendant l'injection */ #include"TimerOne.h" #include //Pour Bluetooth BT #define Inj1 3 //Injecteur 1 sur D3( gate de l'IGBT) #define Led 13 //Celle de l'Arduino int PosCar = -1; //Position du flag dans la chaine de caractere recue. int LengthParam = 10; //Longueur de la chaine de caractere char CParam = ' '; //Caractere de la chaine a recuperer en entree bluetooth String Param = ""; //chaine a recuperer en entree bluetooth bool ParamComplet = false; //Quand la chaine est complete #define rxPin 10 //Broche 10 en tant que RX, à raccorder sur TX du HC-05/06 #define txPin 11 //Broche 11 en tant que TX, à raccorder sur RX du HC-05/06 float Dinj = 0; //En µs durée d'injection String DinjStr = ""; //En µs durée d'injection int long unsigned TotInj = 0; //Nb total d'injections (mémoire) int long unsigned TotInjEC = 0; //Nb total d'injections (en cours de cycle) String TotInjStr = ""; //Nb total d'injections float N = 0; //En t/mn pour calcul du cycle soit D720 String NStr = ""; //En t/mn pour calcul du cycle soit D720 float D720 = 0; //En ms, durée d'un cycle: 720°, 2 tours moteur float InjPC = 100; //Pourcentage d'injections réalisées String chaineBT = "100"; //Chaine envoyée vers Smartphone SoftwareSerial BT(rxPin,txPin); //Lecture de la chaine en provnance du Smartphone void LectParam() { while (BT.available()) { // Attend des donnees disponibles CParam = BT.read(); //Lit un caractere Param += CParam; //Ajoute le caractere a la chaine if (CParam == '&') { //Si le dernier caractère est le drapeau, pour sortir de la boucle ParamComplet = true; } } if (ParamComplet) { PosCar = Param.indexOf(','); //Determine la position du premier drapeau DinjStr = Param.substring(0, PosCar); //Isole la première donnée Dinj = DinjStr.toFloat(); //Calcule la variable duree d'injection Param = Param.substring(PosCar+1); //Elimine de la chaine la première variable PosCar = Param.indexOf(','); //Determine la position du premier drapeau TotInjStr = Param.substring(0, PosCar); //Isole la première donnée TotInj = TotInjStr.toFloat(); //Calcule la variable nombre d'injections TotInjEC = TotInj; Param = Param.substring(PosCar+1); //Elimine de la chaine la deuxième variable PosCar = Param.indexOf('&'); //Determine la position du dernier drapeau NStr = Param.substring(0, PosCar); //Isole la première donnée N = NStr.toFloat(); //Calcule la varaiable vitesse moteur D720 = 120000 / N; //Durée du cycle en ms Param = ""; // Remise à zero ParamComplet = false; } } void setup() { // initialize serial: pinMode(rxPin,INPUT); // Broche en tant que RX, à raccorder sur TX du HC-05 pinMode(txPin,OUTPUT); // Broche en tant que TX, à raccorder sur RX du HC-05 BT.begin(9600); //Pour Smartphone, Bluetooth Serial.begin(9600); //Pour moniteur PC Timer1.attachInterrupt(isr_Fin_injection); //Tmr1 deconnecte l'injecteur pinMode(Inj1, OUTPUT); //Gate de l'IGBT qui commande l'injecteur pinMode(Led, OUTPUT); Param.reserve(200); // reserve 200 bytes pour Param: } void isr_Fin_injection() { Timer1.stop(); digitalWrite(Inj1, 0); //Couper l'injecteur digitalWrite(Led, 0); } void loop() { digitalWrite(Inj1, 0); //par precaution LectParam(); // Lecture des parametres transmis par bluetooth while (TotInjEC != 0) { // Boucle de comptage degressif TotInjEC--; //decompter cette injection InjPC =((TotInjEC*1000)/TotInj)-1; // Calcul du pourcentage d'avancement chaineBT = String(int(InjPC)); if (chaineBT.length()<2) { chaineBT = "0" + chaineBT; } if (chaineBT.length()<3) { chaineBT = "0" + chaineBT; } BT.println(chaineBT); // Transmission au smartphone du pourcentage d'avancement Timer1.initialize(Dinj); //Lancer TMR1 qui coupera l'injection digitalWrite(Inj1, 1); //Alimenter l'injecteur digitalWrite(Led, 1); delay(D720); // Attendre fin du cycle } }