//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 //Pour Bluetooth BT SoftwareSerial BT(10, 11); // RX,TX respectivement vers le HC05/06 à 9600bps #define Nmax 8000 //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 = 120000 / 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, 0); //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, 0); //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 = 120000 / N; //Un cycle en ms } else TotInj--; //Mode Sphone, decompter cette injection Timer1.initialize(Dinj);//Lancer TMR1 qui coupera l'injection digitalWrite(Inj1, 1); //Alimenter l'injecteur digitalWrite(Led, 1); delay(D720);// Attendre fin du cycle if (TotInj == 0)GameOver(); //Fin du test, jamais executé en mode Potard }