Salut tout le monde,
je suis en train de fabriquer un compte-tours pour ma moto mais j'ai quelques soucis au niveau du code. A chaque fois que détecte une impulsion de la bougie, je crée une interruption. Le programme va mesurer le temps entre 2 impulsions ce qui va me donner après calcul le nombre de rotation par minute (1 impulsion = 2 tours moteur).
Je fais une moyenne sur 200 impulsions. Le problème est que entre chaque impulsion je voudrais faire autre chose, tel que le relevé de température, tension batterie ... Mais si j'essaie d'afficher quelque chose sur l'écran lcd dans mon do-while, je n'obtient pas la bonne valeur, comme si la commande lcd.print était plus prioritaire que l'interruption , ce qui me fait manquer des impulsion à cause de son temps d’exécution. Je ne sais pas si j'ai été très clair. N'hésiter pas à me demander plus de détails
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4);
const byte interruptPin = 2;
volatile byte Pulsation = 0;
float NewPulse = 0;
float OldPulse = 0;
float RPM = 0;
const int L1 = 53;
int PulsationCompt = 0;
const int NbPulseCompt = 200;
void setup()
{
Serial.begin(9600);
lcd.init(); // initialisation de l'afficheur
lcd.backlight();
pinMode(L1, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), pulse, FALLING);
analogWrite(3, 150);
}
void pulse() {
Pulsation = 1;
}
void loop() {
do {
//Serial.println("entrée dans le do");
// digitalWrite(L1, HIGH);
// lcd.setCursor(0,2);
// lcd.print("Bonjour");
}
while (Pulsation == 0);
if (Pulsation == 1) {
PulsationCompt++;
NewPulse = millis();
if (PulsationCompt == NbPulseCompt) {
detachInterrupt(interruptPin);
//Serial.println(NewPulse);
//Serial.println(OldPulse);
RPM = (((NewPulse - OldPulse)/NbPulseCompt ) * 60000) / 2;
lcd.setCursor(0, 0);
lcd.print("RPM = ");
lcd.setCursor (7, 0);
lcd.print(RPM);
// Serial.print("RPM = ");
// Serial.println(RPM);
OldPulse = NewPulse;
PulsationCompt = 0;
}
Pulsation = 0;
}
}