Go Down

Topic: CUADRO DE INSTRUMENTOS DE UN VEHICULO A DISPLAYS (Read 19492 times) previous topic - next topic

pincho41700

#30
Nov 01, 2014, 11:07 am Last Edit: Nov 01, 2014, 11:16 am by pincho41700
ahhh tienes razon.
Ahora esto si funciona.
gracias ehrja.

surbyte

#31
Nov 01, 2014, 02:17 pm Last Edit: Nov 01, 2014, 02:21 pm by surbyte
Correcciones y mejoras.
No tantas cuentas, simplicar las cosas al pobre microcontrolador

Code: [Select]

  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.


pincho41700

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.

surbyte

#33
Nov 01, 2014, 05:44 pm Last Edit: Nov 01, 2014, 06:56 pm by surbyte
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
Code: [Select]

  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.





pincho41700

#34
Nov 01, 2014, 11:22 pm Last Edit: Nov 01, 2014, 11:28 pm by pincho41700
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.




surbyte

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 ?

pincho41700

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.)

surbyte

#37
Nov 02, 2014, 04:32 pm Last Edit: Nov 02, 2014, 04:52 pm by surbyte
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.


pincho41700

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.

Code: [Select]

//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.

pincho41700

#39
Nov 02, 2014, 04:42 pm Last Edit: Nov 03, 2014, 02:40 pm by pincho41700
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


surbyte

#40
Nov 02, 2014, 09:12 pm Last Edit: Nov 02, 2014, 09:16 pm by surbyte
Tengo un error de compilación y veo que menú no esta en el loop ni alguna otra función involucrada.



Code: [Select]
  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!!!

Code: [Select]
if ((buttonState == lastButtonState) && (millis - resetMenu > RESETMENU) || Menu == 4 ) {
  Menu = 0;
  }

millis estaba sin ( ) paréntesis.

ehrja

Hola buenos días!

surbyte

#42
Nov 03, 2014, 12:46 am Last Edit: Nov 03, 2014, 01:07 am by surbyte
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?


pincho41700

#43
Nov 03, 2014, 09:05 am Last Edit: Nov 03, 2014, 09:21 am by pincho41700
bueno vamos por parte.

Surbyte
te dije que el problema estaba en los () de millis y no lo has leido.
el arduino lee la memoria y la pasa a las variables. eso funciona.( lo tengo montado).
La memoria esta como tu la has puesto.
#define DIRMEM      0X50      //direccion de memoria del 24c256
He creado con un arduino pro mini un generador de pulsos que varia con un potenciometro y el rpm esta funcionando, (para que funcione bien va desde 250 a 5000 rpm), pero me contabiliza hasta 24000 rpm bien (en el serial).

a que te refieres con referencia externa?, no se lo que significa.
Tambien te digo que las funciones de los displays no estan terminadas hay que terminarlas, (por lo menos lo veo en el serial) o en el processing.
La temperatura me funciona( tengo una NTC ).
La presion de aceite y nivel de combustible tambien me funciona( resistencias variables).

los displays algunos son de anodo y otros de catodo comun, pero eso no es ningun problema.Eso lo podemos cambiar.

ehrja
si son como esos, aunque los de los menus no se si poner el modulo de 6 displays para ahorrar trabajo.




surbyte

como que no y esto que es
Quote
Encontré el error!!!

Code: [Select]

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


millis estaba sin ( ) paréntesis.
Quote
He creado con un arduino pro mini un generador de pulsos que varia con un potenciometro y el rpm esta funcionando, (para que funcione bien va desde 250 a 5000 rpm),
Y la frecuencia o tomo 250/60 y 5000/60 y ya?


Go Up