Arduino como un HKS Fuel cut defender

Saludos a todos

Para los que no saben de mecánica automotriz les explico :

cuando el map registra 4.5 v +/- 10% la computadora del vehículo registra que la presion del turbo esta excedida a lo registrado de fabrica y quita la inyeccion de combustible . "Evitando que el motor se estropee

soy muy novato en arduino ( 1 semana) y logre hacer un codigo para que mi arduino tome la señal original y segun 3 parametros distintos me de distintos TOPES (3.9 v, 4.3 v y 4.5v) , necesito de su ayuda porque llevo 2 dias intentando ver como puedo elegir entre estos 3 modos al pulsar 1 boton .
intente con if con for con switch con goto y while pero no logro hacer funcionar bien la opcion , alguna sugerencia?

adjunto codigo:

const int pin = 7;
const int MAPIN = A0;
const int MAPOUT = 10;
const int CPOR = A5;
int valor = 0; // lectura del map mapin A0
int valor1 = 0; //lectura de correccion CPOR A5
int TOPE1; //guarda la correccion del 25%
int TOPE2; //guarda la correccion del 50%
int TOPE3; //guarda la correccion del 75%
int COR; //guarda la correccion de bencina al map 
int Div; //voltaje convertido de 1024 a 255 para map
int POT; //voltaje convertido de 1024 a 255 para correcion

void setup()

{

 Serial.begin(9600);
pinMode(pin, INPUT);
pinMode(MAPOUT,OUTPUT); // Definimos el pin digital de salida   

}

void loop() 

{
      // LEER EL VALOR DE ENTRADA DEL MAP
     
  int valor = analogRead(MAPIN);

     // LEER EL VALOR DE ENTRADA DEL POTENCIOMETRO DE CORRECION PORCENTUAL
     
  int valor1 = analogRead(CPOR);

  
  // HACEMOS LA CONVERSION DE 1024 SECCIONES A 255 
  
  Div = valor/4;
  POT = valor1/4;
  
   // MAPIAMOS LA CORRECCION
   
  TOPE1 = map( Div ,0 ,240 ,0,220);  //CORTA VOLTAJES SOBRE 4.5 V
  TOPE2 = map( Div ,0 ,240 ,0,210);  //CORTA VOLTAJES SOBRE 4.3 V
  TOPE3 = map( Div ,0 ,240 ,0,200);  //CORTA VOLTAJES SOBRE 3.9 V
  COR = map( POT ,0 ,255 ,0,20); // CORRECION PORCENTUAL 
  

  
if (Div > 200)
{
analogWrite ( MAPOUT, TOPE3); //Necesito poder elegir entre TOPE1,2,3 con un boton
}
else if (Div < 199)
{
analogWrite (MAPOUT , TOPE3+COR);
}
}

Hola ficf94, bienvenido al foro Arduino en Español.

Algunas recomendaciones: 1. Primero tienes que evitar el uso de mayúsculas en tu código. 2. También para el futuro es bueno que uses sangría o identación para presentar el código debidamente y que nos permita leer y entender con facilidad lo que quieres expresar.

Tus topes los veo solapados, uno se mezcla con el otro y en un punto solo destacan por solo 10 unidades de modo que siempre tendras TOPE3 como tu lo llamas salvo que superes 200 o 210.

Entonces si dices que los umbrales son 4.5, 4.3 y 3.9 No me queda claro que debe hacer de 0 a 3.9 para empezar.

yo haría esto mas fácil que lo que presentas pero basicamente lo mismo.

leo potenciometro de MAP y el CPOR en los dos potes de 0 a 1023. Nunca leerás 1024. Son 1024 pasos es cierto pero nunca leeras 1024 en el ADC. Porque lo hace desde 0 a 1023. Discusión menor.

Todo lo que lees irá de 0 a 5V

Entonces si preguntas

// Leer el valor de entrada del map
  int valorMAP = analogRead(mapPin);
  Serial.println(valorMAP);
  // Leer el valor de entrada del potenciómetro de corrección porcentual
  int valorCPOR = analogRead(potCPOR);

  if (valorMAP > 4.5) {
      // corresponde a TOPE1
      Serial.println("TOPE1");
  }
  else if (valorMAP > 4.3) {
          // corresponde a TOP2
          Serial.println("TOPE2");
  }
  if (valorMAP > 3.9) {
      // corresponde a TOP3
      Serial.println("TOPE3");
  }

para que esto funcione requieres en el setup habilitar el Serial.begin(9600); o la velocidad que gustes

No me queda claro que pasa con 3.9 pero es mas fácil verlo asi que estar dividiendo x 4 y mostrando cosas qu complican la comprensión.

Gracias por tu ayuda estimado pero lo que quiero lograr es dar diferentes topes máximos elegibles con un botón .

Me explico:

El sensor MAP (Sensor de Presión Absoluta del Múltiple de admisión del vehículo) tiene un voltaje de funcionamiento de 0 a 5 v , por los cuales la computadora del vehículo se rige para los ciclos de inyección de combustible y encendido de las bobinas .

Entonces como ejemplo (voltajes sensados en el map de mi vehiculo) : (-) presion negativa (+) Presion positiva

-5 psi = 1.7 volt 0 psi = 2 volt +5 psi = 2.8 volt +10 psi =3.5 volt +14 psi =4.2 volt

/problema/

Si queremos sobrepasar los + 14 psi la computadora sensa 4.2 volt y nos envía un corte de inyección de combustible (el vehículo pega un jalón duro).

/Solucion/

Usar el arduino para elegir cuanto voltaje maximo entregaremos a la computadora engañandola , si el sensor MAP me mide 4.2 Volt (+14 PSI) o Mas , el arduino entrege 3.9 volt o 4.3 volt o 4.5 volt (Segun sea el caso ) ya que para cada vehiculo hay diferentes topes que entregan el corte de inyeccion .

CPOR : Correcion Porcentual con potenciometro

La idea es entregar un alza de voltaje de entre 0 y a 0.4 volt para agregar bencina desde que empiece la presión positiva... , si el map sensa 2.5 v entregarle a la computadora 2.9 v (aumentando en consecuencia la inyeccion de combustible)

Hoy lo probe en el vehiculo y me funciona ... pude sobrepasar la presion y sense tambien un aumento en la inyeccion de combustible con un reloj de AFR ( air / fuel Ratio)

espero esta explicacion haga mas facil entender mi objetivo , gracias de antemano por toda la ayuda que puedan brindarme

Bueno entonces empiezas mal porque un arduino común no tiene salida de tensión posible como para entregarte otro valor.
De modo que para ello tienes alternativas o placas con DAC que lo hacen.

Un buen dispositivo que tiene lo que necesitas es el Arduino DUE, posee entradas analógicas a 12 bits y salidas (2) digitales a analógicas a 12 bits (si mal recuerdo).
Con el podrías hacer lo que quieres.

El ultimo que recuerdo rápidamente es el ESP32. Tambien dispone de entradas y salidas analógicas. pero su rango de lectura es mas limitado aunque nada que no se pueda resolver con divisores de tension.

COn un arduino UNO/NANO la opción para generar tensiones es usar una salida PWM con un filtro pasabajos o un DAC de los que venden en módulos. Hay varias opciones.

Volvamos al problema principal:

Usar el arduino para elegir cuanto voltaje maximo entregaremos a la computadora engañandola , si el sensor MAP me mide 4.2 Volt (+14 PSI) o Mas , el arduino entrege 3.9 volt o 4.3 volt o 4.5 volt (Segun sea el caso ) ya que para cada vehiculo hay diferentes topes que entregan el corte de inyeccion .

Si lo que necesitas hacer es leer exactos

-5 psi = 1.7 volt
0 psi = 2 volt
+5 psi = 2.8 volt
+10 psi =3.5 volt
+14 psi =4.2 volt

no ha problema. Mi consejo acá es que como Arduino no podrá medir exacto uses un rango que te asegure que la lectura es correcta.
Veamos las diferencias que tienes:

P1 = 1.7 V
P2 = 2.0 V Dif = 0.3V
P3 = 2.8 V Dif = 0.8V
P4 = 3.5 V Dif = 0.7V
P5 = 4.2 V Dif = 0.7V

Bien, salvo los dos primeros que solo tienen 0.3V o 300 mV los demas tienen rangos mas amplios asi que te sugiero algo asi.
Supongamos que tomas un umbral de ± 50 mV arriba abajo del valor que te interesa para darlo por válido.
Cuando estes entre 1.650 y 1.750 diras que es P1
Cuando estes entre 1.950 y 2.050 dirás que es P2
y asi con cada uno

eso se hace con una simple cuenta entre el valor absoluto del valor leido y el valor que buscamos y todo debe ser menor o igual que un Delta o diferencia.

if (abs(analogRead(A0) - 1.7) <= UMBRAL)

si con el ADC lees 1.749 tendrás abs(1.749-1.7) = 0.049 y eso es <= 0.05 o sea es VERDADERO.
Si la diferencia fuera a la inversa, abs le cambia el signo y sigue siendo VERDADERO.

Entonces así detectas cada caso y le das MARGEN al ADC y a los problemas que puedas tener la calidad de la señal (ruido, interferencia, etc).

#define UMBRAL 0.05f

// Leer el valor de entrada del map
  int valorMAP = analogRead(mapPin);
  Serial.println(valorMAP);
  // Leer el valor de entrada del potenciómetro de corrección porcentual
  int valorCPOR = analogRead(potCPOR);

  if (abs(valorMAP - 4.2) <= UMBRAL) {
      // corresponde a TOPE1
      Serial.println("TOPE1");
  }
  if (abs(valorMAP - 3.5) <= UMBRAL) {
          // corresponde a TOP2
          Serial.println("TOPE2");
  }
 if (abs(valorMAP - 2.8) <= UMBRAL) {
      // corresponde a TOP3
      Serial.println("TOPE3");
  }
 if (abs(valorMAP - 2.0) <= UMBRAL) {
      // corresponde a TOP4
      Serial.println("TOPE4");
  }
 if (abs(valorMAP - 1.7) <= UMBRAL) {
      // corresponde a TOP4
      Serial.println("TOPE5");
  }

Si tuvieras alguno de los Arduinos con salida analógica un simple analogWrite(pin, valor); generaría la tensión de salida deseada
Donde pin es alguno de los dos DACs disponibles y valor es algo entre 0 y 4096 que representa una salida entre 0 y 3.3V. Lamento que eso es lo que tendrás como máximo.

Con el ESP32 debe ser similar usado en ambiente arduino.

A ver si esta vez estuve mas cerca de lo que buscas.