Problema com velocidade de processamento Arduino NANO - Corte de giro RPM

Olá galera estou desenvolvendo um corte de giro para um amigo.
O Sistema é bem simples conta o RPM do carro e quando atingir o limite determinado em uma variavel ele joga a saída 13 para LOW. Porem o arduino esta se mostrando muito lento em processar exibir e executar as ações.

O carro em marcha lenta fica e 850 RPM se eu for acelerando devagar ao invez de subir 850-860-890-900......

ele sobe assim 850-970-1200-1700.... como se tivesse algo segurando o tempo de refresh algo do tipo.
Isso é um problema pois o carro sempre corta após o RPM programado na variavel. ou seja ele passa pelos 7000 rpm e corta lá pelos 7800 + -

eu peguei como base um equipamento profissional chamado TRE-STEP abri ele e fiz exatamente o mesmo esquema para ler o pulso rpm. e o mesmo sistema da bobina do carro usando um tip 147 e u bc547 como gatilho na saida 13 do arduino.

estou usando os 2 simultaneamente para comparar o valor RPM do carro. e esta igual. porem o TRE-STEP sobe de forma limpa o RPM no display 1.2.3.4.5.6.... e o arduino sobe com atrasos 1.4.7.9.. mais no final o valor é o mesmo!

segue o codigo apenas do contador de RPM (com mais 2 entradas -agua temp e voltagem)

 #include <liquidcrystal_i2c .h="">

#include <wire .h="">
int pinoSensor = 0; //pino que está ligado o terminal central do LM35 (porta analogica 0)
int valorLido = 0; //valor lido na entrada analogica
float temperatura = 0;
int pinoTensao = 1;
int valorTensao = 0; //valor lido na entrada analogica
float tensao = 0;
byte detecta = 2;
int contador = 0;
LiquidCrystal_I2C lcd(0x38,16,2);
void setup()
{
lcd.init();
lcd.backlight();
lcd.print("Digital RPM");
pinMode(detecta,INPUT);
digitalWrite(detecta,HIGH);
contador = 0;
attachInterrupt(0, DETECTA, FALLING);
noInterrupts();

delay (10000);

}

void loop()
{
unsigned long tempo = millis();
while(tempo +300 > millis())
{
interrupts();

}

contador = contador * 100 ;

valorLido = analogRead(pinoSensor);

temperatura = (valorLido * 0.00488); // 5V / 1023 = 0.00488 (precisão do A/D)
temperatura = temperatura * 100;
valorTensao = analogRead(pinoTensao);
tensao = valorTensao * 0.00488 ;
tensao = tensao * 4 ;

lcd.setCursor(0, 0);
lcd.print("V:");
lcd.print(tensao);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(temperatura);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("RPM:");
lcd.print(contador);
lcd.print(" ");
contador = 0;
}
void DETECTA()
{
contador ++;
}

a alteração que fiz no codigo acima foi colocar

 if     
         (contador > 4000)
      {
       digitalWrite(tip, LOW);
      } 
      if (contador < 3990)
      {
       digitalWrite(tip, HIGH);
      }

porem mesmo sem colocar isso (usando o original) o display não mostra o rpm de forma limpa. 1.2.3.4.5.6..... etc... teria como resolver isso?

Não gosto desta parte:

unsigned long tempo = millis();
while(tempo +300 > millis())
{
interrupts();

}

isto provoca uma paragem no programa e durante esse tempo o programa não faz nada, sem ser ler as RPM do motor. O resto do programa faz os cálculos e exibe no display o valor. Uma coisa que não sei se está a provocar o que descreve ou não é o facto de utilizar um LCD I2C em vez de um LCD com barramento paralelo. Quanto tempo demora o programa a escrever no LCD? Tente usar a função millis para determinar esse valor e talvez tenha a resposta para a sua questão.

Entao eu estou a usar o lcd normal e nao em serial. Este é o codigo original porem eu mudei apenas o display.

Isso mesmo o arduino para tudo enquanto executa a funcao interrupt.

Nao consegui fazer em milis :frowning:

Tambem nao pude usar delay no setup o nointerrupt impediu :frowning:

Eu tentava uma alteração como a seguinte na função loop():

unsigned long tempo = 0;
int rpm;
void loop()
{
  rpm = contador * 100 ;

  valorLido = analogRead(pinoSensor);

  temperatura = (valorLido * 0.00488); // 5V / 1023 = 0.00488 (precisão do A/D)
  temperatura = temperatura * 100;
  valorTensao = analogRead(pinoTensao);
  tensao = valorTensao * 0.00488 ;
  tensao = tensao * 4 ;

  lcd.setCursor(0, 0);
  lcd.print("V:");
  lcd.print(tensao);
  lcd.print(" ");
  lcd.setCursor(0, 1);
  lcd.print("T:");
  lcd.print(temperatura);
  lcd.print(" ");
  lcd.setCursor(8, 1);
  lcd.print("RPM:");
  lcd.print(rpm);
  lcd.print(" ");

  if (millis()-tempo > 300)
  {
    contador = 0;
    tempo = millis();
  }
}

boa noite,

conseguiu resolver teu problema da lentidao dos dados? estou com o mesmo problema..

Att leandro