CUADRO DE INSTRUMENTOS DE UN VEHICULO A DISPLAYS

Bien cabo, entonces yo te resuelvo el tema display MAX7219 y asi un problema menos, te parece?

ok sin problemas.

Te dejo un video de como esta funcionando el arduino.
el primer numero es la temperatura
el segundo presion de aceite
el tercero velocidad
el cuarto km
el quinto RPM
el sexto nivel de deposito
el septimo numero del menu

el menu cambia a los diez segundos pero le pulso y no cambia.

Eso ya lo habia logrado.
Ya casi tengo los displays.

Para el cuenta vueltas y km, se usa un divisor, el cual lo puedes setear en 10, 8, 6 segun necesites.
Este metodo se usa en los frecuencimetros que leen incluso hasta Ghz.

Otra forma que se usaba antiguamente era usar un conversor de frecuencia a voltaje y lo lees por el AD.

Yo estoy hablando de la forma mas precisa para medir las rpm o vueltas y Maxid (con la mejor intención claro) sale con un conversor de frecuencia a tensión, que claro funciona, pero son recursos para tener una idea de que valor en frecuencia tienes pero a costa de un 5 a 10% de error como optimista.

hablo de opciones.
Lo mejor es un divisor que a n vueltas envie un pulso y la rutina de calculo tenga el suficiente tiempo para todas las operaciones antes del proximo pulso al maximo de revoluciones.
Incluso puedes hacer una auto escala para cuando va muy lento bajando el divisor.

gracias maxid por las aclaraciones y por contestar en este post.

Pincho, te cuento que ayer y hoy estuve con el simulador y ajustando los MAX7219 que hice andar en otra solución mas simple, 1 UNO, un MAX y LED.
Anduvo perfecto.
En tu proyecto, no hay caso, por ahora. Muestra basura. He comentado todos los leds y me quedé solo con RPM y Aceite y lo mismo.
Habia errores en la tensión de referencia externa de la simualción que ya arreglé. Hice andar casi todos los sensores simulados.

Pero aunque el dato llega bien, no lo presenta.
Investigo si tus operaicones con los timers capturan los pines correspondientes como para luego no poder usarlos con los MAX7219.
Sospecho que los timers me estan enviando pulsos cuando dan overflow por ejemplo y eso interfiere con el funcionamiento del display, pero cambie el clock a otro pin y nada.

Queria comentarte para que veas donde estoy trabjando para ayudarte.

Si queres te pasó ambos archivos para que veas la situación temporal.

ok,
porque a ti no te funciona, y en el serial si funciona? no lo comprendo eso.
madame los archivos para ver como estan funcionando y asi poder comentar .
que me tienes abandonado mi sargento.
Estoi con el menu pero no lo consigo del todo.

ahhh porque vos lo estas usando por processing y yo no.
A ver, me tengo que poner a usar processing... joder como dicen los espaÑoles.
Amplio mi respuesta.
SI funciona, el serial envia datos que ya te posteo para que veas, pero, cuando los quiero ver por los displays no se lee nada coherente.

Surbyte, que simulador usas para arduino?

Proteus

a punto de poner processing y ver como cambia la cosa.
Bueno, decepción, esperaba que x processing le enviaras datos pero veo que lo haces directamente x vía física.
Deberé alterar la simulación, poner un DB9 Serial y hacer todo para que presente ahi.
Igual no soluciona el problema de los displays.

Mañana sigo, hoy tengo trabajo que entregar.

joser surbyte,
tanta complicacion tiene para simular los led, no sabia que fuese tan camplicado.

Ninguna complicación. Solo que pensé que algo hacias con processing pero solo mostras lo que yo veo por los leds.
El problema de los leds es que sin dejo pines sin conectar hace cosas raras. nada mas. Le asigné conexiones a cada uno y ya se porta mejor. Estoy viendo.

Pincho tenemos seguidores que reclaman que pasa con el proyecto, yo hice avances.
Solucionado displays. Ya andan bien.
Processing me defraudó pero funciona jajaja.
Modifiqué la rutina que lee los RPM, ahora cuando le ingreso una señal con el simulador la lee con gran precisión.

Esta es la rutina
Adjunta abajo

Se ingresa por pin2 y usa la interrupción externa y el timer como lo hace pincho.

Luego edito y pongo de donde la saque.

Los módulos LED de Proteus deben manejarse con cuidado.
No intenté usar LEDs 7seg simples a ver que pasa.

Pronto subo los cambios.

IRQ.ino (1.86 KB)

ya se que tenemos seguidores, con solo ver el numero de visitas ya es una alegria.

Estoi un poco callado porque estoi haciendo el menu, (que ya esta funcionando , pero no hay quien lo pare), y estoi en guerra con el arduiono, jajaj.

Te veo la rutina de RPM y debatimos.

Jejeje tu rutinita querido NO FUNCIONA!!!
Al menos a mi en mi simulador.

Yo recibo NUMEROS GIGANTESCOS.
La mía es exacta. asi que ahora que la integre ya verás!! Como destrocé tu rutina ISR. Ya lo dije, la tomé de otro usuario.

COMOOOOOOOOOOOOO,

eso no puede ser, jajaj
en el circuito funciona muy bien , ya no se en el simulador, lo tuyo todavia no lo he probado , ya te dire.

He conseguido ya el menu que funcione bien, un poco bruto pero funciona. Te dejo el Menu

#define TIEMPOMAX 5000
#define TIEMPOMIN 400

boolean Boton;
boolean flagPulsado;
boolean flagSoltado;
boolean flagDiferencia;

unsigned long Pulsado;
unsigned long Soltado;
 long Diferencia;
 
int Km=123;
int Menu=0;

int estadoAnterior = 0;
int estadoActual;
int contador = 0;
const int pin=4;         // aquí el pin digital que se quiere leer

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(pin, INPUT);
Pulsado=0;
Soltado=0;
Diferencia=0;
flagPulsado=1;
}

void loop() {
  // put your main code here, to run repeatedly:
  estadoActual = digitalRead(pin);
  if (estadoAnterior != estadoActual)  // ha habido un cambio de estado
  {
    contador++;                          // cuenta los cambios de estado
    //Serial.println(contador);
    int validarPar = contador % 2;       // solo queremos los cambios pares
    if (validarPar != 1)                 // si el cambio es par
    {
      Boton=1;
    }
    else Boton=0;
    
    estadoAnterior = estadoActual;
  }
  
  
  ///////////////////////////////////////
  
  if(Boton==1 && flagPulsado==1){//cuando el boton se pulsa
    Pulsado=millis();
    flagPulsado=0;
    flagSoltado=1;
  }
  
  if(Boton==0 && flagSoltado==1){//cuando el boton se suelta
    Soltado=millis();
    flagSoltado=0;
    flagPulsado=1;
    flagDiferencia=1;
  }  
  
  Diferencia=Soltado-Pulsado;
  
  if(flagDiferencia){
    if(Diferencia<TIEMPOMIN )Menu++;
    if(Diferencia>TIEMPOMAX )Km=0;
    flagDiferencia=0;
  
  }
    
  
  
  
  
  Serial.print(Boton);
  Serial.print(" , ");
  Serial.print(Pulsado);
  Serial.print(" , ");
  Serial.print(Soltado);
  Serial.print(" , ");
  Serial.print(Diferencia);
  Serial.print(" , ");
  Serial.print(Km);
  Serial.print(" , ");
  Serial.println(Menu);
  
  
}

De nuevo pincho... yo se que es TU PROYECTO, no el mío, pero comparte la idea de lo que vas a hacer antes de hacerlo.
El menú hará tal cosa.. necesito 3 submenúes asi o asá.

Bien. No importa.. ya te lo modificaré también jajajaja
Finalmente tendremos versión Pincho y versión Surbyte.