Sim e não. Creio que consegui resolver o algoritmo. Pelo menos comparando com o mid está funcionando corretamente.
Usei a seguinte lógica para chegar no algoritmo do consumo instantâneo.
Apartir da macha lenta com o carro devidamente aquecido, medi vários parâmetros e cheguei a seguinte conclusão
# litros Hora
1,1
# Litros em minutos
(1,1/60) = 0,0183333333
# Litros em segundos
0,0183333333/60 = 0,0003055556
# Tempo de Onda (high) por minuto
549ms
# Tempo de Onda High por segundo
549/60 = 9,15
# Representação em litros por 1 segundo de Onda High - Valor mais importante para o cálculo ele diz quanto combustível é injetado em 1 segundo
(1*0,0003055556)/9,15 = 0,00003339404978749240
#Equivalencia do tempo de Ondas em Consumo hora (3600s)
(((9,15*60)*0,00003339404978749240)/60)*3600 = 1,1
(9,15*0,00003339404978749240)*3600 = 1,1
Apartir disso construi o seguinte programa, no qual exibe o consumo e armazena o combustivel usado em uma variável para uso futuro (estamos falando consumo do carro com ausência de movimento.
Código: Selecionar todos
long currentMillis = 0;
long lastMillis = 0;
long checkMillis = 0;
float realMillis;
int count = 0;
float consumoHora;
volatile long pwm_value = 0;
volatile long pwm_value_old = 0;
volatile long prev_time = 0;
void setup() {
Serial.begin(115200);
// when pin D2 goes high, call the rising function
Serial.println("ok");
attachInterrupt(0, rising, RISING);
}
void loop()
{
if (lastMillis == 0) {
lastMillis = millis();
}
currentMillis = millis();
checkMillis = (currentMillis - lastMillis);
if (checkMillis >= 1000) {
realMillis = (checkMillis / 1000);
pwm_value_old += pwm_value;
float consumo;
consumo = (pwm_value*0.00003339404978749240)*3600;
lastMillis = 0;
checkMillis = 0;
realMillis = 0;
Serial.println("PWMValueOld");
Serial.println(pwm_value_old);
//Serial.println("count");
//Serial.println(count);
//Serial.println("count");
Serial.println("consumo");
Serial.println(consumo);
count = 0;
pwm_value = 0;
}
}
void rising() {
attachInterrupt(0, falling, FALLING);
prev_time = millis();
}
void falling() {
attachInterrupt(0, rising, RISING);
pwm_value += millis()-prev_time;
count++;
}
Mais uma vez não reparem no código mal feito, e nos nomes bizarros nas variáveis, pretendo rescrever tudo e deixar legível. Funciona porém eu não fiquei tão satisfeito com a metodologia, pois eu usei um valor do mid e fiz cálculos reversos. O ideal mesmo era pegar o tempo de injeção que é de 2,4ms em macha lenta juntar com o sinal mais as informações técnicas dos injetores e chegar a um valor com embasamento e conseguir que esse valor de 0,00003339404978749240 seja um valor mais realístico.
Porem esse ponto só testando pra saber, talvez realmente eu tenha acertado pois os valores estão batendo com o do mid ou talvez esse fator precise de ajustes.
-Proximos passos, integrar a lógica desse algorítmo com o de Distância (que está parcialmente pronto) e testar a principal função do pc de bordo: (distância, velocidade atual, velocidade máxima, consumo instantâneo e consumo médio. Nessa parte devo rodar alguns tanques afim de medir a acuracidade das informações. Se ficar na margem de 5% de erro para mais ou para menos, partirei para os acessórios.