CUADRO DE INSTRUMENTOS DE UN VEHICULO A DISPLAYS

surbyte, que tu te pierdes?
pues anda que yo, estoi en un camino, y con la informacion que me habeis dado han salido 30 caminos y ninguno con el final visto.
El problema por parte mecanica ninguna ( porque soy mecanico), y por eso no he hecho ninguna pregunta de mecanica o sensores.
El problema esta en parte por software y hardware. y quizas despues por parte de las placas de baquelitas que haya que hacer( que seguramente seran de 4 a 5 placas).
No lo se que me has pedido como 3 o 4 veces, no lo veo.
En cuanto a las interrupciones, muy bien no hace falta. ¿como lo hago, poruqe no tengo ni idea de hacerlo sin interrupciones?, quiero Ejemplos o algo asi que pueda verlos.
como tu dices chances, el velocimetro le llega un cable , como los de toda la vida( un cable de acero), y RPM no los tiene.
Estoi peor que cuando empece , ajajaja.

Yo no pierdo nada y si molesto no aporto mas.
Lo que veo es que estas en los 30 caminos a la vez y te estoy pidiendo que resolvamos 1 a 1 pero no lo comprendes.
SI ya esta RPM entonces tildas y pasas a otra cosa.
Y asi
Pero quiere armar todo.. bueno.
Menues hay muchos, pero no dices que quieres hacer... yo no puede leer tu mente o te pido demasiado, tal vez sea eso.
En fin.. me calmo y te dejo hacer como quieras.

Prueba los 30 caminos a la vez entonces.

JOJO... pero por favor señores, si estaba muy interesante esto, no solo el proyecto en si, también el experimento social que sugirió Surbyte, pedir concentrar todo en un solo lugar para tener algo así como una bitácora del proyecto, y bueno exploto?

Quisiera hacer de mediador para hacerles entender que somos diferentes todos y que a veces por los pocos o muchos recursos que cada quien tenga es difícil comunicar una idea o seguir un solo camino.

En el foro estamos para echarnos la mano, aunque aveces estemos mal pero aprendemos del error..

En fin compañeros respiren profundo, y sigamos a delante.

Quisiera sugerir que podrías usar un optoswitch para medir las RPM. este sensor abajo del capo tendrá cero interferencia con la luz del sol, ademas tendrás mas tiempo entre cada interrupción.

un sensor como este:

Estas son las partes de la imagen adjunta:

1.- marca blanca
2.- banda del motor
3.- alternador
4.- sensor optoswitch
5.- soporte para sujetar el sensor

solo es una idea.

Moderador: Editado adjunto para ver la imagen

Sin nombre.png

Sin nombre.png

Surbyte nadie ha dicho que molestes, ni tu ni ninguno de los que habeis aportado alguna informacion.

En el menu que quiero hacer es el siguiente.
cuando arranca arduino el menu es 0
0 es la visualizacion de los km que faltan para cambiar el aceite.
a los 10 segundos el menu es 1;
1 es la visualizacion de los km totales del vehiculo.
y se queda ahi hasta que se le pulse el boton.
si se pulsa pasa a 2.
2 es los km parciales1,
si se pulsa otra vez pasa 3,
3 es los km parciales2,
si se vuelve a pulsar pasa a 0
y se vuelve al principio.
Cuando estoy en cualquiera de ellos(en el menu), si pulso seguidos unos 10 segundos, quiero que la visualizacion se ponga a cero.
Asi funcionan muchos cohes de aqui en europa.

Gracias erhja por la informacion,
pero he visto las cojidas que tiene y ha mi coche es complicado colocarle eso.

Y otra cosa mas,
Estoi trabajando con la velocidad , aparte y esto no funviona bien,

#define VUELTARUEDA 1392.079481//longuitud que da la rueda por vuelta 195/60 r15 en mm
unsigned long TicksVel;
unsigned long OverVel;
unsigned long OverflowVel;
float Vel;
float prueba;

void setup(){
  Serial.begin(9600);

  // setup velocimetro
 EIMSK=1<<INT0;              // elijo la interrupcion externa 0 es el pin2
  EICRA=1<<ISC01 |1<<ISC00;  // elijo en rising ( en flanco de subida)
  TCNT2=0;                   //contador a cero del timer1
  
  //registros del Timer2 a 8bits
  TCCR2A=0;
  TCCR2B=0;
  TIMSK2=(1<<TOIE2);         // se activa los registros por overflow
  TCCR2B |= (1<<CS10);       // sin prescaler
  TIFR2=(0<<TOV2);           //el flag a 0 
  OverflowVel=1;             //contador de flag a 1
      
}

void loop(){
  
  Vel = VUELTARUEDA/((TicksVel+(OverVel*256))*62,5/3600000);
  prueba = VUELTARUEDA/(1000000000/3600000);
  Serial.print("Velocidad: ");
  Serial.print(Vel);
  Serial.print(" TicksVel: ");
  Serial.print(TicksVel);
  Serial.print(" OverVel: ");
  Serial.print(OverVel);
  Serial.print(" Prueba: ");
  Serial.println(prueba);
  delay(100);
}


ISR(INT0_vect)
{
        
    OverVel = OverflowVel;
    TicksVel = TCNT2;
    TCNT2=0;
    OverflowVel = 1;
  }

ISR (TIMER2_OVF_vect)
{
  OverflowVel++;
}

Con la calculadora funciona perfectamente pero con el arduino, la formula de Vel es 0,
alguien sabe porque?
la formula prueba si funciona!

62,5/3600000);    // mira bien, hay una coma como punto decimal

ahhh tienes razon.
Ahora esto si funciona.
gracias ehrja.

Correcciones y mejoras.
No tantas cuentas, simplicar las cosas al pobre microcontrolador

  Vel = VUELTARUEDA/((TicksVel+(OverVel*256))*57600);     // 3600000/62.5 = 57600 );
  prueba = VUELTARUEDA/277.778         /// 277.778 = (10000/36);

Lo del menú que propones es facil de hacer.
Boton. Con cada cambio de estado de 1 a 0 p.ejemplo incrementas un contador y ese contador es tu cambio de menú. Cuando llega al tope, resetea para hacerlo circular y si lo mantienes X segundos o 10 como dijiste lo resetea también.

Por otro lado si puedes hacer semejante programa para medir la velocidad con interrupciones y timers esto es fácil de hacer.

buena correccion surbyte, gracias.

El menu esta implementado ya desde el post del principio , lo que no esta implementado es los 10 segundos para poner a cero el menu correspondiente.
No se como hacerlo, si con switch o con un flag ,
hay que ver que es lo que pesa menos.

Bueno pincho no se si seguirtela como me dijiste por email/PM o no.. jajaja
de terror.
Yo me molesto por el orden y resulta que tiras algo que ya esta jajaja le pongo humor para no enojarme.

bien. La cuestión es que quería hacer que llevaras los pasos en organizadamente (soy ingeniero) y cuando programo que hago... intento identificar las tareas y ponerlas uniformemente. No tirar cosas que parecen inconexas.
Pero bueno sigamos en tu forma de ver las cosas... te lo voy a marcar hasta que funcione... y me vas a decir de todo hasta entonces, no me vaticinaste eso por email? jajajajajajaja

viendo tu programa cuadro5.ino

Las definiciones de los pines dedicados a los MAX7219 los puse como constantes, es una tontera pero alivia algunos bytes de memoria y hace a la buena programación.

Mira algunos cambios y algunos posibles problemas que he encontrado.
No son grandes cosas. Pero mejor definirlas ahora antes de seguir.

Cuando arrancas el loop lees sensores, y luego presentas en los MAX7219
Pero luego del menú tienes una consulta de superar cierto tiempo para actualizar y vuelves a presentar la misma info, entonces una cosa se solapa con la otra.
supongo que lo que quieres es mostrarlo cada 1 seg digamos para no apabullarse de leds que cambian a cada instante (molesta cuando eso pasa).

SEG5 que supuestamente debería ser 5 segundos tiene 10000 mseg. Ojo

Miralo y me dices.

adjunto el código.

Aca dejo por ahora. Mira si funciona lo de los 10 segundos en tu menú.
No se si funcionará o no

	  int reading = digitalRead(BUTTON);
	  if (reading != lastButtonState) {
		  lastDebounceTime = millis();	// reset the debouncing timer
	  }

	  if ((millis() - lastDebounceTime) > debounceDelay) {
		  // No importa lo que se lea, tiene que ser mayor que un retardo 
		  // debounce, y tomará ese como el estado en curso

		  if (reading != buttonState) {  // si el estado del botón ha cambiado
			  buttonState = reading;
			  if (buttonState == LOW) {   // solo aumentar si el nuevo estado del boton es LOW
				  Menu++;
				  resetMenu = millis();
			  }
		  }
	  }
	  
	    
      if ((buttonState == lastButtonState) && (millis- resetMenu > RESETMENU) || Menu == 4 ) {
		  Menu = 0;
	  }
	  lastButtonState = reading;

Actualizo el nuevo sketch con esta corrección.

cuadro5.ino (16.1 KB)

cuadro5.ino (16.3 KB)

jajajaj, ok,
el doble muestreo solucionado.
el SEG5 solucionado,
Lo que he escrito en mayusculas en el archivo son las correciones que has dicho,
Da error de compilacion y dice:
pointer a funtion used in arithmetic,
he cambiado el void menu por void menus porque daba error con la variable menu,
he puesto void a muestroinfo que le faltaba y daba error.
y la funcion menus ¿no la llama nadie?.
En fin esto es lo que me ha salido hasta ahora

Tambien hay una confusion eln el menu,
en el menu cuado se pulsa el boton va sumando (menu++) y cuando llega a 4 se pone a 0.
Si por ejemplo, estoi en el menu 2 y aprieto el boton 10 seg. la variable que tenga guardada ese menu se pone a 0.

subo el archivo.

PD: corregido al compilador( le faltaban los () a millis),
pero sigue sin funcionar.

cuadro5.ino (16.2 KB)

No probé nada asi que admito que pudo haber errores.
Lo del menu no era asi? yo entendí que estuvieras donde estuvieras si mantenías presionado 10 seg que fuera a 0. No era asi ?

No,
Con cada pulso sumo 1, hasta cuatro que vuelve a 0,
y si pulso 10seg entonces en el menu donde estoi lo pone a 0, (como pueden ser los km parciales 1 y 2, o los km que quedan para cambiar el aceite.)

Y no funciona asi pincho? Creía que si.
Cuando menu == 4 va a 0 ya estaba y yo lo agrregué como una condición OR dentro del if.
La parte del if con los 10 segundos funciona?

Me cuesta a mi programar las cosas imaginando su funcionamiento asi que te voy a pedir algo.
decime cuantos displays usas para cada medición, rpm, kmh, temperatura, etc.
Asi armo una simulación en Proteus y si alguien quiere puede seguirlo mejor.
Eso si estas de acuerdo, tambien a ti te va a servir.

he hecho el menu con los 10 seg pero me esta dando problemas en el aumento del menu.
estoi por ejemplo en el menu 1 y pulso el boton durante 10 seg y me salta al menu 2 y me lo pone a cero el menu 2. Tambien le falta el rebote del pulsador.

//PULSADOR CON MENU

#define BUTTON 4 //Pin donde esta conectado el boton del menuun
#define SEG10 10000 //valor para cambiar desde el menu de aceite a km a 10 seg
#define CAMBIOMENU      10000   //valor para cambiar a 0 elcontenido del menu 10seg
unsigned int Menu; //menu con boton
boolean flagMenu,flagboton;
long inicioMenu;


void setup() {
  // put your setup code here, to run once:
 pinMode(BUTTON,INPUT);
 Serial.begin(9600);
 Menu = 0;      //Inicializa la variable Menu
 inicioMenu = millis();
 flagMenu = 1;
}


void loop() {
  // put your main code here, to run repeatedly:
  
if(inicioMenu + SEG10 <= millis() && flagMenu ==1){  //los 10 segundos se visualiza  del cambio de aceite a km
    Menu = 1;
    flagMenu=0;
  }
  
  if(digitalRead(BUTTON)==LOW && flagboton==1){
      
        Menu++;
        flagboton=0;
        inicioMenu = millis();
  }            
  if (digitalRead(BUTTON)==LOW && inicioMenu + CAMBIOMENU <= millis()){
         
        switch(Menu){
              
          case 0:Serial.println("case 0 a cero todo");break;//los kilometros del cambio de aceite a cero
          case 2:Serial.println("case 2 a cero todo");break;//los km pardiales1 a cero
          case 3:Serial.println("case 3 a cero todo");break;//los km parciales2 a cero
                //no te he puesto el case 1 porque no se pueden poner a cero 
                //los km totales del coche
          inicioMenu=millis();      
        }
          
 }         
  
if(digitalRead(BUTTON))flagboton=1; 
 
 if(Menu >= 4)Menu=0;
   
   
  Serial.print("Menu: ");
  Serial.println(Menu);
  delay(500);
  
}

se que tiene que ser una tonteria pero no lo termino de conseguir.

No surbyte, lo de los 10 segundos pulsado no funciona.Lo del cambio de menu 0 a menu 1 a los 10 seg eso si,
No tengo problemas que ponga el esquema en proteus, yo es que no lo tengo, me gusta mas el arduino y montarlo.

Te digo, 4 max7219,
1 lleva temperatura con 3 displays y presion de aceite 2 displays
2 lleva velocidad 3 displays
3 lleva 7 displays (menu),
4 lleva rpm 4 displays y nivel de carburante 2 displays

Tengo un error de compilación y veo que menú no esta en el loop ni alguna otra función involucrada.

  if (inicioMenu + SEG10 <= millis() && flagMenu ==1) {  //los 10 segundos del cambio de aceite a km
     Menu = 1;
     flagMenu=0;
  }

Esta linea conspira con los 10 segundos para que Menu se resetee, hay que analizar que esta pasando

Encontré el error!!!

 if ((buttonState == lastButtonState) && (millis - resetMenu > RESETMENU) || Menu == 4 ) {
		  Menu = 0;
	  }

millis estaba sin ( ) paréntesis.

de este estilo son los displays, cierto?

Bueno, simulación muy avanzada pero no funciona. Tengo Aceite, Nivel de Combustible, RPM simulados.
No cambia ningun display.

De cuanto es la Referencia Externa?

Los displays son de Anodo o Cátodo común?.

Entre qué valores varían las rpm si pusieras un generador de pulsos?

La eemprm 24C256 seguramente esta asi conectada no?