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?