//Strobo-compte-tours //Avec smartphone ou tablette Andoid //La luminosite du flash est modifiable a l'utilisation char Ver[] = " StroboDroid 16_11_17"; //Chaque étincelle declenche l'isrEtin qui calcul T et lance Timer1 pour Ddeg µs //Timer1 génère une it qui lance isrFlash() qui émet 1 flash, et calcul le futur Ddeg //********IMPORTANT : Moniteur et HC05/06 tous à 9600bps********************** //Hardware: 7805 alim 5V( branché sur +12V de l'auto) + HC 05 ou 06, 9600bps, Arduino (Uno, Nano etc) //La capture des étincelle se fait au primaire de la bobine par connexion directe //Avantages: fiabilité de capture et aucune pince inductive necessaire //Les commandes sont reçues et affichées sur un smartphone/tablette Android //APPLI Smartphone: conseillée ,excellente et va bien aussi avec HC-06! //***************MODE D'EMPLOI************************** //Connecter le fil de capture d'étincelle sur la sortie du primaire de la bobine //On y trouve en general le fil du compte-tours de l'auto //Connecter la masse puis le + sur le +12 de la bobine. // Activer le Bluetooth sur le smartphone.Lancer l'appli //A la première utilisation uniquement, le smartphone demande // le mot de passe du module HC05/06 qui est toujours 1234 d'origine #include "TimerOne.h" #include // EEPROM.read(adEP);EEPROM.write(adEP); #include SoftwareSerial BT(10, 11); // RX,TX respectivement vers le HC05/06 à 9600bps int D_Flash = 50; //Durée du flash en µs:Modifiable //C'est un compromis entre précision(faible étalement du spot ) et luminosité //Ajustable à l'ecran du smartphone #define Etin 2 //Entrée de l'étincelle, sur D2, IT 0,montant #define Flash 4 //Sortie vers flash #define LED13 13 //Led standard de l'Arduino, activée idem le flash int Ncyl = 4; //Declarer le nb de cylindre car on se connecte au primaire bobine //Pour un moteur 2 temps, multiplier par 2 le nombre de cylindres String Ligne;//Ligne lue au clavier jusqu'a \n int intLigne = 0; //Ligne convertie en entier int signed long T = 0; //Periode en cours(signée pour le calcul de D_deg) int unsigned long prec_H = 0; //Heure du front precedent en µs int unsigned long D_deg = 0;//Délai pour deg_dem degrès en µs int degT = 0; //La periode T entre 2 étincelles correspond à degT degrés = 720/Ncyl en 4 temps //Exemple: pour 4 cylindres T correspond à 180° vilo (90° A à C) int unsigned N = 0; //N en tours/mn/10.Quand on l'affiche on x10, ce qui arrondit à la dizaine int signed deg_dem = 0; //Compteur des degrés demandés,affiché au smartphone int degInitial = 10; //Affiché au demarrage float k = 12000000; //Ajuste fonction de Ncyl, pour calcul de N=k/T, connaissant T ///////////////////LES FONCTIONS////////////////// void Affic_N_A()////////////////////////////////////// { // Affiche le couple N,Avance, gelé quand les reperes sont alignes while (1) { BT.print("Au regime t/mn = "); BT.println(N * 10); BT.print("Avance en degres = "); BT.println(deg_dem); BT.println();//N *10 supprime les unités inutiles BT.println("Pour continuer entrer ...c "); BT.println(); BT.println("( pour modifier la duree du flash ...f )" ); BT.println(); AttendreLigne();//Revient dès qu'un car est tapé if (Ligne == "f")FlashModif(); //Modifier la duree du flash if (Ligne == "c")break; BT.println("?");//Erreur } } void AttendreLigne()/////////////////////////////////// { //On n'en ressort qu'avec Ligne remplie while (BT.available() == 0); //on attend qu'un car soit present dans le buffer VoirSiLignePresente();//On va remplir Ligne } void FlashModif()/////////////////////////////// { //Pour modifier la durée du flash donc sa luminosité while (1) { BT.print("Duree actuelle du flash: "); BT.println(D_Flash ); BT.println(" Si OK, pour continuer entrer...c"); BT.println(" Sinon entrer ... 20 a 500"); BT.println(); AttendreLigne(); if (Ligne == "c")break; //Ne rien changer et sortir if ((intLigne >= 20) && (intLigne <= 500)) { D_Flash = intLigne; //Modifier la duree du flash break; } BT.println("?");//Hors limite } } void GetNcyl()//////////////////////////////////////////// { //A fournir et X2 pour moteur 4 temps while (1) { BT.print(F("Nb de cylindres = ")); BT.println(Ncyl); BT.println(" Si OK, pour continuer entrer...c"); BT.println(" Sinon entrer ... 1 a 12"); BT.println(); AttendreLigne(); if (Ligne == "c")break; //Ne rien changer if ((intLigne >= 1) && (intLigne <= 12)) { Ncyl = intLigne; //Modifier Ncyl break; } BT.println("?");//Hors limite } BT.print("Nb de cylindres = "); BT.println(Ncyl); BT.println(); { volatile float ct = 0; volatile float duree = 100000; //100 pour 1.25ms eviron while (ct < duree) ct++ ; } k = k / Ncyl; //Ajuster pour calcul de N/10 t/mn deg_dem = degInitial; //Avance au lancement degT = 720 / Ncyl; //La periode T entre 2 étincelles correspond à degT degrés } void isrEtin()/////////////////////////////// { //A chaque front montant d'étincelle T = micros() - prec_H; //D2 est monté, calculer T prec_H = micros(); //heure de début prochaine periode Timer1.initialize(D_deg);// Flash après delai D_deg µs N = k / T; //en t/mn/10 } void isrFlash()//////////////////////////////// { //Active par le depassement de Timer1, après le front d'etincelle Timer1.stop(); digitalWrite (Flash, 1); delayMicroseconds(D_Flash); digitalWrite (Flash, 0); digitalWrite (LED13, 1); delayMicroseconds(10 * D_Flash); digitalWrite (LED13, 0); D_deg = float(T * deg_dem) / float(degT); //Délai en µs pour les degrés demandés, periode suivante } void monDelay_ms(int unsigned long delai)///////////////////////////// { //Attente en ms, remplace delay(), interdite avec les IT volatile float ct = 0; volatile float duree = delai * 100 / 1.25; //100 pour 1.25ms environ while (ct < duree) ct++ ;//Pour ne pas manquer un car } void VoirSiLignePresente()////////////////////////////////////// { //Si aucun car dans le buffer d'entrée, on ressort immediatement Ligne = ""; //String donc double quote while (BT.available() > 0) // BT.available(), nb de car dans le buffer { monDelay_ms(300);//Pour ne pas manquer un car.Assez lent pour BlueTerm +, //qui envoie chaque car immediatement, sans touche "Envoi". Qd on entre 2 chiffres, il faut ces 300ms char carLu; carLu = BT.read(); //Si pas de car en attente ds buffer on sort tt de suite // if ((carLu >= 32 ////Car valable,alphabetique, on le garde // ) && (carLu <= 122))Ligne = Ligne + carLu; // Tous les autres car, tels CR,LF, !,&, + etc sont ignorés if ((carLu == 13) || (carLu == 10)); //ignorer CR et LF uniquement, garder les autres car else Ligne = Ligne + carLu; //Car valable,alphabetique ou autre, on le garde } //Le buffer est vide intLigne = Ligne.toInt(); //Convertir en entier a tout hasard } void setup() ////////////////////////////////////// { BT.begin(9600);//La liaison série soft D10 et D11 vers module Bt HC05 ou 06 !!!VERIFIER cette vitesse!! Serial.begin(9600);//La série standard, hardware, D0 et D1 vers PC!!VERIFIER cette vitesse!! pinMode(Etin, INPUT);//1 qd etincelle, front montant pinMode(Flash, OUTPUT);// pinMode(LED13, OUTPUT);//Repetiteur de flash BT.println(); BT.println(); BT.println("Bonjour"); BT.println(); BT.print(" "); Serial.println(Ver); BT.println(Ver); BT.println();// BT.println(); BT.print("Compte-tours et stroboscope "); BT.println("PhL"); BT.println(); // BT.println(__DATE__); BT.println(__TIME__); delay(3000);//OK avant les IT BT.println(); attachInterrupt(0, isrEtin, RISING); //IT0 sur D2, front montant, isrEtin() executée Timer1.attachInterrupt(isrFlash);//Après un delai de Ddeg emet un flash de durée 10 * D_Flash Timer1.stop(); // VoirSiLignePresente();//purger buffer GetNcyl();// 4 cylindre par defaut } void loop() { while (1) //On demarre en mode compte-tours { BT.print("N t/mn "); BT.print(N * 10); BT.println(" Pour le stroboscope entrer ...s"); { volatile float ct = 0; volatile float duree = 40000; //100 pour 1.25ms eviron while (ct < duree) ct++ ; //Remplace delay(), a eviter avec les IT } VoirSiLignePresente(); if (Ligne == "s")break; //Passer au strobo } while (1) { //On est passe en mode strobo et on y reste BT.print("Avance en degres "); BT.println(deg_dem); BT.println(); BT.println("Nouvelle avance, entrer ... 1 a 45 "); BT.println("Accelerer jusqu'a l'alignement des reperes poulie et carter"); BT.println(); BT.println("A l'alignement, entrer ... a "); BT.println(); AttendreLigne(); if (Ligne == "a") Affic_N_A(); //Geler le couple N,Avance if ( (intLigne > 0) && (intLigne < 45))deg_dem = intLigne; //Nouvelle avance } } //DEBUG // macro de debug, point d'arret pa(v); #define pa(v) Serial.print("Ligne_") ; Serial.print(__LINE__) ;Serial.print(" ; ") ; Serial.print(#v) ;Serial.print(" = ") ; Serial.println((v)) ; Serial.println(" Clic bouton 'Envoyer' pour continuer") ;while (Serial.available()==0);{ int k_ = Serial.parseInt() ;} //Exemple, à la ligne 145, l'instruction pc(var2); // inprimera "Ligne_145var2 = 25.3 Clic bouton 'Envoyer' pour continuer"