Bonjour à tous.
Ayant un souci avec le programme ci dessous que je n'arrive pas à comprendre, je compte sur vos connaissances pour m'apporter un peu de lumière.
Pour faire simple, je fais un compteur dans le but d’acquérir les RPM KM/H et TEMP° en me servant des deux entrées en interruptions D2 et D3
Pour D2 j'ai une queue de cochon qui viens sur la base d'un BC547.
Pour D3 j'ai un capteur IR MC005 qui compte les trous dans mon disque de frein.
et je pilote une thermistance pour lire et moyennée la température moteur
Sauf que ma fonction pour les KM/H (D3 donc interruption N°1) n'arrive à m'afficher que jusqu’à 25KM/H.
Chaque bout de code a était tester a part avec le moniteur série et donne des résultats très correct! (avec deux diode IR en faisceau et une roue a trou lego technique).
concernant la partie RPM j'ai bien quelque doute mais les résultats réel ne sont pas complètement aberrant pour un moteur 2T; 1600 à 2000 au ralenti et dans les 14000tr/min a balle.
Pour les KM/H par contre..rester a 25 en pleine accélération.. j'ai un gros gros doute même avec une histoire de priorité dans les interruptions puisque même si je débranche le capteur D2, j'ai pareil..
En bref! Je sèche complètement.
Merci d'avance pour vos remarques/informations/conseils!!!
Code://PARTIE CAPTEURS NUMERIQUES int capteurRPM = 2; // capteur signal allumage sur PIN D2 int capteurIR = 3; //capteur IR sur PIN D3 (IR TEST = PEUT ETRE N'IMPORTE QUEL CAPTEUR) //int led=13; unsigned int trous; unsigned int ignitions; int nbTourRoue; float tourRoue; //float km_H; //float RPM; unsigned long lastMillisKm_h; unsigned long tempsRevolutionKm_h; unsigned long lastMillisRpm; unsigned long tempsRevolutionRpm; //////*lecture de temperature en 3.3V Aref sur NTC 100K + R100K *///////// unsigned long interval=200; unsigned long time; int ptr=0; #define NUMSAMPLES 10 //nombre de lecture int samples[NUMSAMPLES]; int ThermistorPin = A0; //pin analogique pour sonde NTC100K //(int) ActivationSonde = 12; // pin digital D12 //float R1 = 10000; //float logR2, R2, T; //float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07; /////////////////////////////////////////// void setup() ////PARTIE SETUP CAPTEUR KMH / RPM ////////// { trous=0; ignitions=0; nbTourRoue=0; tourRoue=1.415; //((2*3.14)*((13*25.4)/2)+60)=((2*3.14)*225.1)=1413.628cm=1.415m lastMillisKm_h=0; tempsRevolutionKm_h=0; lastMillisRpm=0; tempsRevolutionRpm=0; pinMode(capteurIR,INPUT); pinMode(capteurRPM,INPUT); attachInterrupt(0,nbIgnitions,RISING); attachInterrupt(1,nbTrous,FALLING); //pinMode(led,OUTPUT); //////PARTIE SETUP TEMPERATURE////////////////// Serial.begin(9600); analogReference(EXTERNAL); pinMode(0,INPUT); pinMode(12,OUTPUT); digitalWrite(12,LOW); //////FIN SETUP CAPTEURS/////// Serial.begin(9600); Serial.println("****DEBUT_PROGRAMME****"); Serial.println(""); } void loop() { capteurRPM=digitalRead(2); capteurIR=digitalRead(3); ////////PARTIE KM/H /////////////// if(trous>=7){ //detachInterrupt(1); tempsRevolutionKm_h= millis()-lastMillisKm_h; unsigned int km_H; //declaration de la variable dans la fonction pour gain de place => penalise la fonction //sendKmhToNextion(); km_H=((tourRoue/1000)*(3600000/tempsRevolutionKm_h)); nbTourRoue++; /* //partie pour visionnage sur ecran serie arduino Serial.print("nbtrous: "); Serial.print(trous); Serial.println(""); Serial.print("tempsRevolutionKm_h:"); Serial.print(tempsRevolutionKm_h); Serial.println(""); Serial.print(km_H); Serial.print(" :KM/H"); Serial.println(""); Serial.print("nbTourRoue"); Serial.print(nbTourRoue); Serial.println(""); Serial.print("lastMillisKm_h:"); Serial.print(lastMillisKm_h); Serial.println(""); Serial.print("millis"); Serial.print(millis()); Serial.println(""); */ //sendKmhToNextion(); Serial.print("n1.val="); Serial.print(""); Serial.print(km_H); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); trous=0; lastMillisKm_h=millis(); //tempsRevolutionKm_h=0; //apparement inutile //attachInterrupt(1,nbTrous,FALLING); } else if (millis()-lastMillisKm_h>=2000){ //sendKmhToNextion(); Serial.print("n1.val="); Serial.print(""); Serial.print(00); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); lastMillisKm_h=millis(); } ///////PARTIE TR/MIN ////////// if(ignitions>=50){ //detachInterrupt(0); tempsRevolutionRpm= millis()-lastMillisRpm; unsigned int Rpm; //declaration dans la variable dans la fonction pour gain de place => penalise la fonction //sendRPMToNextion(); Rpm =((ignitions*60000)/tempsRevolutionRpm);//equation a verifier!!!!!/!\/!\/!\ /* //partie pour visionnage sur ecran serie arduino Serial.print("nbIgnitions: "); Serial.print(ignitions); Serial.println(""); Serial.print("tempsRevolutionRPM:"); Serial.print(tempsRevolutionRpm); Serial.println(""); Serial.print(Rpm); Serial.print(" :RPM"); Serial.println(""); Serial.print("nbTourRoue"); Serial.print(nbTourRoue); Serial.println(""); Serial.print("lastMillisRPM:"); Serial.print(lastMillisRpm); Serial.println(""); Serial.print("millis"); Serial.print(millis()); Serial.println(""); */ //sendRPMToNextion(); Serial.print("n0.val="); Serial.print(""); Serial.print(Rpm); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); ignitions=0; lastMillisRpm=millis(); //tempsRevolutionRPM=0; //apparement inutile //attachInterrupt(0,nbIgnitions,RISING); } else if (millis()-lastMillisRpm>=2000){ //sendKmhToNextion(); Serial.print("n0.val="); Serial.print(""); Serial.print(00); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); lastMillisRpm=millis(); } //////////PARTIE TEMPERATURE///////////////////// float Moyenne; time=millis(); while (millis()< (time+interval) ) ; ReadTemp(ptr); ptr ++; /* Serial.print("ptr"); Serial.print( ptr); Serial.println(); Serial.println("samples[]"); Serial.println(samples[0]); Serial.println(samples[1]); Serial.println(samples[2]); Serial.println(samples[3]); Serial.println(samples[4]); Serial.println(samples[5]); Serial.println(samples[6]); Serial.println(samples[7]); Serial.println(samples[8]); Serial.println(samples[9]); Serial.println();*/ if (ptr>=NUMSAMPLES){ Moyenne = 0; for (int i=0; i<NUMSAMPLES; i++) { Moyenne += samples[i];} Moyenne /= NUMSAMPLES; /* Serial.print ("Moyenne"); Serial.print (Moyenne); Serial.println(); */ float R1 = 10000; float logR2, R2, T; float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07; R2 = R1 * (1023.0 / (float)Moyenne - 1.0); logR2 = log(R2); T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2)); T = T - 273.15; // T = (T * 9.0)/ 5.0 + 32.0; // pour affichage en degree Farhenheit /* Serial.print ("Temperature:"); Serial.print ( T); Serial.println ("C"); */ //sendTEMPToNextion(); Serial.print("t3.txt="); Serial.print("\""); Serial.print(T); Serial.print("\""); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); time=millis(); ptr=0;} } ///////////////////partie attribuée aux fonctions!!!/////////////////////// //fonction comptage nb trou void nbTrous() {trous++;} //fonction comptage ignitions void nbIgnitions(){ignitions++;} //fonction moyenne de TEMP° void ReadTemp(int n) { digitalWrite(12,HIGH); samples[n] = analogRead(ThermistorPin); // //Serial.println("samples[n]"); //Serial.print(samples[n]); digitalWrite(12,LOW); } /* //fonction d'envoi Km/H void sendKmhToNextion() { Serial.print("n1.val="); Serial.print(""); Serial.print(km_H); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); //sendKmhToNextion(); //oblige a declarer de facon global la variable km_H } //fonction d'envoi RPM void sendRPMToNextion() { Serial.print("n0.val="); Serial.print(""); Serial.print(RPM); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); //sendRPMToNextion(); //oblige a declarer de facon global la variable RPM } */
-----