// ECU Control System - EJ10T-H Twincharged Hydrogen Engine
// Proyecto TX-57 | Firmware Avanzado
#include <Arduino.h>
// Se agregan divisores para mejorar el entendimiento del sistema.
// === Pines de Sensores y Actuadores ===
constexpr uint8_t RPM_SENSOR = A0;
constexpr uint8_t TPS_SENSOR = A1;
constexpr uint8_t COOLANT_SENSOR = A2;
constexpr uint8_t PRESSURE_SENSOR = A3;
constexpr uint8_t KNOCK_SENSOR = A4;
constexpr uint8_t O2_SENSOR = A5;
constexpr uint8_t RELAY_SUPERCHARGER = 5;
constexpr uint8_t SOLENOID_TURBO = 6;
constexpr uint8_t RELAY_FAN = 7;
constexpr uint8_t INJECTOR_PINS[4] = {8, 9, 10, 11};
// === Parámetros Críticos ===
constexpr int IDLE_RPM = 900;
constexpr int MAX_RPM = 8500;
constexpr int FAN_ON_TEMP = 90; // °C
constexpr int FAN_OFF_TEMP= 80; // °C
// === Estructuras de Datos ===
struct SensorReadings {
int rpm;
int throttle;
int coolantTemp;
int intakePressure;
int knock;
int o2;
};
struct TelemetryPacket {
SensorReadings data;
bool turboActive;
bool superchargerActive;
};
// === Variables Globales ===
bool g_turboActive = false;
bool g_superchargerActive = false;
// === Prototipos de Funciones ===
SensorReadings readSensors();
bool manageInjection(const SensorReadings&);
TelemetryPacket controlBoost(const SensorReadings&);
bool thermalControl(int temperature);
void diagnosticLog(const TelemetryPacket&);
void setup() {
Serial.begin(115200);
// Configuración de pines
pinMode(RELAY_SUPERCHARGER, OUTPUT);
pinMode(SOLENOID_TURBO, OUTPUT);
pinMode(RELAY_FAN, OUTPUT);
for (auto pin : INJECTOR_PINS) pinMode(pin, OUTPUT);
}
void loop() {
// Paso 1: Lectura de sensores
auto sensors = readSensors();
// Paso 2: Inyección de combustible
if (!manageInjection(sensors)) {
Serial.println("[ERROR] Falla en inyección");
}
// Paso 3: Control de sobrealimentación
auto telemetry = controlBoost(sensors);
// Paso 4: Control térmico
if (!thermalControl(sensors.coolantTemp)) {
Serial.println("[WARN] Temperatura crítica");
}
// Paso 5: Log y telemetría
diagnosticLog(telemetry);
delay(20);
}
SensorReadings readSensors() {
SensorReadings r;
r.rpm = analogRead(RPM_SENSOR);
r.throttle = analogRead(TPS_SENSOR);
r.coolantTemp = analogRead(COOLANT_SENSOR);
r.intakePressure = analogRead(PRESSURE_SENSOR);
r.knock = analogRead(KNOCK_SENSOR);
r.o2 = analogRead(O2_SENSOR);
return r;
}
bool manageInjection(const SensorReadings& s) {
if (s.throttle < 0 || s.throttle > 1023) return false;
int basePulse = map(s.throttle, 0, 1023, 1000, 10000); // microsegundos
for (auto pin : INJECTOR_PINS) {
digitalWrite(pin, HIGH);
delayMicroseconds(basePulse);
digitalWrite(pin, LOW);
}
return true;
}
TelemetryPacket controlBoost(const SensorReadings& s) {
TelemetryPacket t;
t.data = s;
// Supercargador
if (s.throttle > 600 && s.rpm > 2000) {
digitalWrite(RELAY_SUPERCHARGER, HIGH);
g_superchargerActive = true;
} else {
digitalWrite(RELAY_SUPERCHARGER, LOW);
g_superchargerActive = false;
}
// Turbo
if (s.rpm > 3500 && s.throttle > 500) {
digitalWrite(SOLENOID_TURBO, HIGH);
g_turboActive = true;
} else {
digitalWrite(SOLENOID_TURBO, LOW);
g_turboActive = false;
}
t.turboActive = g_turboActive;
t.superchargerActive = g_superchargerActive;
return t;
}
bool thermalControl(int temperature) {
if (temperature >= FAN_ON_TEMP) {
digitalWrite(RELAY_FAN, HIGH);
} else if (temperature <= FAN_OFF_TEMP) {
digitalWrite(RELAY_FAN, LOW);
}
return (temperature < 110); // Señala advertencia si supera 110°C
}
void diagnosticLog(const TelemetryPacket& t) {
Serial.print(F("[TELEMETRY] RPM:")); Serial.print(t.data.rpm);
Serial.print(F(" THR:")); Serial.print(t.data.throttle);
Serial.print(F(" TMP:")); Serial.print(t.data.coolantTemp);
Serial.print(F(" KNOCK:")); Serial.print(t.data.knock);
Serial.print(F(" O2:")); Serial.print(t.data.o2);
Serial.print(F(" BOOST(SC/TC):")); Serial.print(t.superchargerActive);
Serial.print(F("/")); Serial.println(t.turboActive);
}







