Digitos ilegibles lcd 2004 I2C(solucionado)

Un saludo a todos los foreros.No se si hay precedentes, yo no he logrado encontrar nada al respecto pero tengo un curioso caso con un Lcd 2004 y Arduino Nano, un sketch que llevaba funcionando sin problemas mas de un año pero al volver a cargarlo para cambiar una variable se me ha quedado asi:

Para descartar algún fallo en el Lcd he vuelto a hacer el montaje con otro Lcd igual conectado a un Uno y el error persiste:

Además me he dado cuenta de que curiosamente al llegar a las 20:00 se extiende un digito a la derecha y el 2 apenas es visible:

¿A alguien le había pasado antes? la verdad estoy desconcertado.

Fijate en la línea 1257 del código que ahí está el error.
O puede que no (es que la bola de cristal se me ha descompuesto). :wink:

¡Adjunta el código!

//Avicontrol V 2.1
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
//************************************//

LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS3231 RTC;
Adafruit_BME280 bme;
bool bme_status;
//************Button*****************//
int P1 = 8;   // Button SET MENU'
int P2 = 9;   // Button +
int P3 = 10;  // Button -
int P4 = 11;  // Button exti
//************Variables**************//
int hora;
int minutos;
int anio;
int mes;
int day;
int menu = 0;
#define deshumi 2  //Rele deshumidificador pin 2
#define Led 6      // salida PWM mosfet pin 6
int inicio = 8;
int fin = 20;
int hob = 50;   //Humedad objetivo en %
int his = 3;    //Histeresis humedad
const int Ldr = A0;  //Ldr a pin analogico 0
int VLdr;

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2, 1);
  lcd.print("AVICONTROL V 2.1");
  lcd.setCursor(6, 2);
  lcd.print("Iniciando");
  delay(3000);
  lcd.clear();
  pinMode(deshumi, OUTPUT);
  pinMode(P1, INPUT_PULLUP);
  pinMode(P2, INPUT_PULLUP);
  pinMode(P3, INPUT_PULLUP);
  pinMode(P4, INPUT_PULLUP);
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  bme_status = bme.begin(0x76);
  if (!bme_status) {
    Serial.println("Could not find a valid bme sensor, check wiring!");
  }

  //RTC.adjust(DateTime(__DATE__, __TIME__));
}

char _buffer[7];

void loop() {
  VLdr = analogRead(Ldr);
  int Humi = bme.readHumidity() * 10;  // read humidity
  int t = bme.readTemperature() * 10;
  if (Humi > hob + his) {
    digitalWrite(deshumi, LOW);

    lcd.setCursor(18, 2);
    lcd.print("ON");
  }

  else if (Humi < hob - his) {
    digitalWrite(deshumi, HIGH);

    lcd.setCursor(18, 2);
    lcd.print("OF");
  }
  // check if you press the SET button and increase the menu index

  if (digitalRead(P1) == LOW) {
    menu = menu + 1;
  }
  if (digitalRead(P4) == LOW) {
    StoreAgg();
    delay(500);
    menu = 0;
  }
  // in which subroutine should we go?
  if (menu == 0) {
    DisplayDateTime();  // void DisplayDateTime
  }
  if (menu == 1) {
    DisplaySetHour();
  }
  if (menu == 2) {
    DisplaySetMinute();
  }
  if (menu == 3) {
    DisplaySetinicio();
  }
  if (menu == 4) {
    DisplaySetfin();
  }
  if (menu == 5) {
    DisplaySethob();
  }
  if (menu == 6) {
    StoreAgg();
    delay(500);
    menu = 0;
  }
  if (hora > fin || hora < inicio) {
    noche();
  } else if (hora == fin) {
    anochecer();
  } else if (hora > inicio) {
    dia();
  } else if (hora == inicio)
    amanecer();
}

void DisplayDateTime() {
  DateTime now = RTC.now();
  lcd.setCursor(0, 1);
  lcd.print("Temperatura:");
  lcd.setCursor(0, 2);
  lcd.print("Humedad:");
  lcd.setCursor(0, 3);
  lcd.print("Fase:");
  lcd.setCursor(12, 2);
  lcd.print("Dehum:");
  lcd.setCursor(11, 3);
  lcd.print("Leds:");
  int Humi = bme.readHumidity() * 10;  // read humidity
  int t = bme.readTemperature() * 10;
  if (t < 0)  // if temperature < 0
    sprintf(_buffer, "-%02u.%1u", (abs(t) / 10) % 100, abs(t) % 10);
  else  // temperature >= 0
    sprintf(_buffer, " %02u.%1u", (t / 10) % 100, t % 10);
  lcd.setCursor(12, 1);
  lcd.print(_buffer);
  //lcd.write("º");
  lcd.print((char)223);
  lcd.print("C");

  // print humidity (in %)

  sprintf(_buffer, "%02u%%", (Humi / 10) % 100, Humi % 10);
  lcd.setCursor(8, 2);
  lcd.print(_buffer);


  lcd.setCursor(0, 0);

  if (now.hour() <= 9) {
    lcd.print("0");
  }
  lcd.print(now.hour(), DEC);
  hora = now.hour();
  lcd.print(":");
  if (now.minute() <= 9) {
    lcd.print("0");
  }
  lcd.print(now.minute(), DEC);
  minutos = now.minute();
  lcd.print(":");
  if (now.second() <= 9) {
    lcd.print("0");
  }
  lcd.print(now.second(), DEC);

  lcd.setCursor(10, 0);

  if (now.day() <= 9) {
    lcd.print("0");
  }
  lcd.print(now.day(), DEC);
  day = now.day();
  lcd.print("/");
  if (now.month() <= 9) {
    lcd.print("0");
  }
  lcd.print(now.month(), DEC);
  mes = now.month();
  lcd.print("/");
  lcd.print(now.year(), DEC);
  anio = now.year();
}


void DisplaySetHour() {
  // time setting
  lcd.clear();
  DateTime now = RTC.now();
  if (digitalRead(P2) == LOW) {
    if (hora == 23) {
      hora = 0;
    } else {
      hora = hora + 1;
    }
  }
  if (digitalRead(P3) == LOW) {
    if (hora == 0) {
      hora = 23;
    } else {
      hora = hora - 1;
    }
  }
  lcd.setCursor(3, 0);
  lcd.print("Ajustar hora:");
  lcd.setCursor(9, 1);
  //lcd.blink();
  lcd.print(hora, DEC);
  delay(200);
}

void DisplaySetMinute() {
  // Setting the minutes
  lcd.clear();
  if (digitalRead(P2) == LOW) {
    if (minutos == 59) {
      minutos = 0;
    } else {
      minutos = minutos + 1;
    }
  }
  if (digitalRead(P3) == LOW) {
    if (minutos == 0) {
      minutos = 59;
    } else {
      minutos = minutos - 1;
    }
  }
  lcd.setCursor(2, 0);
  lcd.print("Ajustar minutos:");
  lcd.setCursor(9, 1);
  lcd.print(minutos, DEC);
  delay(200);
}

void DisplaySetinicio() {
  // setting the year
  lcd.clear();
  if (digitalRead(P2) == LOW) {
    inicio = inicio + 1;
  }
  if (digitalRead(P3) == LOW) {
    inicio = inicio - 1;
  }
  lcd.setCursor(3, 0);
  lcd.print("Hora Amanecer:");
  lcd.setCursor(9, 1);
  lcd.print(inicio);
  delay(200);
}

void DisplaySetfin() {

  lcd.clear();
  if (digitalRead(P2) == LOW) {
    if (fin == 23) {
      fin = 0;
    } else {
      fin = fin + 1;
    }
  }
  if (digitalRead(P3) == LOW) {
    if (fin == 0) {
      fin = 23;
    } else {
      fin = fin - 1;
    }
  }
  lcd.setCursor(2, 0);
  lcd.print("Hora Anochecer:");
  lcd.setCursor(9, 1);
  lcd.print(fin);
  delay(200);
}

void DisplaySethob() {

  lcd.clear();
  if (digitalRead(P2) == LOW) {
    hob = hob + 1;
  }

  if (digitalRead(P3) == LOW) {
    hob = hob - 1;
  }

  lcd.setCursor(2, 0);
  lcd.print("Humedad Objetivo:");
  lcd.setCursor(9, 1);
  lcd.print(hob);
  delay(200);
}

void StoreAgg() {
  lcd.clear();
  lcd.setCursor(5, 1);
  lcd.print("GUARDANDO");

  RTC.adjust(DateTime(anio, mes, day, hora, minutos, 0));
  delay(500);
}
void amanecer() {
  int fade = map(minutos, 0, 59, 1, 255);
  analogWrite(Led, fade);

  lcd.setCursor(5, 3);
  lcd.print("Alba ");
  int leds = map(fade, 0, 255, 0, 100);
  lcd.setCursor(16, 3);
  lcd.print(leds);
  lcd.println("\%  ");
}
void dia() {
  if (VLdr > 520) {
    analogWrite(Led, 0);
    lcd.setCursor(16, 3);
    lcd.print(" OF  ");
  } else if (VLdr < 500) {
    lcd.setCursor(16, 3);
    lcd.print("100");
    lcd.println("\%");
    analogWrite(Led, 255);
  }


  lcd.setCursor(5, 3);
  lcd.print(" Dia ");
}

void anochecer() {
  int fade = map(minutos, 0, 59, 255, 0);
  analogWrite(Led, fade);

  lcd.setCursor(5, 3);
  lcd.print("Ocaso");
  int leds = map(fade, 255, 0, 100, 0);
  lcd.setCursor(16, 3);
  lcd.print(leds);
  lcd.println("\%  ");
}


void noche() {

  analogWrite(Led, 0);

  lcd.setCursor(5, 3);
  lcd.print("Noche");
   lcd.setCursor(16, 3);
  lcd.print(" 0 ");
  lcd.println("\%");
}

El codigo como decia lleva funcionando mas de un año y sin ningun problema, solo he cambiado la linea int his = 3; que es la histéresis para el relé del deshumidificador y la tenia en 5 (total 10% y me parecía demasiado), por lo demás esta tal cual.

Muy posiblemente la impresión de algo este tomando mas lugares que la que corresponde y rebalsa (si me permitís el término) por el otro lado.
Hay que ver cual es.

Acá esta el problema

void noche() {

  analogWrite(Led, 0);

  lcd.setCursor(5, 3);
  lcd.print("Noche");
   lcd.setCursor(16, 3);
  lcd.print(" 0 %");  // <----  esto empujaba espacios al comienzo en la linea 0,0
}

Corrige todas las situaciones y quita el

  lcd.setCursor(16, 3);
  lcd.print(" 0 ");
  lcd.println("\%");

esto funciona

 lcd.setCursor(16, 3);
 lcd.print(" 0 %");

puedes ensayarlo aca

Hice unos cambios menores.
Basicamente agregué una librería Libprintf.h que te permite usar float en los sprintf.
Ya verás que se simplifican las cosas.

Que envidia (sana) las cazáis al vuelo.
Menos mal que siempre estais ahi para desburrarnos.
He tenido que pelearme un poco con el spintf de la humedad para quitar en decimal que "baila" bastante, prefería mostrar en su lugar el símbolo de porcentaje y desconocía totalmente la librería.
Infinitas gracias por la atención y por vuestro tiempo.
Adjunto codigo completo por si le puede servir o ayudar a alguien y doy el tema por cerrado.
Gracias.

//Avicontrol V 2.1
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <LibPrintf.h>
//************************************//

LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS3231 RTC;
Adafruit_BME280 bme;
bool bme_status;
//************Button*****************//
int P1 = 8;   // Button SET MENU'
int P2 = 9;   // Button +
int P3 = 10;  // Button -
int P4 = 11;  // Button exti
//************Variables**************//
int hora;
int minutos;
int anio;
int mes;
int day;
int menu = 0;
#define deshumi 2  //Rele deshumidificador pin 2
#define Led 6      // salida PWM mosfet pin 6
int inicio = 8;
int fin = 20;
int hob = 50;   //Humedad objetivo en %
int his = 3;    //Histeresis humedad
const int Ldr = A0;  //Ldr a pin analogico 0
int VLdr;

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2, 1);
  lcd.print("AVICONTROL V 2.2");
  lcd.setCursor(6, 2);
  lcd.print("Iniciando");
   delay(3000);
  lcd.clear();
  pinMode(deshumi, OUTPUT);
  pinMode(P1, INPUT_PULLUP);
  pinMode(P2, INPUT_PULLUP);
  pinMode(P3, INPUT_PULLUP);
  pinMode(P4, INPUT_PULLUP);
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  bme_status = bme.begin(0x76);
  if (!bme_status) {
    Serial.println("Could not find a valid bme sensor, check wiring!");
  }

  //RTC.adjust(DateTime(__DATE__, __TIME__));
}

char _buffer[20];

void loop() {
  VLdr = analogRead(Ldr);
  int Humi = bme.readHumidity() * 10;  // read humidity
  int t = bme.readTemperature() * 10;
  if (Humi > hob + his) {
    digitalWrite(deshumi, LOW);

    lcd.setCursor(18, 2);
    lcd.print("ON");
  }

  else if (Humi < hob - his) {
    digitalWrite(deshumi, HIGH);

    lcd.setCursor(18, 2);
    lcd.print("OF");
  }
  // check if you press the SET button and increase the menu index

  if (digitalRead(P1) == LOW) {
    menu = menu + 1;
  }
  if (digitalRead(P4) == LOW) {
    StoreAgg();
    delay(500);
    menu = 0;
  }
  // in which subroutine should we go?
  if (menu == 0) {
    DisplayDateTime();  // void DisplayDateTime
  }
  if (menu == 1) {
    DisplaySetHour();
  }
  if (menu == 2) {
    DisplaySetMinute();
  }
  if (menu == 3) {
    DisplaySetinicio();
  }
  if (menu == 4) {
    DisplaySetfin();
  }
  if (menu == 5) {
    DisplaySethob();
  }
  if (menu == 6) {
    StoreAgg();
    delay(500);
    menu = 0;
  }
  if (hora > fin || hora < inicio) {
    noche();
  } else if (hora == fin) {
    anochecer();
  } else if (hora > inicio) {
    dia();
  } else if (hora == inicio)
    amanecer();
}

void DisplayDateTime() {
  DateTime now = RTC.now();
  char buffer[20];

  // lcd.setCursor(0, 2);
  // lcd.print("Humedad:");
  lcd.setCursor(0, 3);
  lcd.print("Fase:");
  lcd.setCursor(12, 2);
  lcd.print("Dehum:");
  lcd.setCursor(11, 3);
  lcd.print("Leds:");
  float Humi = bme.readHumidity();  // read humidity
  float t = bme.readTemperature();
  // t = -23.5;
  sprintf(_buffer, "Temperatura:%02.1f%cC", t, char(223));
  lcd.setCursor(0, 1);
  lcd.print(_buffer);

  // print humidity (in %)

  sprintf(_buffer, "Humedad:%02.0f%%", Humi);
  // lcd.setCursor(8, 2);
  lcd.setCursor(0, 2);
  lcd.print(_buffer);

  hora = now.hour();
  minutos = now.minute();
  day = now.day();
  mes = now.month();
  anio = now.year();
  delay(1000);
  lcd.setCursor(0, 0);
  sprintf(buffer, "%02d:%02d:%02d  %02d/%02d/%2d", hora, minutos, now.second(), day, mes, anio);
  lcd.print(buffer);
  delay(1000);
}


void DisplaySetHour() {
  // time setting
  lcd.clear();
  DateTime now = RTC.now();
  if (digitalRead(P2) == LOW) {
    if (hora == 23) {
      hora = 0;
    } else {
      hora = hora + 1;
    }
  }
  if (digitalRead(P3) == LOW) {
    if (hora == 0) {
      hora = 23;
    } else {
      hora = hora - 1;
    }
  }
  lcd.setCursor(3, 0);
  lcd.print("Ajustar hora:");
  lcd.setCursor(9, 1);
  //lcd.blink();
  lcd.print(hora, DEC);
  delay(200);
}

void DisplaySetMinute() {
  // Setting the minutes
  lcd.clear();
  if (digitalRead(P2) == LOW) {
    if (minutos == 59) {
      minutos = 0;
    } else {
      minutos = minutos + 1;
    }
  }
  if (digitalRead(P3) == LOW) {
    if (minutos == 0) {
      minutos = 59;
    } else {
      minutos = minutos - 1;
    }
  }
  lcd.setCursor(2, 0);
  lcd.print("Ajustar minutos:");
  lcd.setCursor(9, 1);
  lcd.print(minutos, DEC);
  delay(200);
}

void DisplaySetinicio() {
  // setting the year
  lcd.clear();
  if (digitalRead(P2) == LOW) {
    inicio = inicio + 1;
  }
  if (digitalRead(P3) == LOW) {
    inicio = inicio - 1;
  }
  lcd.setCursor(3, 0);
  lcd.print("Hora Amanecer:");
  lcd.setCursor(9, 1);
  lcd.print(inicio);
  delay(200);
}

void DisplaySetfin() {

  lcd.clear();
  if (digitalRead(P2) == LOW) {
    if (fin == 23) {
      fin = 0;
    } else {
      fin = fin + 1;
    }
  }
  if (digitalRead(P3) == LOW) {
    if (fin == 0) {
      fin = 23;
    } else {
      fin = fin - 1;
    }
  }
  lcd.setCursor(2, 0);
  lcd.print("Hora Anochecer:");
  lcd.setCursor(9, 1);
  lcd.print(fin);
  delay(200);
}

void DisplaySethob() {

  lcd.clear();
  if (digitalRead(P2) == LOW) {
    hob = hob + 1;
  }

  if (digitalRead(P3) == LOW) {
    hob = hob - 1;
  }

  lcd.setCursor(2, 0);
  lcd.print("Humedad Objetivo:");
  lcd.setCursor(8, 1);
  lcd.print(hob);
    lcd.setCursor(11, 1);
      lcd.print("%");
  delay(200);
}

void StoreAgg() {
  lcd.clear();
  lcd.setCursor(5, 1);
  lcd.print("GUARDANDO");

  RTC.adjust(DateTime(anio, mes, day, hora, minutos, 0));
  delay(500);
}
void amanecer() {
  int fade = map(minutos, 0, 59, 1, 255);
  analogWrite(Led, fade);

  lcd.setCursor(5, 3);
  lcd.print("Alba ");
  int leds = map(fade, 0, 255, 0, 100);
  lcd.setCursor(16, 3);
  lcd.print(leds);
  lcd.println("\%  ");
}
void dia() {
  if (VLdr > 520) {
    analogWrite(Led, 0);
    lcd.setCursor(16, 3);
    lcd.print("OF");
  } else if (VLdr < 500) {
    lcd.setCursor(16, 3);
    lcd.print("100%");
    analogWrite(Led, 255);
  }


  lcd.setCursor(5, 3);
  lcd.print(" Dia ");
}

void anochecer() {
  char buffer[5];
  int fade = map(minutos, 0, 59, 255, 0);
  analogWrite(Led, fade);

  lcd.setCursor(5, 3);
  lcd.print("Ocaso");
  int leds = map(fade, 255, 0, 100, 0);
  lcd.setCursor(16, 3);
  sprintf(buffer,"%3d%%", leds);
  lcd.print(buffer);

}


void noche() {
  char buffer[5];
  analogWrite(Led, 0);

  lcd.setCursor(5, 3);
  lcd.print("Noche");
  lcd.setCursor(16, 3);
  sprintf(buffer,"%3d%%", 0);
  lcd.print(buffer);
}

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