Cuadraditos negros en LDC 1602 con i2C (SOLUCIONADO)

Buenas noches. De nuevo tengo problemas con Arduino. Estoy intentando que Arduino Uno controle un display LCD 1602 con i2C incorporado. Pero no consigo que funcuione. La pantalla se enciende y solo aparece la primera línia pero con cuadraditos negros. He tocado el potenciometro, pero solo actua sobre el contraste. He con probado otras librerías, pero en todas pasa exactamente igual. Las conexiones, que solo son 4, estan bien y en su sitio. He estado rebuscando en internet, pero no encuentro la solución. Ya no se que más mirar.

¿Alguien se ha encontrado con el mismo problema? ¿Alguien puede echarme un cable?

pon tu code

mirate esto

tu problema debe ser esto: Direccion I2C

#define I2C_ADDR 0x20 // Direccion I2C para PCF8574A que es el que lleva nuestra placa diseñada

La linea que configura la pantalla varia según el backpack i2c

la que yo uso es esta:

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

si esa no te sirve debe ser otra entonces pero eso es lo que te origina el problema.

Gracias a los dos por responder. Vamos por partes:

Naruto 128: el código que tengo es este:


/*
Codigo realizado por Salvador Ruiz Sedeño el 27-9-2014

Més info a :- YouTube
http://www.frostcode.es/

Codi per utilitzar pantalla lcd 1602 + i2c*/

//Només escrites dues línies

//Llibreries necessàries
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

//Llibreria Wire, és a Sketch, Importa biblioteca, Wire
/Llibreria LiquidCrystal_I2C es descarrega a la pàgina
del vídeo. Descarregar en zip i, sense descomprimir-lo,
anar a buscar-la des de Skech, Afegeix fitxer i buscar-lo
/

void setup() //Inici en posar en marxa Arduino
{
lcd.backlight(); //Inici fons retroil•luminació
lcd.init(); //Inici la pantalla
}

void loop()//Cicle que es repetirà fins que es desconnecti Arduino
{
lcd.clear(); //Neteja pantalla LCD
lcd.print("Hola"); //Escriu primera línia
lcd.setCursor(0,); //Salta a la segona línia
lcd.print("Hola Món");//Escriu segona línia

delay(10000);
}

//Fi programa


Incluso he copiado y pegado el código original i nada.

También he probado este otro código código, copiando y pegando y tampoco varía nada.

Hola de nuevo, ehrja, si sustituyo esta línia, me da el siguiente error:

Pant_LCD_1602_12C:15: error: 'POSITIVE' was not declared in this scope

En otras librerías que he probado,que incluyen el POSITIVE o NEGATIVE, me da el mismo error.

En ninguna de las pruebas que he hecho, va variado lomás mínimo la pantalla.

Gracias por las respuestas

Yo uso la librería de fmalpartida:

https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/LiquidCrystal_V1.2.1.zip

Inicializo el LCD así:

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup() {
  lcd.begin(16, 2);
  lcd.clear();
  lcd.print ("prueba");

Pero antes de nada, averigua la dirección i2c del LCD usando el código del i2c scanner:

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

Hola de nuevo, carmeloco, cuando coloco (sustituyo) -- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); --, me sigue dando error con el POSITIVE..., que es el mismo error que da con NEGATIVE, con otras librerías. Y lo de malpartida ya lo prové sin resultado...

Un link o un datasheet de la pantalla ayudaría. El código que te puse yo, solo funciona con la librería de fmalpartida. Si te da error con lo de positive, usando la librería de fmalpartida, solo se me ocurren dos razones. O no instalas las librerías correctamente, o tienes instaladas varias librerías de lcd i2c, y el ide de arduino, no sabe cual elegir, o elige una que no es correcta.

Te puedo asegurar que el código que te puse, compila correctamente usando la librería de fmalpartida.

Una cosa que se me olvidaba. Al descomprimir la librería de fmalpartida, renombra la carpeta LiquidCrystal por LiquidCrystal_i2c, antes de ponerla en el directorio libraries, ya que si no lo haces, entrará en conflicto con la librería LiquidCrystal que lleva de serie el ide de arduino.

cierto, carmeloco tiene razón, tal vez tienes mas de una librería con el mismo nombre y el arduino tomara una por otra

yo tengo la misma libreria https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/LiquidCrystal_V1.2.1.zip

recuerda que depende del backpack i2c si tienes otro diferente al que yo tengo o lo has soldado diferente, la linea que te pase no funcionara, sácale una foto a la pantalla por la parte de atrás y por enfrente, para ver como es.

Cuando compé la pantalla, y venia con el i2c incorporada (de hecho, ni la he separado). Ahora tengo un follon de miedo con carpetas y archivos. Voy a borrarlas todas y empezar desde 0, con lo que me habeis dicho. Si os parece, dejamos el hilo de momento y os digo, cuando pueda, como está el tema Tal vez sea la otra semana, ya que esta que viene la tengo muy apretada.

Venga, hasta pronto y gracias por la ayuda...

Bueno, vuelvo a estar aquí. He borrado todo lo que tenía y lo he vuelto a instalar. He copiado exactamente este código y descargado las librerías. He pasado la verificación y és correcta. Lo he descargado y el problema sigue exactamente igual: cuadraditos negros en la primera fila...


#include <Wire.h>

#include <FastIO.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_SR.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>

/****************( DESCRIPCION )***********************

Ejemplo de funcionamiento de LCD con 2 hilos
mediante conversor I2C-LCD de http://www.ElectroHobby.es
Configuracion para LCD 1602 con Arduino Uno R3
Direccion en el bus: 0x27
LCD 16 caracteres 2 lineas

*******************************************************/

/( CONEXIONADO )***

Modulo I2C Arduino Uno Arduino Mega
GND ______________ GND ___________ GND
VCC ______________ 5V ___________ 5V
SDA ______________ A4 ___________ 20
SCL ______________ A5 ___________ 21

********************************************************/

/( DECLARACIONES )****/

/( Librerias )/
#include <Wire.h> // Libreria de comunicacion I2C/TWI de Arduino IDE
#include <LiquidCrystal_I2C.h> // Libreria LCD-I2C de fmalpartida
/( Constantes )/
/( Objetos )/
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); /* Funcion de configuracion
de pines del modulo LCD/I2C (Direccion,en,rw,rs,d4,d5,d6,d7,backlight,polaridad)/
/
( Variables Globales )*/

/*******************************************************/

/( SETUP )********/

void setup() //Las instrucciones solo se ejecutan una vez, despues del arranque
{ //Inicio del Setup
lcd.begin(16,2); //Inicializacion de LCD de 16 caracteres y 2 lineas

/( Parpadeo backlight )/
for(int i = 0; i< 3; i++) //Bucle encendido/apagado del backlight
{ //Inicio del bucle encendido/apagado del backlight
lcd.backlight(); //Encendido
delay(250); //Tiempo de espera
lcd.noBacklight(); //Apagado
delay(250); //Tiempo de espera
} //fin del bucle encendido/apagado del backlight

lcd.backlight(); // Dejamos encendido el backlight
} //Fin del Setup

/*******************************************************/

/( LOOP )*********/

void loop() //Las instrucciones se ejecutan una y otra vez, hasta un reset o apagado
{ //Inicio del Loop

/( Escribir en el LCD )/
lcd.setCursor(0,0); //Apuntamos a la direccion LCD(caracter,linea)
lcd.print("ElectroHobby.es"); //Escribimos texto
delay(1000); //Tiempo de espera

lcd.setCursor(1,1); //Apuntamos a la direccion LCD(caracter,linea)
lcd.print("Test"); //Escribimos texto
delay(500); //Tiempo de espera

for(int i = 5; i< 12; i++) //Bucle Procesando...
{ //Inicio del bucle procesando...
lcd.setCursor(i,1); //Apuntamos a la direccion LCD(caracter,linea)
lcd.print("."); //Escribimos texto
delay(500); //Tiempo de espera
} //fin del bucle procesando..

lcd.setCursor(12,1); //Apuntamos a la direccion LCD(caracter,linea)
lcd.print("ok"); //Escribimos texto
delay(2000); //Tiempo de espera

/( Desplazamiento )/
lcd.clear(); //Borrado del LCD
lcd.setCursor(20,0); //Apuntamos a la direccion LCD(caracter,linea)
lcd.print("Te espero en"); //Escribimos texto
lcd.setCursor(16,1); //Apuntamos a la direccion LCD(caracter,linea)
lcd.print("WWW.ElectroHobby.es"); //Escribimos texto
for (int i = 0; i < 20; i++) //Bucle desplazamiento
{ //Inicio del bucle desplazamiento
lcd.scrollDisplayLeft(); //Desplazamiento a la izquierda
delay(150); //Tiempo de espera
} //Fin del bucle desplazamiento
delay(6000); //Tiempo de espera
lcd.clear(); //Borrado del LCD
delay(1000); //Tiempo de espera

} //Fin del Loop

/*******************************************************/

//Fin del programa


Alguna idea?

¿Has cargado el código del i2c scaner que tepuse, para averiguar la dirección i2c?

Hola carmeloco, no no he cargado el código que me enviaste, por que no se cómo hacerlo. ¿Como debo utilizar el código? ¿Que debería hacer con èl? ¿Donde lo pongo? En el código que he puesto arriba, veo " Direccion en el bus: 0x27" supongo que se refiere a la dirección de i2c del código, que debería coincidir con el mio, cierto? En "declaraciones" pone "LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); /* Funcion de configuracion". De nuevo 0x27. Una vez sepa qué dirección tiene mi i2c, suponiendo que sea 0x20, ¿como lo cambio?

Gracias por la ayuda

El i2c scaner, se carga en el arduino como código independiente, y da el resultado por la consola serie. Allí salen los elementos i2c detectados y su dirección. Si la dirección fuese la 0x20, tienes que cambiar esto:

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

Por esto:

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

Y por favor, usa el icono de code (la hoja con los símbolos<>) para poner códigos.

Agregando un detalle a lo que te pide carmeloco, asegúrate de tener solo la pantalla conectada al i2c del arduino antes de cargarle el código del scaner i2c, así solo te dará la dirección de la pantalla, directamente.

Bueno, he cargado el programa de scaner de la i2C y, en la pantalla negra (inferior) da esto (adjunto 1) lo he puesto en un adjunto, por que no encuentro eso de "usa el icono de code (la hoja con los símbolos<>) para poner códigos" y hay un monton de números que no se leer, no se lo que debo buscar (perdona, pero el que no sabe es como el que no ve...).

Creo que la pantalla es de 0x20, cierto?

He cambiado lo que me dijiste en la página de codigo del programa: (0x27) por (0x20) en el programa (que adjunto en otro archivo (2).

Pero sigue sin funcionar, no ha variado nada...

Bueno, he cargado el programa de scaner de la i2C y, en la pantalla negra (inferior) da esto (adjunto 1) lo he puesto en un adjunto, por que no encuentro eso de "usa el icono de code (la hoja con los símbolos<>) para poner códigos" y hay un monton de números que no se leer, no se lo que debo buscar (perdona, pero el que no sabe es como el que no ve...).

Creo que la pantalla es de 0x20, cierto?

He cambiado lo que me dijiste en la página de codigo del programa: (0x27) por (0x20) en el programa (que adjunto en otro archivo (2).

Pero sigue sin funcionar, no ha variado nada...

1 Scaner de la i2c.pdf (104 KB)

2 Código programa LCD con modificaciones.pdf (14.5 KB)

A ver, el icono para poner los códigos, lo tienes encima de donde escribes en el foro, encima de los emoticonos, uno con forma de hoja con los símbolos<>.

Lo que has puesto, es el resultado de haber cargado el sketch en el arduino, que debes tener el ide configurado en modo "verbose". Ahora, lo que tienes que hacer, es abrir la consola serie, o sea,el icono de la lupa que hay arriba a la derecha, en el ide de arduino. Allí verás el resultado del i2c scaner.

Vaaaaale, localicé el icono de "code",es que es tan pequeñajo, que no lo veía.

Vale, vamos aon el scaner. Con el sketch abierto y descargado a la placa, le doy a "Monitor serie", se bareu la ventana, pero esta vacía. Solo hay: Com18 (arduino uno) arriba a la izquierda, el cursor en la ventana de "enviar" y nada mas...

Abajo, a la derecha del monitor serial, ¿tienes seleccionada la velocidad a 9600? Debería salir algo.