Simulación_BANCO_Completo (copy) — Arduino Uno simulation

An interactive Arduino Uno circuit simulation you can run free in your browser on Velxio, by albertoarangurenp.

Components

Sketch code

/*
  Simulador CKP/CMP Robusto y Sincronizado para ECU
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <avr/pgmspace.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

const byte PIN_BTN_PREV = 4;
const byte PIN_BTN_OK   = 3;
const byte PIN_BTN_NEXT = 2;
const byte PIN_POT_RPM  = A0;

struct PerfilVehiculo {
  const char* nombre;
  const uint8_t* patron;
  uint16_t tamanoPatron;
  uint8_t dientesTotalesPorCiclo; // Número total de cambios de estado por ciclo de 720°
};

// ==========================================
// PATRONES CORREGIDOS (Máscara de Bits: Bit0=CKP, Bit1=CMP1, Bit2=CMP2)
// ==========================================

// Patrón 60-2 (Ejemplo simplificado de 720° con pulso CMP prolongado)
const uint8_t patron_60_2[] PROGMEM = {
  // --- VUELTA 1 CIGÜEÑAL (360°) ---
  // 58 Dientes (Alto/Bajo) + 2 Faltantes (Bajo/Bajo)
  // Bits: 0x01 (CKP HIGH), 0x00 (TODOS LOW), 0x03 (CKP + CMP1 HIGH)
  
  // Dientes 1 al 29
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  
  // Dientes 30 al 58 (CMP1 Activo en esta sección del ciclo)
  0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02,
  0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02,
  0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02,
  0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02, 0x03,0x02,
  
  // Diente Faltante (2 Dientes = 4 estados en LOW)
  0x00,0x00, 0x00,0x00,

  // --- VUELTA 2 CIGÜEÑAL (720°) ---
  // Dientes 1 al 58 (Sin CMP1)
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00,
  0x01,0x00, 0x01,0x00,
  
  // Diente Faltante
  0x00,0x00, 0x00,0x00
};

PerfilVehiculo listaVehiculos[] = {
  {"GM/Chery 60-2", patron_60_2, sizeof(patron_60_2), 120} // 60 dientes * 2 vueltas
};
const uint8_t CANTIDAD_VEHICULOS = sizeof(listaVehiculos) / sizeof(listaVehiculos[0]);

// Variables Volátiles
volatile const uint8_t* patronActual = patron_60_2;
volatile uint16_t tamanoPatronActual = sizeof(patron_60_2);
volatile uint16_t indiceDiente = 0;
volatile bool senalActiva = false;
volatile uint16_t ocr1a_nuevo = 1000; // Buffer para actualización 

More projects by albertoarangurenp