(SOLUCIONADO) LCD_I2C

Hola

No consigo compilar un sketch para controlar un LCD, llevo varios días dándole vueltas y no veo el error...

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

#define I2C_ADDR    0x27

LiquidCrystal_I2C             lcd(I2C_ADDR,2, 1, 0, 4, 5, 6, 7);
void setup()
   {
       lcd.begin (16,2);    // Inicializar el display con 16 caraceres 2 lineas
       lcd.setBacklightPin(3,POSITIVE);
       lcd.setBacklight(HIGH);

       lcd.home ();                   // go home
       lcd.print("Prometec.net");
       lcd.setCursor ( 0, 1 );        // go to the 2nd line
       lcd.print("Malpartida lib");
   }
void loop() 
   {}

Bueno, si veo el error porque me lo indica al compilar, pero no entiendo que puede pasar:

exit status 1
no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int)'

El LCD es 4x20 y la dir 0x27.

Gracias!

El compilador te avisa de que la funcion que llamas en tu sketch no coincide con ninguna de la libreria <LiquidCrystal_I2C>
Mira el código:

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

#define I2C_ADDR    0x27

LiquidCrystal_I2C lcd(I2C_ADDR,2, 1, 0, 4, 5, 6, 7);   // <<=== Error en parametros
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);   // <<=== Esto seria lo correcto para un display 16x02

Debes revisar las funciones de esta libreria, porque los parametros que les das no se corresponden.
funciones tal y como están definidas en la libreria:

LiquidCrystal_I2C(uint8_t lcd_addr, uint8_t lcd_cols, uint8_t lcd_rows, uint8_t charsize = LCD_5x8DOTS);

void begin();
void clear();
void home();
void noDisplay();
void display();
void noBlink();
void blink();	 
void noCursor();
void cursor();
void scrollDisplayLeft();
void scrollDisplayRight();
void printLeft();
void printRight();
void leftToRight();
void rightToLeft();
void shiftIncrement();
void shiftDecrement();
void noBacklight();
void backlight();
void autoscroll();
void noAutoscroll(); 
void createChar(uint8_t, uint8_t[]);
void setCursor(uint8_t, uint8_t); 
virtual size_t write(uint8_t);
void command(uint8_t);

inline void blink_on() { blink(); }
inline void blink_off() { noBlink(); }
inline void cursor_on() { cursor(); }
inline void cursor_off() { noCursor(); }

// Compatibility API function aliases
void setBacklight(uint8_t new_val);				// alias for backlight() and nobacklight()
void load_custom_character(uint8_t char_num, uint8_t *rows);	// alias for createChar()
void printstr(const char[]);

Observa que la mayoria no tiene parámetros. Corrigelo en tu sketch.

Si usa la librería de fmalpartida esa inicializacíón del LCD no esta mal dependiendo de los pines usados por el IC del módulo I2C, sin embargo si usas la librería de un IDE actualizado estoy de acuerdo con lo que sugiere Alfaville.
Evidentemente tomaste el código de alguien que usó otra librería y tu no.

pertenece a LiquidCrystal_I2C.cpp de fmalpartida

LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw,
                                     uint8_t Rs, uint8_t d4, uint8_t d5,
                                     uint8_t d6, uint8_t d7 )
{
   config(lcd_Addr, En, Rw, Rs, d4, d5, d6, d7);
}

Este es el código que uso para mis pantallas con I2C. Solo tienes que modificar la dirección del LCD;

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

#define I2C_ADDR  0x27
#define BACKLIGHT_PIN  3
#define ENABLE  2
#define RW  1
#define RS  0
#define DATA4  4
#define DATA5  5
#define DATA6  6
#define DATA7  7


LiquidCrystal_I2C lcd(I2C_ADDR, ENABLE, RW, RS, DATA4, DATA5, DATA6, DATA7);


 ////////////////////////  SETUP ///////////////////////////////////////////

void setup() {
        lcd.begin(20, 4);
        lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
        lcd.setBacklight(HIGH);
}



////////////////////////   LOOP   /////////////////////////////////////////

void loop(){  }

No sé donde está la confusion, pero la hay.
La libreria <LiquidCrystal_I2C> maneja el LCD con el módulo serie incorporado (conexion I2C) con su direccion correspondiente (I2C_ADDR)

Por lo tanto intentar definir nuestra instancia con:

LiquidCrystal_I2C lcd(I2C_ADDR,2, 1, 0, 4, 5, 6, 7);   // <<=== Error en parametros

Nos dará error de compilacion.

Por otro lado estas definiciones no proceden:

#define I2C_ADDR  0x27
#define BACKLIGHT_PIN  3
#define ENABLE  2   // Esto solo vale para LCD acceso 4 bit paralelo
#define RW  1       // idem
#define RS  0        // idem
#define DATA4  4   // idem
#define DATA5  5   // idem
#define DATA6  6   // idem
#define DATA7  7   // idem

Esto seria lo correcto:

LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);   // <<=== Esto seria lo correcto para un display 16x02

@AntonioMB, prueba esta modificacion a tu sketch:

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

#define I2C_ADDR    0x27

LiquidCrystal_I2C lcd(I2C_ADDR,16, 2);   // Instanciamos un display 16x02
void setup()
   {
       lcd.begin();    // Inicializar el display
       lcd.backlight();   // Enciende el backlight
//       lcd.noBacklight();   // Apaga el backlight
       lcd.home();                   // go home
       lcd.print("Prometec.net");
       lcd.setCursor(0,1);    // Situa el cursor
       lcd.print("Malpartida lib");
   }
void loop() {}

y comentanos que pasa.

Estoy de acuerdo contigo lightcalamar.
Yo uso la misma definición, incluso no necesito indicar la dirección, salvo que use 2.

Gracias a todos por vuestras ayudas.

Alphaville, pruebo con tu modificación y me aparece el siguiente error:

 lcd.begin();    // Inicializar el display

En esa linea me da el error, que es:

no matching function for call to 'LiquidCrystal_I2C::begin()'
#include <LiquidCrystal_I2C.h>

Por favor dinos que libreria estas usando?

La librería es LiquidCrystal Adafruit. Ver 1.0.5

Entonces corre esto y cambia lo que tienes por esta versión LiquidCrystal Adafruit
y luego prueba este ejemplo

/*
 Demonstration sketch for Adafruit i2c/SPI LCD backpack
 using MCP23008 I2C expander
 ( http://www.ladyada.net/products/i2cspilcdbackpack/index.html )
 This sketch prints "Hello World!" to the LCD
 and shows the time.
 
  The circuit:
 * 5V to Arduino 5V pin
 * GND to Arduino GND pin
 * CLK to Analog #5
 * DAT to Analog #4
*/

// include the library code:
#include "Wire.h"
#include "Adafruit_LiquidCrystal.h"

// Connect via i2c, default address #0 (A0-A2 not jumpered)
Adafruit_LiquidCrystal lcd(0);

void setup() {
  // set up the LCD's number of rows and columns: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);

  lcd.setBacklight(HIGH);
  delay(500);
  lcd.setBacklight(LOW);
  delay(500);
}

Asi debiste comenzar tu hilo, no diciendo que tienes una librería LiquidCrystal_I2C y un modulo I2C sin dar explicaciones de donde sacaste cada cosa.

Si esto no funciona tienes un problema en tu módulo.
Es Tu librería y ejemplo para I2C de tu librería.

@AntonioMB

Suscribo el comentario de surbyte. Si en lugar de poner un sketch con la libreria que NO tienes hubieses puesto la que tienes en realidad, todo habria sido mas facil.

Esas cosas pasan.

Como comentas arriba que tu pantalla es 20*4 deberias cambiar esta linea en el setup():

lcd.begin(16, 2);

por

lcd.begin(20,4);

Ok, gracias. Parece que funciona con lo que me habéis reportado.

Perdonar mis torpezas!