//Strobo-compte-tours Modifié par Vincent Bojanowski //Avec smartphone ou tablette Andoid //La luminosite du flash est modifiable a l'utilisation char Ver[] = " StroboDroid 13.01.23"; // Programme original: Ph. Loutrel / Modification et adaptation pour App Android: V. Bojanowski. //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 = 0; //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 deg_dem = 0; //Compteur des degrés demandés,affiché au smartphone //int degInitial = 0; //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 N sur Android et Avance deg_dem, D_Flash, Ligne, N... sur port série // k = k / Ncyl; //Ajuster pour calcul de N/10 t/mn degT = 720 / Ncyl; //La periode T entre 2 étincelles correspond à degT degrés // Serial.print ("t/min = " ); Serial.println(N * 10); BT.println(N * 10); // AttendreLigne(); // // Réglage durée du Flash (en ms) depuis Android if ((intLigne >= 110) && (intLigne <= 200)) { D_Flash = (intLigne - 100); } // // Avance demandée depuis Android: if ((intLigne >= 0) && (intLigne <= 45)) { deg_dem = intLigne; } // // Surveillance des ordres reçus via port série: Serial.print("Ligne reçue = "); Serial.println(Ligne); // Serial.print("intLigne = "); Serial.println(intLigne); // Serial.print("Ncyl = "); Serial.println(Ncyl); Serial.print("deg_dem = "); Serial.println(deg_dem); Serial.print("D_Flash = "); Serial.println(D_Flash); // } 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 GetNcyl()//////////////////////////////////////////// { //A fournir et X2 pour moteur 2 temps // while (1) { AttendreLigne(); // if ((intLigne >= 1) && (intLigne <= 12)) { Ncyl = intLigne; //Modifier Ncyl } Serial.print("Ncyl = "); Serial.println(Ncyl); // if (Ncyl > 0) break; //Passer au strobo } // } 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(5);//Pour ne pas manquer un car. Très rapide avec App Android //qui envoie chaque car immediatement, sans touche "Envoi", il faut ces 5ms max pour ne pas avoir d'erreur en cas de double-appui très bref. 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 // // Serial.print("carLu = "); Serial.println(carLu); // } // 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 !!!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 // 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(); // GetNcyl(); // } void loop() { while (1) { //On est passe en mode strobo et on y reste // Serial.println("strobo OK"); // Affic_N_A(); // } // }