Problema con Display LCD 2004 y controlador I2C, caracteres extraños al tiempo

Hola
Tengo un proyecto con UNO, display LCD 2004 con controlador I2C, sensore de temp NTC y reles de salida pa las bombas de control de temp en un termo y una estufa. El prob reside que fijo los setpoint mediante unos pulsadores, al cabo de un tiempo cuando entro en el menu para configurar estos setpoints, al entrar varias veces, no he contado exactamente, me empiezan a salir caracteres extraños y no m muestra lo q tengo programado, salgo del menu, mediante los pasos de memoria q se, y me muestra lo demás bien, pero con un cursor parpadenado y ya inmediatamente q kiero volver a entrar en el menu, me sigue mostrando los caracteres locos y el cursor parpadeando, pero los valores de temp y demas si se muestran bien, legibles pero empieza a salir el cursor tamb aki, he leido en otros temas q resulta d un problema d fluctuacion de voltaje del contraste, pero en ese forum no utilizaba controlador I2C, así q no se por dond va el problema, saludos

SUBIR PROGRAMA FORUM.txt (17.5 KB)

Posting a schematic showing all power and grounds would be a big help as well as your software. If I had to guess it sounds like you are having electrical noise from the relay (assumed you did not state there was one). How are you powering the low voltage side? What value pull up resistors did you use for the I2C?

Posting a schematic showing all the power and basics would be helpful, as would your software. If I had to guess, it looks like you are having electrical noise from the relay (assumed you didn't indicate there was one). How are you feeding the low voltage side? What value of pull-up resistors did you use for the I2C?

Pero es q si fuera problema de ruido del rele, me saliera siempre y es a partir de un momento no exacto, el I2C utilizado es el que venía con el display solo lo soldé, no utilicé resistencias Pull up ni pull down, he leido en otro topics y a alguien le parecía algo parecido pero no utilizaba I2C, y lo solucionó poniedo una resistencia entre V0 del LCd y GND.

Edité mi primer post, añadiendo el código para ver si encuentran algún problema y m puedan ayudar, saludos

Si me permites, un par de consejos con todo respeto.

Uno ya te lo dió @surbyte en el post de histéresis, los comentarios en minúsculas.

No pongas comentarios de cosas obvias como "leyendo tal pin y guardando en tal variable" que es evidente con solo leer la instrucción. No suma nada.
Si te parece necesario pon algo significativo y conciso, "lee temp tanque", por ejemplo.

Asigna nombres significativos a las variables.
¿Con todo lo que escribiste en los comentarios, no podías llamar "luz" o "ilum" a la que nombraste "L"?
Sería más facil de entender lo que hace sin tener que memorizar a que se refiere esa variable.

Asocia los pines a constantes, por ejemplo,

const int BOTON_OK = 8;
const int RELE_BOMBA = 13;

así se entiende facilmente a qué está conectado el pin que lees o escribes

Es infinitamente más sencillo de entender lo que hace

if(digitalRead(BOTON_OK) == true) {
  digitalWrite(RELE_BOMBA, HIGH);

que

if(digitalRead(8) == true) {
  digitalWrite(13, HIGH);

Y por favor, si tienes que adjuntar un código usa la extensión adecuada (y ya que estás el nombre también vendría bien), tener que bajarlo y encima obligarnos a cambiar la extensión a .ino para poder revisarlo en la IDE, te aseguro que es un "espanta colaboradores". :wink:

Edita el código y por lo menos nombra los pines (aunque lo ideal sería modificar los comentarios porque distraen la vista) para facilitar la lectura y lo vemos.

Saludos

PD: para que entiendas el tema de los comentarios te adjunto una captura de la pantalla de mi celular (desde donde me conecto siempre) y fíjate si es fácil de leer el código (que es lo que realmente importa)

Y te agrego algo más y juro que no te atormento más. ::slight_smile:

El editor del foro no acepta más de 9000 caracteres por post en total, entonces si escribes una descripción de digamos, 1000 caracteres ya no podrías adjuntar un código de mas de 8000 caracteres, pero nada impide que postees tu código por partes.
Por ej.

Las declaraciones y
el setup() aquí

Y

El loop() y 
las funciones() aquí

Simplemente lo divides en varias partes y listo. :wink:
Solo hay que ser coherente en donde hacer los cortes, por ejemplo, nunca en mitad de una función.
Tratar de mantener una lectura sencilla es lo ideal.

Saludos

Probablemente no estas conectando correctamente tu codigo mas reciente de arduino a la pantala LCD 16X2, es por eso que te carga caracteres diferentes, te recomiendo ir a la pestaña de comunicaciones y que corrobores que sea el arduino correcto el que colocaste y el puerto de comunicacion correcto tambien.

Hola
Corregí la programación del dsplay pensando sería mala programación, e hice una programación más limpia, pero me sigue dando el mismo, error. A modo de resumen mi proyecto acciona unas bombas q hacen circular agua d una estufa hacia un termo y de este hacia los radiadores cuando se cumplen ciertos requisitos, en el display muestro las temperaturas d las aguas (salida de la estufa, termo y maxima del termo), además de implementé un menú dond se pudiera modificar los setpoint de condiciones de accionamiento de las bombas. el problema surge luego de entrar varias veces al menú, para ir jugando con los valores adecuados de temperaturas, dentro del menú empiezan a salir caracteres extraños, locos sin sentido, y luego empieza a salir una especie de cursor cuando muestro las temperaturas, q parpadea, y se pierde el simbolo de grados (º) y cada vez q entro de nuevo al menu, no se distingue nada del mismo, a veces desconecto el proyecto y lo vuelvo a alimentar y persiste el problema. He leido en otros foros q podría ser una variación de voltaje en los pines VCC y GND del controlador I2C, le solde un condensador de 10 microF y creo me dañó la pantalla pq me sale en la letra T de la 2da fila un 0 al igual q en la posición 0,0, sin embargo cuando parece no lleno de tanta información el display no aparece.
Les muestro el código de mi programa, no he podido corregir los consejos q m han dado, en el otro tema, pero les ruego no miren la parte d funcionamiento de las bombas ni condicionantes, que en esas partes no hay programación de Display, por cierto utilizo un LCD 2004 con controlador I2C
les iré adjuntando mi código.

Código e imágenes de los problemas

PROYECTO_.ino (18.7 KB)

Las imágenes

Display.jpg

Display.jpg

El símbolo de “°” ya está definido, pon

LCD.print("337C");   // 337 = ° entonces muestra °C

No me preguntes por qué diablos el código del caracter ° va en octal porque no tengo idea… :o

Creo que lo que te conviene es dejar solo el manejo del display y menú (simula las lecturas de los sensores asignando valores a variables), así va a ser mas fácil aislar el problema.
Cuando lo tienes listo agregas el código de los sensores.

Te dejo un tutorial sobre LCD+I2C por si te sirve para despejar dudas.

Como no tengo un display voy a ver si puedo emular tu código en Proteus, pero no te prometo nada.

Saludos