tacometro con algunas dudas y problemas en el lcd

Hola, estoy haciendo un medidor para un motor de combustion interna que tiene que medir temperatura, presion, revoluciones y mas adelante le incorporare algunas cosas mas, el programa esta casi acabado lo que mas guerra me dio era el cuenta revoluciones al final use este http://www.arduino.cc/playground/Main/ReadingRPM , antes estuve haciendolo yo tambien con interrupciones pero no pense en medir el tiempo, el del enlace funciona mejor que el que yo diseñe aunque a la hora de salir los datos en el lcd tengo algunos problemas, la cuestion es que desde empieza desde 0 y sube y baja bien, pero el problema esta cuando baja de 4 digitos a 3, se queda un numero detras que no tiene nada que ver con la realidad, ademas nunca baja hasta 0, siempre se queda mas alto bastante mas.

para imprimir en el lcd e usado las condiciones if y else if, sin ellas los numeros se actualizan tan rapidos que es imposible verlos, con eso se corrige y veo los nuemros bien con un retraso de 200ms o 300ms de actualizacion, pero el otro problema no consigo que se solucione ¿alguien tiene alguna idea?

graciasS

puedes poner el codigo donde escribes los valores en el lcd.

el truco que yo uso es por ejemplo si quieres imprimir las rpms en la posicion 1,1 de la pantalla lcd, primero te situas en la posición 1,1 luego imprimes cuatro espacios " " luego vuelves a situarte en la posición 1,1 finalmente imprimes el valor. supongo que tmabien podrias imprimir un solo espacio para deshacerte de los millares pero vamos ambas funcionan.

si claro, se me olvido

void loop()
{
{
if (rpmcount >= 10) {
//Update RPM every 20 counts, increase this for better RPM resolution,
//decrease for faster update
rpm = 30*1000/(millis() - timeold)*rpmcount;
timeold = millis();
rpmcount = 0;
}
}

{
if (rpmcount>30){
lcd.setCursor(8,3);
lcd.print(rpm);
delay(300);}

else if(rpmcount<30){
lcd.setCursor(8,3);
lcd.print(rpm);
delay(300);}

intenta soluciarlo tu mismo con mi respuesta anterior, pon el codigo al que llegues, y te ayudo si no te funciona.

Cambia el titulo del post especificando en que necesitas ayuda que sino la gente no va entrar porque no sabe de que va

Como bien te han indicado ionhs y Sergegsx.

Cambia el título a 'medidor para un motor de combustion interna', por ejemplo. Y elige para el post un icono del mensaje que indique que es una pregunta. Así será más claro para todos.

coLe.

bueno ya e cambiado el titulo, sergegsx me puedes dar alguna pista de lo que me comentas, soy nuevo en esto y no veo lo que me intentas explicar.

el tacometro es muy exacto, pero la verdad es que no me hace falta saber las revoluciones exactas, eso ya me sale en el ordenador, me gustaria que subiera de 100 en 100, pero no veo como hacerlo.

por otro lado ya se por que no baja hasta 0, es por el muestreo, cuando las revoluciones son bajas el muestreo es lento y el motor baja mas deprisa que lo que lee arduino, por eso no me baja a 0, e subido la velocidad de muestreo al maximo pero aun asi no lo consigo, supongo que tendre que hacer algun codigo para que cuando el rpmcount sea 0 escriba 0, alguna sugerencia.

parece que tienes claro para que funciona setCursor y print, verdad? uno situa el lugar donde vamos a escribir el texto y el otro imprime el texto.

pues lo que tienes que hacer es imprimir en la posicion 1,1 por ejemplo. y despues antes de volver a imprimir el nuevo valor en la posicion 1,1 tienes que borrar lo que hay ahi. porl o que tienes que imprimir "espacios en blanco" ejemplo imprimo adios en la posición 1,1 "adios" ahora quiero imprimir hola en el mismo sitio pero si no borro lo que hay ahi, me quedara esto "holas" la S del final es debido al ADIOS. por lo que primero imprimo " " 5 espacios " " y ahora imprimo adios "adios"

sergegsx muy bien a funcionado perfecto, solo añadiendo una linea con los 4 espacios solucionado, pongo como lo hice:

if (rpmcount==1){ lcd.setCursor(8,3); lcd.print(rpm); lcd.print(" "); delay(200);}

ahora me falta el resto, muchas gracias por la ayuda voy a seguir probando a ver como hago para que suba de 100 en 100 y baje hasta 0.

me alegro, otra opción es esta que acabo de escribir para mi proyecto, a falta de probarla…

lcd.setCursor(0, 0);    if (RPM_rx_data < 1000) lcd.print(" ");      lcd.print(RPM_rx_data);    lcd.print(" rpms");

gracias sergegsx, de momento con lo que hice se ve bien mientras use la libreria lcd normal, pero si uso esta http://liudr.wordpress.com/libraries/phi_big_font/ que es la que quiero para ver las revoluciones me quedo como antes =(, y sigo dandole vueltas a lo otro, e intentado algo como esto:

{
if(rpm<300){lcd.setCursor(8,3);
lcd.print(“arranque”);
lcd.print(" “);
delay(100);}
if(rpm>400){
lcd.print(“400”);
lcd.print(” ");
delay(100);}

else if(rpm<450){
lcd.print(“400”);
lcd.print(" “);
delay(100);}
if(rpm>451){lcd.setCursor(8,3);
lcd.print(“500”);
lcd.print(” “);
delay(100);}
else if(rpm<550){
lcd.print(“500”);
lcd.print(” “);
delay(100);}
if(rpm>551){
lcd.print(“600”);
lcd.print(” ");
delay(100);}
}

a sido algo rapido y sin pensar mucho, pero no se ve muy bien y es un rollo tener que hacer asi todo el programa seguro que hay otra forma de hacerlo, por mas que miro no lo veo y seguro que lo e tenido delante, pero bueno cuando te ciegas con algo no lo ves, seguire probando cosas…

gracias por tu ayuda.

para que haces tantos if ??

el que yo hago es para imprimir un espacio cuando pasas de un valor mayor a 1000 a uno inferior y asegurarte que no se queda el 1 por medio o el valor de unidades del final.

dns75:
gracias sergegsx, de momento con lo que hice se ve bien mientras use la libreria lcd normal, pero si uso esta http://liudr.wordpress.com/libraries/phi_big_font/ que es la que quiero para ver las revoluciones me quedo como antes =(, y sigo dandole vueltas a lo otro, e intentado algo como esto:

{
if(rpm<300){lcd.setCursor(8,3);
lcd.print(“arranque”);
lcd.print(" ");
delay(100);}

if(rpm>551){
lcd.print(“600”);
lcd.print(" ");
delay(100);}
}

a sido algo rapido y sin pensar mucho, pero no se ve muy bien y es un rollo tener que hacer asi todo el programa seguro que hay otra forma de hacerlo, por mas que miro no lo veo y seguro que lo e tenido delante, pero bueno cuando te ciegas con algo no lo ves, seguire probando cosas…

gracias por tu ayuda.

Y si lo divides entre 100, descartas decimales y multiplicas por 100??
Si además sumas 50 ya tienes el valor a escribir. Y si la variable es un entero no tienes ni que descartar nada, ya lo hace solo.

si señor sois unos artistas :D, funciona bien pierdo un poco de precision pero se ve como queria, esto e hecho

{
rpm1=(((rpm+50)/100)*100);
render_big_number(rpm1,2,2);
Serial.println(rpm1);
delay(200);
}

una nueva variable rpm1 como entero, la formula que has dicho pero un poco modificada, los 50 a sido casualidad si lo sumo al total cuando hay 0 revoluciones sale 50, asi que no lo sume, pero se quedaba un poco por debajo asi que empece a sumar a rpm1 y lo que mejor le va es 50 asi se queda vailando 100 arriba o abajo, si por ejemplo son 1234 revoluciones salen 1200-1300, me gustaria que fuera mas estable pero bueno ya e conseguido mas o menos lo que queria, ahora sera cosa de ir probando.

gracias :wink:

Sergegsx: para que haces tantos if ??

el que yo hago es para imprimir un espacio cuando pasas de un valor mayor a 1000 a uno inferior y asegurarte que no se queda el 1 por medio o el valor de unidades del final.

sergegsx, esto era para que las revoluciones fueran de 100 en 100 en vez de el numero exacto, con la biblioteca de numeros grandes no e conseguido que se quite el numero de detras, seguire probando, aunque estoy pensando en hacerlo de otra forma a ver si veis como se puede hacer:

mi lcd es 20x4, la primera fila la uso para temperatura,presion y nivel del deposito, si usara la biblioteca lcd normal tendria solucionado el problema de los numeros que se quedan detras y me gustaria que saliera en otra linea una grafica de lado a lado con las revoluciones, asi tendria los numeros en pequeño y la grafica pero no e visto ninguna libreria para graficas en estos lcd pero si e visto videos que los ponen ??????

ah vale entonces ya no te hacen falta esos if. con hacer la división se soluciona.

para la grafica busca algo así como "lcd bar graph" si no recuerdo mal.

mira el video que hay aquí. yo quiero hacer lo mismo pero aun no me he puesto. si extraes el codigo minimo necesario para hacer los graficos estos avisa please.

http://code.google.com/p/multidisplay/

e leido sobre la libreria de graficas que pones, entiendo que solo lo hace con un valor analogico y nosotros tenemos pulsos, tendriamos que pasar los pulsos a un valor analogico creo. con PWM pienso que se haria pero no lo se.

e probado el tacometro en un motor y bueno se ve pero si se acelera rapido y se suelta rapido los numeros corren muy rapido y pienso que al final cansara, lo mejor es poner una grafica con el numero debajo seguire mirando.

el enlace que me has puesto es mas o menos la idea que llevo, pero con 4 termopares o incluso con 1, la lambda y guardar datos en algo si se puede, pero que no sea el ordenador que es un rollo llevar siempre el ordenador, es mejor una tarjeta o un lapiz y guardar en un archivo de excel, luego abrir y haces graficas o ves tablas, hay si seria las revoluciones exactas y todo exacto, pero en la pantalla para ver todo el tiempo es mejor mas tranquilo.

de todas formas no se si llegare a ese nivel.

el problema que yo estoy viendo en otro proyecto que guarda datos en una memoria SD es que lo mismo tarda 100milisegundos en guardar el dato, que al cabo de 2 dias tarda mas de 1 segundo en guardar un dato con del mismo tamaño. por lo que no se si seria optimo para el refresco que buscamos.

Sergegsx: el problema que yo estoy viendo en otro proyecto que guarda datos en una memoria SD es que lo mismo tarda 100milisegundos en guardar el dato, que al cabo de 2 dias tarda mas de 1 segundo en guardar un dato con del mismo tamaño. por lo que no se si seria optimo para el refresco que buscamos.

¿Y a qué se debe que con el paso de los días tarde tanto en grabar en la SD?

ahora mismo me hace falta el tacometro con las temperaturas y presion, guardar datos y el resto lo dejo para adelante, la sonda tiene su misterio un tiempo para que caliente y decodificar el voltaje, y los termopares ni los e mirado todavia.

otra solucion a guardar datos podria ser con memorias en una placa y a por I2C, pero solo es una idea.

ahora me lio con la grafica que es lo que me hace falta, estoy pensando por frecuencia, e visto videos que las hace asi.