Problemas con LCD en Arduino

#1
Buenos días.Hace poco adquirí un kit de Arduino Uno e intentando probar los distintos componentes me he topado con el dichoso LCD el cual no consigo hacer funcionar.Ahora mismo estoy siguiendo este ejercicio, aunque ya he probado muchos otros incluidos los ejemplos de LCD que vienen en Arduino IDE y siempre llego a lo mismo.Soy capaz de ajustar el contraste de la pantalla através del la resistencia variable,pero no se me muestra ningún texto en la pantalla.Solo estos cuadros blancos que desaparecen conforme ajusto la resistencia variable ...

Edit:
Adjunto el código del programa que no me dejan poner links XD:

El circuito:
* LCD RS pin va conectado al digital pin 12
* LCD Enable pin conectado al digital pin 11
* LCD D4 pin conectado al digital pin 5
* LCD D5 pin conectado al digital pin 4
* LCD D6 pin conectado al digital pin 3
* LCD D7 pin conectado al digital pin 2
* LCD R/W pin conectado a ground
* los dos ultimos a +5V and ground
* El cable de la LCD VO va conectado a la referencia del potenciometro

*/
//Codificamos el mensaje en una cadena de 12 posiciones
char Str[12] = {\'H\', \'o\', \'l\', \'a\', \',\', \' \', \'M\',\'u\',\'n\',\'d\',\'o\',\'!\'};
int posicion = 0;

#include <LiquidCrystal.h> // incluimos la libreria LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// inicializamos los pines

//------------------------------------
//Funcion principal
//------------------------------------

void setup() {

lcd.begin(16, 2); //Cofiguramos el tamaño de la LCD
}

//------------------------------------
//Funcion ciclicla
//------------------------------------

void loop() {

while (posicion < 12) { //Configuramos la estructura con la
//cantidad de posiciones de la cadena
lcd.cursor(); //Activamos el apuntador
lcd.setCursor(posicion, 0); //Rotamos las columnas
lcd.print(Str[posicion]); //imprimimos la posicion de la cadena
delay (500); //Retardo entre posiciones
posicion++; //Rotamos la posion de la cedena
}

posicion = 0; //Colocamos la posicion de la cadena
delay(1000); //Retardo de impresion del mensaje
lcd.clear(); //Borramos todos los datos de la lCD
}

//Fin programa ...
 

Adjuntos

Última edición:
#2
Usa los ejemplos de la librería, revisa las conexiones y ya está tiene que ir si o si.

Ahora no va, los cuadrados blancos es lo que sale cuando alimentas el LCD y no haces nada.
 
#3
Usa los ejemplos de la librería, revisa las conexiones y ya está tiene que ir si o si.

Ahora no va, los cuadrados blancos es lo que sale cuando alimentas el LCD y no haces nada.
ya te digo que he probado todos los ejemplos de la libreria,he probado con otros ejemplos sacados de internet.y tengo todo bien conectado...si es necesario adjunto fotos de la protoboard y demás.pero vamos que lo tengo todo mas que comprobado y nada..



voy a comprobar las soldaduras de los pines de la LCD a ver si es eso lo que esta dando fallo...
 
Última edición:
#4
Pues entonces el LCD está roto.
Puede ser:
-el arduino
-la conexión
-el código
-el LCD

Si según tu, las tres primeras no son, es que es la cuarta.

Yo voto porque es la conexión o el código o ambas, porque una no cuadre con la otra.
 
#5
ya has intentado simular los codigos que nombras en el Isis Proteus? eso descartara el codigo.
hablas de cuadros negros. encendiste la contra luz del lcd?, es azul y no dejan ver nada si no hay contraluz encendida.
 
#7
Gracias a todos por la ayuda.Ya conseguí arreglarlo.No era nada ni de código ni de conexión en la protoboard.Repasé las soldaduras de los pines del LCD y resuelto.Ya funciona correctamente :D
 
#8
A mi me paso no hace mucho lo mismo pero con el arduino, si el kit que te compraste es con arduino chinori revisa soldaduras de los conectores ya que no son de muy buena calidad, y con el movimiento de conectar y desconectar acaban partiéndose
 
#9
Hola. ¿Qué tal, chicos?
Tengo un percance con mi arduino uno. Hice un programa que al ejecutarse hace la función de un reloj de 24 horas configurable, junto con una alarma.
Tengo problemas al intentar que me de algún resultado en físico.
Ya compré otro arduino original para ver si ese era el problema, pero al parecer no.
Mi LCD 16x2 sólo enciende, pero no manda ninguna información, lo cual ya me tiene desesperado.
C++:
#include <TimerOne.h>

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

LiquidCrystal_I2C lcd (0x27, 16, 2);
const int PULSADOR_MODO = 2;
const int PULSADOR_UP = 3;
const int PULSADOR_DOWN = 4;

int horas=0;
int minutos=0;
volatile int segundos=0;
volatile boolean actualizar=true;
int horas_alarma=0;
int minutos_alarma=0;
boolean alarmaOn=false;
char texto[10];
int modo = 0;
const int N=6;

void setup(){
  Wire.begin();
  lcd.begin(16,2);
  lcd.clear();
  lcd.backlight();

  pinMode(PULSADOR_MODO, INPUT);
  pinMode(PULSADOR_UP, INPUT);
  pinMode(PULSADOR_DOWN, INPUT);
  Timer1.initialize(1000000);
  Timer1.attachInterrupt(manejadoraTimer);
}

void manejadoraTimer(){
    segundos++;
    actualizar=true;
}

void actualizarReloj(){
  minutos += segundos / 60;
  segundos = segundos % 60;
  horas += minutos / 60;
  minutos = minutos % 60;
  horas = horas % 24;
}


void incrementarHoras(){
  horas ++;
  horas = horas % 24;
  actualizar=true;
}

void decrementarHoras(){
  horas --;
  if(horas<0){
    horas = 23;
  }
  actualizar=true;
}

void incrementarHorasAlarma(){
  horas_alarma++;
  horas_alarma = horas_alarma % 24;
  actualizar=true;
}

void decrementarHorasAlarma(){
  horas_alarma--;
  if(horas_alarma<0){
    horas_alarma = 23;
  }
  actualizar=true;
}


void incrementarMinutosAlarma(){
  minutos_alarma ++;
  minutos_alarma = minutos_alarma % 60;
  actualizar=true;
}

void decrementarMinutosAlarma(){
  minutos_alarma --;
  if(minutos_alarma<0){
    minutos_alarma = 59;
  }
  actualizar=true;
}

void incrementarMinutos(){
  minutos ++;
  minutos = minutos % 60;
  actualizar=true;
}

void decrementarMinutos(){

  minutos --;
  if(minutos<0){
    minutos = 59;
  }
  actualizar=true;
}

void fijarCursorModo(){
  switch(modo){
    case 0:
      lcd.noBlink();
    break;
    case 1:
      lcd.setCursor(0, 0);
      lcd.blink();
    break;
    case 2:
      lcd.setCursor(3, 0);
      lcd.blink();
    break;
    case 3:
      lcd.setCursor(0, 1);
      lcd.blink();
    break;
    case 4:
      lcd.setCursor(3, 1);
      lcd.blink();
    break;
    case 5:
      lcd.setCursor(6, 1);
      lcd.blink();
    break;
  }
}

void loop(){

  if(digitalRead(PULSADOR_MODO)==HIGH){
    modo++;
    modo = modo % N;
    fijarCursorModo();
    while(digitalRead(PULSADOR_MODO)==HIGH);
  }

  switch(modo){
    //RELOJ
    case 1:
      if(digitalRead(PULSADOR_UP)==HIGH){
        incrementarHoras();
        while(digitalRead(PULSADOR_UP)==HIGH);
      }
      if(digitalRead(PULSADOR_DOWN)==HIGH){
        decrementarHoras();
        while(digitalRead(PULSADOR_DOWN)==HIGH);
      }
    break;
    case 2:
    if(digitalRead(PULSADOR_UP)==HIGH){
        incrementarMinutos();
        while(digitalRead(PULSADOR_UP)==HIGH);
      }
      if(digitalRead(PULSADOR_DOWN)==HIGH){
        decrementarMinutos();
        while(digitalRead(PULSADOR_DOWN)==HIGH);
      }
    break;
    //ALARMA
    case 3:
      if(digitalRead(PULSADOR_UP)==HIGH){
        incrementarHorasAlarma();
        while(digitalRead(PULSADOR_UP)==HIGH);
      }
      if(digitalRead(PULSADOR_DOWN)==HIGH){
        decrementarHorasAlarma();
        while(digitalRead(PULSADOR_DOWN)==HIGH);
      }
    break;
    case 4:
      if(digitalRead(PULSADOR_UP)==HIGH){
        incrementarMinutosAlarma();
        while(digitalRead(PULSADOR_UP)==HIGH);
      }
      if(digitalRead(PULSADOR_DOWN)==HIGH){
        decrementarMinutosAlarma();
        while(digitalRead(PULSADOR_DOWN)==HIGH);
      }
    break;
    case 5:

      if(digitalRead(PULSADOR_UP)==HIGH){
        alarmaOn=!alarmaOn;
        actualizar=true;
        while(digitalRead(PULSADOR_UP)==HIGH);
      }

    
      /*
      if(digitalRead(PULSADOR_UP)==HIGH){
        alarmaOn=true;
        actualizar=true;
        while(digitalRead(PULSADOR_UP)==HIGH);
      }
      if(digitalRead(PULSADOR_DOWN)==HIGH){
        alarmaOn=false;
        actualizar=true;
        while(digitalRead(PULSADOR_DOWN)==HIGH);
      }
      */
    break;
  }

  if(actualizar == true){
    actualizarReloj();
    lcd.clear();
    lcd.noBlink();
    //RELOJ
    lcd.setCursor(0,0);
    sprintf(texto, "%02d:%02d:%02d",horas,minutos, segundos);
    lcd.print(texto);
    //ALARMA
    lcd.setCursor(0,1);
    sprintf(texto, "%02d:%02d",horas_alarma,minutos_alarma);
    lcd.print(texto);

    if(alarmaOn ==true){

      lcd.print(" ON");

    }else{
      lcd.print(" OFF");
    }

    actualizar = false;

    fijarCursorModo();

  }
} IMG_20180508_200634.jpg
 
Última edición por un moderador:
#10
¿Has hecho las pruebas parciales antes de meter todo ese código?
¿Cómo ser, si la rutina que lee los pulsadores está bien?
 
#11
Sí, de hecho hice pruebas mandando sólo un texto.
Mandé un hola mundo, pero no funciona.
C++:
#include <Wire.h>

#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd (0x27, 16, 2);

void setup(){

  Wire.begin();

  lcd.begin(16, 2);

  lcd.clear();

  lcd.backlight();

  lcd.setCursor(0, 0);

  lcd.print("Hello, world!");

  lcd.setCursor(0, 1);

  lcd.print("Tech Krowd");

  //lcd.noBacklight();
}

void loop(){
}
 
Última edición por un moderador:
#14
no no solo enciende asi normal
------- Mensaje actualizado: -------

IMG_20180508_203623.jpg
------- Mensaje actualizado: -------

tambien lo ajuste con el ic2 :(
 
#17
esta bien puesto el cable del I2C?
Cuando cargaste el programa el mensaje que te dio fue ok?
En la placa del arduino mientras cargaba el programa titilaba el led?
 
#18
no no marco ok solo decia
El Sketch usa 2884 bytes (8%) del espacio de almacenamiento de programa. El máximo es 32256 bytes.
Las variables Globales usan 245 bytes (11%) de la memoria dinámica, dejando 1803 bytes para las variables locales. El máximo es 2048 bytes.
------- Mensaje actualizado: -------

si si el led titilaba y todo pero no decia ok
 
Arriba