LCD se vuelve loco al rato de iniciar el programa

Buenas a todos:

Estoy iniciándome en Arduino y este es mi primer post en el foro. He hecho un proyecto muy sencillo en el cual leo el voltaje de salida de un transistor LM35 y lo convierto a temperatura. Después lo muestro en un Display LCD 1602A (y aquí viene el problema. El LCD muestra sin problema lo que le pido pero al cabo de unos cuantos loops comienza a mostrar caracteres extraños.

Alimento mi Arduino UNO manteniéndolo conectado al USB del ordenador, ya que no conozco otra manera de hacerlo aún.

Adjunto el código y fotos de lo que ocurre.

#include <LiquidCrystal.h>


//Declaramos donde (pines de arduino) hemos conectado cada conexion del LCD (pines LCD)
int RS = 4;                                   //Ejemplo, he conectado el pin Rs del LCD al pin 4 de arduino....
int E = 5;
int D4 = 6;
int D5 = 7;
int D6 = 8;
int D7 = 9;

int V0=3;                                     //Puerto para el contraste


float Humedad=0;                              //Declaramos la variable Humedad
float Temperatura=0;                          //Declaramos la variable Humedad
float voltaje;

LiquidCrystal lcd (RS, E, D4, D5, D6, D7);  //Declaramos de que variables depende el LCD, todos los nombres de las variables de los pines




void setup(){
  analogWrite(V0,100);                       //Valor del contraste 0-255 (255 es el minimo)
  lcd.begin(16, 2);                         //Indicamos (columnas, filas) de nuestro lcd
  lcd.setCursor(0, 0);                      //Donde colocamos el cursor las filas y las columnas empiezan por cero (0-15,0-1)
  lcd.print("Hello World!");
  lcd.setCursor(0, 1);
  lcd.print(":)");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Estación meteorológica");
  lcd.clear();
  Serial.begin(9600);
}

void loop(){
  lcd.clear();
  Temperatura = analogRead(A0)*0.488;
  lcd.setCursor(0, 0);
  lcd.print("TEMPERATURA");                 //Escribimos TEMPERATURA en la LCD
  lcd.setCursor(0, 1);                     //Situamos el lugar donde empezará la escritura
  lcd.print(Temperatura);                   //Representamos el valor de la variable Temperatura.
  Serial.print("Temperatura: ");
  Serial.println(Temperatura);
  lcd.setCursor(5, 1);                     //Situamos el lugar donde empezará la escritura
  lcd.print("C");                           //Escribimos C 
  delay(500);                               
}

LCD mostrando correctamente el mensaje:

LCD mostrando erróneamente el mensaje:

Además este se mueve y cambia con cada loop (el mensaje erróneo) y al rato vuelve a ponerse bien. reiniciando el ciclo (ocurre de forma periodica). Aquí un video de lo que ocurre:
Video

No tengo ni idea de si estoy haciendo algo mal.

Muchas gracias por adelantado,
Rafael

Hi,
Aparentemente no has leidos las reglas de este forum .No mencionas cosas importantes de como alimentas el arduino, que clase de arduino usas y que tipo de LCD display usas. Los hay de diferentes linias y con diferentes caracteres, Etc ,etc.

Hola tauro0221,

Muchas gracias por tu respuesta, es el primer post que hago y no se todavía muy bien como funciona (a pesar de que llevo un tiempo leyendo). He leído las normas pero se ve que se me han pasado algunas cosas. Ya he intentado corregirlas. En las imágenes (no he conseguido insertarlas en el texto), se ve el LCD y el problema.

Saludos.

Pasa por aquí y verás que es fácil incrustar imagenes: NORMAS-IMAGENES.

Las imagenes solo dicen que se ve bien, y luego no se ve bien, lo único que lo tienes montado en una protoboard. No se ve nada mas, asumiremos que alimentas el arduino con el usb del ordenador. Yo me decanto por un cable que no haga bien contacto, y con un poco de movimiento se suelta y hace eso. Revisa las conexiones y los cables.

Otro problema puede ser ruido de alguna fuente de interferencia cercana (motor o similar), pero de momento lo descarto hasta que nos des mas información.

Hola victorjam,

El problema ocurre de forma perfectamente periódica por lo que dudo que provenga de una interferencia o una mala conexión. Efectivamente lo tengo conectado al usb del ordenador, las demás conexiones estan hechas con jumpers en la protoboard excepto el LCD que van soldadas.

Adjunto enlace a un vídeo donde se ve lo que ocurre, 35.4 mB (dato es que cada vez que ejecuto ocurre exactamente lo mismo):
Vídeo del error

Hi,
Ese es un problema de una mala coneccion en el proto board. Haz una prueba es de que muevas los cables cuando estes mandado la informacion para ver si es que tienes uno de los cables una mala coneccion. Otra cosa que puedes tratar es de anadirle un condensador de por los menos de 47uf y uno de .1uf en paralelo en los pines que suple el voltaje +5 y el ground en el proto board.

Hola de nuevo tauro0221:

Durante los instantes en que todo funciona bien, muevo los cables y eso no hace que falle, es decir, parece que las conexiones son sólidas, falla siempre en el mismo instante (loop número 35).
Crees que aun así se solucionará con los condensadores? y el consejo de que los meta en paralelo es en la alimentación del LCD o de la retroiluminacion (VSS-VDD ó A-K)?

Muchas gracias por su respuesta.
Saludos

Hi,
Todavia no dices que arduino usas y no tengo claro como estas alimentando el protoboard. victorjam menciono que estas usando el USB para alimentar al arduino pero no dices de donde sacas el voltaje para alimentar el protoboard. Los dos condesadores te ayudan a filtra los ruidos y algunos protoboards intruducen ruidos. Otra cosa es que estes seguro que las soldaduras en el LCD esten bien hechas y que no tenga solduras frias. El anadirle los condesadores no peirdes nada con hacerlo.

Hola Tauro0221,

Si que he escrito más arriba que utilizo un arduino UNO. La protoboard la estoy alimentando mediante la toma de 5V y de GND del arduino UNO. Creo que las soldaduras estan bien hechas. Si las soldaduras estuvieran mal hechas, ¿no fallaría desde el primer momento que lo conecto? Sin embrago, funciona bien, excepto cuando se le va la pinza y empieza a meter caracteres extraños (que en base a mirar mucho me he dado cuenta de que lo que hace es como si el texto se desplazara por la pantalla pero mal...). Soy completo desconocedor del problema.

Saludos,

Hi,
No necesariamente si las soldaduras estan mal hechas puede fallar cuando mandas los characteres. Aqui lo que puedes tratar es de tratar de anadirles los condasadore para ver si resuelve el problema.

Perfecto,
en cuanto prueba si funciona os digo =),
Gracias

Hi,
Una cosa que se me vino a la mente es que tu dices

reiniciando el ciclo (ocurre de forma periodica)

. Esto quiere decir que se reinicializa el micro solo. Ahora tu vez este mensaje en la pantalla cuando acurre esto. lcd.print("Estación meteorológica"); o el systema se arregla solo sin ver el mesaje en el LCD.

Mi experiencia me dice que las protoboard al final fallan. Interiormente lleva un conector en forma de hilera en forma de U. Cada vez que conectas algo fuerzas esa U y al final se acaba abriendo con lo que aparentemente hace contacto bien, pero realmente no lo hace.

En tu caso parece que tienes un lcd al que le has soldado una tira de pines y lo has puesto abajo en la protoboard. Eso hace que el poco peso del display haga palanca y se levante un poco de la conexión en la protoboard. Sobretodo si los pines del display son cortos.

Desplaza el lcd, tal y como lo tienes, a la parte superior de la protoboard y rehaz las conexiones:

proto.jpg

Asi evitarás que le haga palanca.

También puede ser que el LCD esté dañado en parte. Si tienes otro cambia a ver si hace lo mismo.

En tu código no se ve nada raro.

proto.jpg

Muchas gracias por tu comentario, me ha sido de ayuda para comprender algunas cosas.
He modificado las conexiones y las he puesto como me has recomendado pero no ha solucionado el problema.

Como insistís con las conexiones he hecho algunas pruebas:

-Si las conexiones fallan por interferencias, los errores deberian de ocurrir de manera "aleatoria" y no de forma determinista como ocurre aquí no?

-Como veis en el video, durante los primeros instantes todo funciona correctamente. Aprovechando esos momentos me he puesto a manosear los cables y el LCD, para ver si las conexiones eran débiles, pero por mas que lo "meneo" no ocurre un fallo (durante estos intantes, en cuanto llega al ciclo 35 empieza a fallar) así que creo que se puede descartar que el fallo sea debido a malas conexiones o a un fallo de la protoboard.

-He probado a poner cerca todos los jumpers en las lineas de toma de corrientes (por si estuviera habiendo pérdidas de voltaje a lo largo de la protoboard y esto no surte ningún efecto.

-He probado a cambiar los pines que uso para el bus de datos y no surte ningún efecto.

El problema es que no tengo otro LCD, pero en cuanto lo consiga lo voy a probar y si ocurre el mismo error, empezaré a pensar que el problema está en que la librería no es compatible con este tipo de LCD o yo que sé.

Muchas gracias por vuestra atención.

Saludos,
Rafael

Saludos a todos,

He solucionado el problema. He leído por ahí que este fallo es producido por "backflight fluctuations" del pin VO del LCD (contraste).

Se soluciona conectando un potenciómetro en el puerto en cuestión en lugar de a un puerto PWM (yo lo tenía conectado a un PWM con valor 100).
Ha sido mano de santo.

Lo he encontrado en un foro de arduino pero está en inglés. Por si a alguien le interesa:

Post en inglés donde se resuelve el problema mediante la instalación de un potenciómetro

Muchas gracias por la atención,

Saludos,

Rafael.

Te he enviado un privado con instrucciones respecto de tu primer y segundo post pero veo que repites la falla en todos los demas, por favor, tomate el tiempo y edita según mis consejos.

Hola surbyte,

Como me has pedido ya he solucionado los problemas.

Saludos

Muy bien Rafael!! de los pocos que hace y presta atención.

Ahora que leo un hilo adecuadamente escrito te respondo, porque yo también tengo mis exigencias.

No uses PROTOBOARD, y dirás como hago? Bueno acostúmbrate a comprar placas de desarrollo o si usas el protoboard al mas minimo problema sospecha de el.

te compras unos PCB con islas redondas o cuadradas que te permiten soldar pines, IC, resistencias, es decir todo, pero.. para unir las cosas debes cablear de un lado a otro. Te queda un prototipo firme y que si falla es porque has hecho mal una conexion pero no porque tengas un mal contacto.

Ya te dieron todas las sugerencias posibles y siempre queda la que no se ve, y es la que victorjam te indicó, respecto de como el peso del LCD crea esa situación de que hace o no hace contacto y sin querer tienes un punto de mayor resistividad o de falla.

Perfecto!

Muchas gracias por el dato, ¡se ve que las protoboards os han dado más de un dolor de cabeza!. Pillaré un par de ellas para hacer las siguientes pruebas (además la parte de soldar me parece bastante entretenida).

Saludos,

RafaelVazquez:
He solucionado el problema. He leído por ahí que este fallo es producido por "backflight fluctuations" del pin VO del LCD (contraste).

Bien. Me alegro. Al final resultó ser de una cosa que no sabía, el pin de contraste se lleva mal con el PWM.

La verdad no es algo que se suela controlar generalmente. Y cuando se hace, le ponemos un potenciometro. Por que el contraste suele ser fijo, una vez se ajusta ya no vuelve a tocarse.

Lo que si se controla es la luz de fondo. Si la apagas no se ve casi nada (mirando muy bien se ve casi algo). Así que hay gente que usa PWM para controlar la iluminación, o un transistor para controlar solo el encendido/apagado.

Un truco que te quiero enseñar. Si no vas a ajustar mucho el contraste y lo quieres dejar fijo, en vez de un potenciometro usa una resistencia desde el pin Vo a GND. Suelo usar una resistencia de 2k2 (tengo un paquete de 1000), pero se pueden usar valores 1k a 4k. Según el valor se ajusta a un nivel fijo y te olvidas para siempre del contraste.