Display LCD 20x4 con LiquidCrystal_I2C

Display LCD 20x4

Conexiones:
SDA al pin A4
SDL al pin A5

En la carpeta de librerias, solo tengo esta referente a la pantalla LCD 20x4.

El caso es que con este codigo al introducir en el monitor serial un texto me lo muestra en la pantalla.
(los dos ultimos caracteres salen solos, no se porque).

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

LiquidCrystal_I2C lcd(0x27,20,4);  // LCD 0x27 

void setup()
{
  lcd.init();                      // iniciamos LCD 
  lcd.backlight();
  Serial.begin(9600);
}

void loop()
{
      if (Serial.available()) {
        delay(100);
        lcd.clear();
        while (Serial.available() > 0) {
        lcd.write(Serial.read());
}

Después pruebo este otro codigo, y solo me sale la primera letra, porque?

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

LiquidCrystal_I2C lcd(0x27,20,4);  // LCD 0x27 

void setup()
{
  lcd.init();                      // iniciamos LCD
  lcd.backlight();
  Serial.begin(9600);
}

void loop()
{
   lcd.clear();
   lcd.print("Hola Mundo!");
}

Entiendo que la pantalla esta bien configurada, tema libreria y conexiones, entonces
que es lo que hago mal?

El primer caso, supongo que tiene que ver con que tal vez por el monitor serie están llegando dos caracteres extra del salto de línea (CR y LF). Deberías hacer un filtrado previo para descartar los caracteres no deseados; por ejemplo, que el carácter recibido sea mayor a... (revisar tabla ASCII).
En cuanto al segundo caso, entiendo que tal vez el conexionado esté distorsionando la señal y cuando se envían los caracteres seguidos "se pierda", o sencillamente que requiera una pequeña pausa entre caracteres.

gracias, por la ayuda.

Que rompecabezas, hacia un par de semanas habia hecho un codigo para mostrar la temperatura y habia funcionado y hoy he querido practicar otro codigo y me ha dado la lata.

Al final, lo he resuelto buscando por internet si esta libreria tenia alguna actualización reciente y ha dado la casualidad de que si.

La he actualizado y problema resuelto.

En el segundo caso, usas un lcd.clear() y seguramente no alcanzas a ver nada por la velocidad con la que se borra y presenta. has esto.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);  // LCD 0x27 

void setup() {
  lcd.init();                      // iniciamos LCD
  lcd.backlight();
  Serial.begin(9600);
  lcd.clear();
  lcd.print("Hola Mundo!");
}

void loop()
{
}

Que librería requiere lcd.init() vaya cosa rara. Yo uso www.fmalpartida.com que soporta todo los tipos de interfaces de LCD y no usa eso.

Como solo quieres mostrar un Hola Mundo!, te lo puse en el setup y se verá bien.
Si lo quieres en el loop y que se vea usa esto

void loop() {
  lcd.clear();
  lcd.print("Hola Mundo!");
  delay(2000);              // pausa para ver el cartel en el LCD de 2 seg = 2000 mseg
}