#include <Arduino.h>
// Declarações de variáveis globais
uint16_t map_value, tps_value, iat_value;
uint8_t injector_index;
// Struct para os mapas de injeção
typedef struct {
uint16_t rpm;
uint16_t load;
uint16_t fuel_quantity;
} InjectionMap;
// Mapa de injeção
InjectionMap injection_map[] = {
{0, 0, 0}, // Ponto inicial
{100, 10, 1}, // RPM = 100, Carga = 10
{200, 20, 2}, // RPM = 200, Carga = 20
{300, 30, 3}, // RPM = 300, Carga = 30
{500, 50, 5}, // RPM = 500, Carga = 50
{1000, 75, 10}, // RPM = 1000, Carga = 75
{2000, 100, 20}, // RPM = 2000, Carga = 100
{3000, 125, 30}, // RPM = 3000, Carga = 125
{4000, 150, 40}, // RPM = 4000, Carga = 150
// Adicione mais pontos conforme necessário
};
// Função para calcular a quantidade de combustível
uint16_t calculate_fuel_quantity(uint16_t map_value, uint16_t load_value) {
int map_size = sizeof(injection_map) / sizeof(InjectionMap);
// Verifica se os valores estão fora do alcance
if (map_value < injection_map[0].rpm || load_value < injection_map[0].load) {
Serial.println("Valores fora do alcance!");
return 0;
}
for (int i = 0; i < map_size - 1; i++) {
if (map_value >= injection_map[i].rpm && map_value <= injection_map[i + 1].rpm) {
// Interpolação para RPM
uint16_t fuel_rpm = injection_map[i].fuel_quantity +
(map_value - injection_map[i].rpm) *
(injection_map[i + 1].fuel_quantity - injection_map[i].fuel_quantity) /
(injection_map[i + 1].rpm - injection_map[i].rpm);
// Interpolação para Carga
uint16_t fuel_load = injection_map[i].fuel_quantity +
(load_value - injection_map[i].load) *
(injection_map[i + 1].fuel_quantity - injection_map[i].fuel_quantity) /
(injection_map[i + 1].load - injection_map[i].load);
// Retorna a média entre os valores interpolados de RPM e Carga
return (fuel_rpm + fuel_load) / 2;
}
}
Serial.println("Não foi possível encontrar uma correspondência.");
return 0; // Retorna 0 se não encontrar valores válidos
}
// Função para ler os sensores simulados - substitua com leitura real do sensor se necessário
uint16_t readSensorMAP() {
return analogRead(A0); // Exemplo: Leitura do MAP no pino A0
}
uint16_t readSensorTPS() {
return analogRead(A1); // Exemplo: Leitura do TPS no pino A1
}
uint16_t readSensorIAT() {
return analogRead(A2); // Exemplo: Leitura do IAT no pino A2
}
// Função para ajustar a largura do pulso do injetor (simulado aqui)
void adjust_injector_pulse_width(uint8_t injector_index, uint16_t pulse_width) {
// Exemplo: Defina um pino PWM e ajuste o pulso
analogWrite(9, pulse_width); // Envia o valor de combustível para o injetor no pino 9
}
void setup() {
Serial.begin(9600); // Inicializa a comunicação serial
pinMode(9, OUTPUT); // Define o pino do injetor como saída (ajuste conforme necessário)
}
void loop() {
// Leitura dos sensores
map_value = readSensorMAP();
tps_value = readSensorTPS();
iat_value = readSensorIAT();
// Adiciona a depuração para verificar os valores
Serial.print("MAP: ");
Serial.print(map_value);
Serial.print(" | TPS: ");
Serial.print(tps_value);
Serial.print(" | IAT: ");
Serial.println(iat_value);
// Cálculo da quantidade de combustível com base no MAP e TPS (ou carga)
uint16_t fuel = calculate_fuel_quantity(map_value, tps_value);
// Ajusta o pulso do injetor com o valor calculado
adjust_injector_pulse_width(injector_index, fuel);
// Exibe os valores calculados
Serial.print("Fuel: ");
Serial.println(fuel);
delay(500); // Atraso para facilitar a leitura no Monitor Serial
}