Lcd muestra cuadrados blancos en circuito de control de acceso por teclado

buenas noches, estoy creando un control de acceso por teclado y mi display lcd acompañado del i2c, copié un poco el código y algunas ideas del montaje físico en este post: https://www.prometec.net/control-acceso-clave/ realicé los cambios necesarios ya que no estaba correcto del todo, y una vez todo correcto, lo mandé al arduino y empezó a funcionar todo como debía, pero el lcd tiende a mostrar cuadrados blancos, he ajustado el brillo etc y nada, he probado con otro display lcd y pasa lo mismo, las conexiones fisicas estan exactamente igual que en la web que nombré anteriormente, cambié el 0x27 por el 0x3f pero aun asi nada, es normal porque la direccion de mi I2C segun el modelo es 0x27. Espero que alguien me eche una mano

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @reid_1205.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

¿Cómo estás alimentando el display?
Puedes alimentarlo desde los 5V del UNO sin inconvenientes (siempre que no agregues nada más al circuito).

El esquema tiene un error, falta unir la masa (GND) del display con la del UNO y así no va a funcionar.

al tener los leds conectados al UNO el display no es alimentado correctamente del todo, por lo que decidi meterle una fuente de alimentacion con 5v c.c. En cuanto a lo del GND, es cierto, no me dí cuenta, voy a probarlo y te digo

aun asi, yo en mi circuito conecté el lcd a los 5v y al gnd del UNO, deberia de funcionar y verse los textos, aunque segun el del post se viese con poca iluminación, q en mi caso no es porque se ve perfectamente

voy a probar a conectar el gnd del UNO al carril horizontal de mi protoboard y conectar ahí el gnd de la fuente de alimentacion especifica para el lcd. Una razón posible por la cual el LCD no recibe correctamente los datos, es cuando tienes varios componentes conectados a los 5V del Arduino UNO, como LEDs y un buzzer, estos componentes pueden estar consumiendo una cantidad significativa de corriente. Si la corriente total consumida por todos los componentes conectados a los 5V del Arduino es demasiado alta, podría haber una caída de voltaje en el sistema, lo que afectaría el funcionamiento de los componentes y la comunicación entre ellos.

Nada sigue sin funcionar, muestra los cuadrados blancos pero nada mas, no entiendo, te ofrezco una imagen del circuito conexionado:

Realiza todas las funciones que debe realizar, desbloqueo con pin de 4 digitos, apagado o encendido del lcd con el simbolo # del teclado, cuando me equivoco de pin el buzzer hace finalmente un sonido de error de codigo, etc, no entiendo que ocurre, te proporciono el codigo a continuacion:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Keypad.h>
 /* Funcion de configuracion de pines del modulo LCD/I2C 
    (Direccion,en,rw,rs,d4,d5,d6,d7,backlight,polaridad)*/
 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

const byte Filas = 4;  //Cuatro filas
const byte Cols = 4;   //Cuatro columnas
byte Pins_Filas[] = {9,8,7,6};//Pines Arduino a las filasbyte 
byte Pins_Cols[] = {5,4,3,2}; // Pines Arduino a las columnas.
//no utilizar los pines 1 y 0 para no interferir en Rx y Tx

char Teclas [ Filas ][ Cols ] =
 {
    {'1','2','3','A'},
    {'4','5','6','B'},
    {'7','8','9','C'},
    {'*','0','#','D'}
 };

char codigoSecreto[4] = {'2','2','5','5'}; // Aqui va el codigo secreto
// Para cambiar el tamaño de la clave, solo hay que cambiar el tamaño del array

int posicion=0;    // necesaria para la clave
int cursor=5;      // posicion inicial de la clave en el LCD
int clave=0;       // para el LCD
int luz=0;         // para el LCD
int tiempo=0;      // para el LCD
int ledVerde=11;   // pin para el LED verde
int ledRojo=12;    // pin para el LED rojo
int buzzer=10;     // pin altavoz

Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

void setup()
   {
      Serial.begin(9600) ;
      lcd.begin(16,2);       // inicializamos el LCD.
      lcd.noBacklight();     // apagamos LCD
      pinMode (ledVerde,OUTPUT);
      pinMode (ledRojo, OUTPUT);
      pinMode (buzzer, OUTPUT);
      digitalWrite(ledRojo,HIGH); // encendemos el LED rojo
      digitalWrite(ledVerde, LOW); // apagamos el verde

      lcd.setCursor(0,0);     // situamos el cursor el la posición 2 de la linea 0.
      lcd.print("Introduzca clave"); // escribimos en LCD
      lcd.setCursor(cursor,1); // cursor en la posicion de la variable, linea 1
    }

void loop()
   {
      char pulsacion = Teclado1.getKey() ; // leemos pulsacion
      if (pulsacion != 0) //Si el valor es 0 es que no se ha pulsado ninguna tecla
        { // descartamos almohadilla y asterisco
          if (pulsacion != '#' && pulsacion != '*' && clave==0)
           { lcd.print(pulsacion); // imprimimos pulsacion
             cursor++;             // incrementamos el cursor
             tone(buzzer,350);     // tono de pulsacion
             delay(200);
             noTone(buzzer);

      //--- Condicionales para comprobar la clave introducida -----------
      // comparamos entrada con cada uno de los digitos, uno a uno
      if (pulsacion == codigoSecreto[posicion])
          posicion ++; // aumentamos posicion si es correcto el digito

      if (posicion == 4)
       { // comprobamos que se han introducido los 4 correctamente
         digitalWrite (13,HIGH);  // encendemos LED
         lcd.setCursor(0,0);      // situamos el cursor el la pos 0 de la linea 0.
         lcd.print("Clave correcta ");         // escribimos en LCD
         delay(200);                           // tono de clave correcta
         tone(buzzer,500);
         delay(100);
         noTone(buzzer);
         tone(buzzer,600);
         delay(100);
         noTone(buzzer);
         tone(buzzer,800);
         delay(100);
         noTone(buzzer);

         lcd.setCursor(5,1); // cursor en la posicion 5, linea 1
         clave=1; // indicamos que se ha introducido la clave
         digitalWrite(ledRojo,LOW); // apagamos el LED rojo
         digitalWrite(ledVerde, HIGH); // encendemos el verde
     }
     //--- En el caso de que este incompleta o no hayamos acertado ----------
     if(cursor>8)        // comprobamos que no pase de la cuarta posicion
       {   cursor=5;     // lo volvemos a colocar al inicio
           posicion=0;           // borramos clave introducida
           lcd.setCursor(5,1);
           lcd.print(" ");       // borramos la clave de la pantalla
           lcd.setCursor(5,1);
           if(clave==0)         // comprobamos que no hemos acertado
              { tone(buzzer,70,500); // para generar
                delay(250); // tono de error
                noTone(buzzer);
              }
        }
     }
   } 

 //--- Condicionales para encender o apagar el LCD --------------
 if (pulsacion == '#' && luz==0)
     { // comprobamos tecla y encendemos si esta apagado
       lcd.backlight(); // encendemos
       luz=1; // indicamos que esta encendida
       pulsacion =0; // borramos el valor para poder leer el siguiente condicional
     }

 if (pulsacion == '#' && luz==1)
     { // comprobamos tecla y estado
       lcd.noBacklight(); // apagamos
       luz=0; // indicamos que esta apagada
     }

 //--- Condicionales para resetear clave introducida -------------
 if (pulsacion == '*')
     { // asterisco para resetear el contador
       posicion = 0;
       cursor = 5;
       clave=0;
       posicion=0;
       lcd.setCursor(0,0); // situamos el cursor el la posición 2 de la linea 0.
       lcd.print("Introduzca clave"); // escribimos en LCD
       lcd.setCursor(5,1);
       lcd.print(" "); // borramos de la pantalla los numeros
       lcd.setCursor(5,1);
    
       digitalWrite(ledRojo,HIGH); // encendemos el LED rojo
       digitalWrite(ledVerde, LOW); // apagamos el verde
    }
 }
  • Verifica con tester (multímetro) que haya continuidad entre los pines del módulo I2C y el LCD (las protoboard pueden hacer falsos contactos).
  • Ajusta el contraste con el preset.
  • Coloca resistencias pull-up (o sea, a 5V) de 4.7K en los pines SCL y SDA.
  • Prueba si el display funciona correctamente con el ejemplo "HelloWorld" de la librería LiquidCrystal_I2C que has instalado.

Luego comenta los resultados.

Saludos

PD: el código está mal adjuntado, por favor edita tu post y adjuntalo de acuerdo a las Normas del Foro en Español, punto 7. También usa la opción "Autoformato" del menú "Herramientas" de la IDE antes de copiar el código así nos facilitas su lectura.

Agrego:
El regulador de 5V del UNO (original), si mal no recuerdo, entrega hasta 800 mA (los clones entregan más).
Veamos los consumos si todo lo conectado estuviese encendido todo el tiempo.
2 LED limitados a 10 mA c/u por las resistencias: 20 mA.
El buzzer limitado por la resistencia a un máximo de 15mA.
Display + módulo I2C con un consumo máximo de 25 mA.
El propio UNO, alrededor de 45 mA.
Total unos 105 mA (con ambos LED y el LCD encendidos y el buzzer sonando)
¿De qué caída de tensión hablas?
Es absolutamente innecesario alimentar el LCD con una fuente independiente para este proyecto.

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en (<CODE/>)


listo, muchísimas gracias, a partir de seguiré las normas del foro.

Buenas tardes, te adjunto las siguientes imágenes para que compruebes que ninguna de las opciones que me diste funcionó:

  1. las medidas con el tester fueron correctas y existe continuidad entre cada uno de los pines entre el lcd y el I2C.

  2. Ajusté el contraste del lcd con el potenciómetro del I2C pero aún así nada:

  3. Probé con las resistencias pull-up (de 5k, dado que no tengo de 4,7k) pero no funcionó.

  4. Probé el display con el ejemplo "HelloWorld" de la librería LiquidCrystal y funcionó, pero lo probé usando el I2C y los pines A4 y A5 para SCL y SDA, y comenzó a realizar apagones y encendidos el lcd, luego decidí probar usando los pines del arduino SCL y SDA, despues de descargarme la biblioteca hd44780 y dejó de parpadear y comenzó a encender correctamente, solo que al variar el contraste del mismo, salieron de nuevo los cuadrados blancos.

Luego decidí probar con otro display que llevaba adherido consigo de fábrica el I2C y tampoco me funcionó usando los pines SDA y SCL del UNO, así que decidí probar el nuevo lcd y I2C con los pines A4 y A5, y usando la biblioteca nueva, y me funcionó el lcd correctamente. Así que voy a probar esta librería nueva con el circuito de control de acceso y comento por aquí

eso sí, coloqué serial.println por todo el codigo y solo me muestra en el monitor serie la frase de "en el bucle loop" (la cual establecí para cuando se iniciase el void loop)

He leído que puede ser una mala conexion de los pines del teclado con respecto a lo establecido en el código pero los tengo correctamente conectados en base al mismo.

Si tienes una rutina que hace algo solo cuando presionas un boton del teclado es logico que te diga "en el bucle loop"
De todos modos no veo el código que se condice con lo que mencionas.
El código del post#7 ni siquiera tiene un Serial.print.
Asi que cuando haces un comentario ayúdanos dando datos para entenderte.

Moderador
Por favor, limita las capturas a la parte relevante.
Código solo con etiquetas.

El codigo es el siguiente:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Keypad.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

const byte Filas = 4;
const byte Cols = 4;
byte Pins_Filas[] = {A0, A1, A2, A3};  // Pines analógicos configurados como salidas
byte Pins_Cols[] = {A4, A5, 2, 3};     // Pines analógicos y digitales configurados como salidas

char Teclas[Filas][Cols] =
{
    {'1', '2', '3', 'A'},
    {'4', '5', '6', 'B'},
    {'7', '8', '9', 'C'},
    {'*', '0', '#', 'D'}
};

char codigoSecreto[4] = {'2', '2', '5', '5'};

int posicion = 0;
int cursor = 5;
int clave = 0;
int ledVerde = 11;
int ledRojo = 12;
int buzzer = 10;
int luz = 0;

Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

void setup()
{
    Serial.begin(9600);
    lcd.begin(16, 2);
    lcd.noBacklight();
    pinMode(ledVerde, OUTPUT);
    pinMode(ledRojo, OUTPUT);
    pinMode(buzzer, OUTPUT);
    digitalWrite(ledRojo, HIGH);
    digitalWrite(ledVerde, LOW);

    for (int i = 0; i < Filas; i++) {
        pinMode(Pins_Filas[i], OUTPUT);
        digitalWrite(Pins_Filas[i], HIGH);  // Configuramos las filas en alto
    }

    for (int i = 0; i < Cols; i++) {
        pinMode(Pins_Cols[i], OUTPUT);
        digitalWrite(Pins_Cols[i], LOW);   // Configuramos las columnas en bajo
    }

    lcd.setCursor(0, 0);
    lcd.print("Introduzca clave");
    lcd.setCursor(cursor, 1);
}

void loop()
{
    Serial.println("En el bucle loop...");
    char pulsacion = Teclado1.getKey();
    if (pulsacion != 0)
    {
        if (pulsacion != '#' && pulsacion != '*' && clave == 0)
        {
            lcd.print(pulsacion);
            cursor++;
            tone(buzzer, 350);
            delay(200);
            noTone(buzzer);

            if (pulsacion == codigoSecreto[posicion])
                posicion++;

            if (posicion == 4)
            {
                digitalWrite(13, HIGH);
                lcd.setCursor(0, 0);
                lcd.println("mostramos texto en lcd");
                lcd.print("Clave correcta");
                delay(200);
                tone(buzzer, 500);
                delay(100);
                noTone(buzzer);
                tone(buzzer, 600);
                delay(100);
                noTone(buzzer);
                tone(buzzer, 800);
                delay(100);
                noTone(buzzer);

                lcd.setCursor(5, 1);
                clave = 1;
                digitalWrite(ledRojo, LOW);
                digitalWrite(ledVerde, HIGH);
            }
            
            if (cursor > 8)
            {
                cursor = 5;
                posicion = 0;
                lcd.setCursor(5, 1);
                lcd.print(" ");
                lcd.setCursor(5, 1);
                if (clave == 0)
                {
                    tone(buzzer, 70, 500);
                    delay(250);
                    noTone(buzzer);
                }
            }
        }
    }

    if (pulsacion == '#' && luz == 0)
    {
        lcd.println("encendemos lcd");
        lcd.backlight();
        luz = 1;
        pulsacion = 0;
    }

    if (pulsacion == '#' && luz == 1)
    {
        lcd.println("apagamos lcd");
        lcd.noBacklight();
        luz = 0;
    }

    if (pulsacion == '*')
    {
        lcd.println("mostramos texto en lcd");
        posicion = 0;
        cursor = 5;
        clave = 0;
        posicion = 0;
        lcd.setCursor(0, 0);
        lcd.print("Introduzca clave");
        lcd.setCursor(5, 1);
        lcd.print(" ");
        lcd.setCursor(5, 1);

        digitalWrite(ledRojo, HIGH);
        digitalWrite(ledVerde, LOW);
    }
}

Pero debería de mostrarme en el monitor serie los textos que coloqué encada parte del código con serial.print

De todos modos leí que cuando conectamos los pines de nuestro teclado a salidas digitales, el arduino solo es capaz de detectar de qué tecla le proviene el impulso, desencadenando a las siguientes acciones que establecí en mi código, pero no es capaz de detectar el valor de cada tecla que leyó, con lo cual puede desencadenar en un mal desarrollo del código, no dejando mostrar los textos en mi LCD. No sé si es cierto o no, ya que la mayoría de personas suelen usar pines digitales, pero creo que algo de razón lleva el que dijo todo esto. Un cordial saludo

He visto que usan un divisor de voltaje para las columnas y otro para las filas, dejando un solo cable a la salida, el cual va a un pin analógico, ahorrándose el uso de cables

Google: "teclado analógico arduino"

Por ej.
Teclado de matriz 4x4 analógico para arduino

Gestión de un teclado analógico 4x4 con Arduino

el lcd me esta funcionando actualmente por fin, pero cuando lo agarro con la mano muestra caracteres raro y se apaga el texto, puede ser por las conexiones que trae de fábrica el lcd unido al i2c pero no se, quiero pensar que no es de ahí

Armado en protoboard?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.