Función millis() da valores negativos

Hola gente del foro.

Estuve intentando que se mostrara un mensaje en un LCD 16x2. Para ahorrar la energía que este pudiese consumir, quiero que luego de 30 segundos la luz del LCD se apague, pero el mensaje se siga mostrando. Y si yo presiono un pulsador, la luz del LCD se vuelva a encender, y se mantenga encendida por 30 segundos.
Para hacer esto conecte el ánodo de la pantalla LCD a uno de los pines digitales. Entonces la luz del LCD solo se iba a encender si yo le enviaba una señal.

Use la función millis() para que midiese el tiempo desde que comenzó el programa, o desde la última vez que el pulsador fue presionado. Sin embargo cuando corro el programa, luego de los primeros 30 segundos, la pantalla LCD se apaga pero sin que yo presione el pulsador, se vuelve a encender.

Para ver que ocurría hice que imprimiese los valores que estaba utilizando el tiempoLCD (la variable que medía el tiempo desde que la pantalla LCD había sido encendida). Y por alguna razón al restarle 0 a la función millis() me daba un valor negativo.

¿Podrían explicarme por qué ocurre esto? Desde ya muchas gracias.

lcd_y_puls.ino (858 Bytes)

Viendo que sos nuevo/a en el foro te recomiendo leer las reglas del mismo para postear correctamente.
En el png que adjuntaste sólo se ven valores positivos en el monitor serie.

Hola Pablo Lucini. Leí las reglas del foro. Abajo en el monitor serie los valores son negativos. Perdón porque la captura de pantalla saliese así

Moderador:
Creo que no entiendes lo que @Pablo_Lucini te pide y entonces ahora intentaré explicarlo de otro modo para que si lo comprendas.
En este foro los códigos menores a 9k deben verse. El tuyo no se ve. Lo que te pidió acertadamente es que uses etiquetas y postees tu código en el post inicial para ver el código y no tener que descargarlo para responderte. De hecho la mayoría no lo hacemos porque todos respetamos las normas y esta es una de las mas importantes.
Códigos/errores, enlaces con etiquetas y las imágenes deben verse.

Normas

Ahh perdón, no había entendido bien. Gracias por responder. Aquí el código:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

int backlight=9;
int puls=8;

int BotonPresionado=0;

void setup() {

  Serial.begin(9600);

 lcd.begin(16,2);
  
 pinMode(puls,INPUT);
pinMode(backlight,OUTPUT);

}

void loop() {

lcd.setCursor(0,0);
lcd.print("VIERNES");

lcd.setCursor(9,0);
lcd.print("9:30");


int tiempoLCD=millis()-BotonPresionado;

Serial.print("tiempoLCD = ");
Serial.print(millis());
Serial.print(" - ");
Serial.print(BotonPresionado);
Serial.print(" = ");
Serial.println(tiempoLCD);

int lectura=digitalRead(puls);

  if(lectura==HIGH){
    
  digitalWrite(backlight,HIGH);
  BotonPresionado=millis();
  
  
  }
  
  if(tiempoLCD<30000){
       digitalWrite(backlight,HIGH);
   
    }else{
      digitalWrite(backlight,LOW);
    }

    
delay(1000);


}

A simple vista veo que declaraste la variable tiempoLCD como int. Esta variable está basada en millis() y deberías declararla como unsigned long, ya que como int se desborda. En la pagina de Arduino.cc, en "reference" tenés explicados los tipos de variables y los rangos permitidos de cada una.

@Pablo_Lucini me fije donde dijiste y creo que tenes razón, aunque todavía no lo probé. En la página de arduino mencionan que pueden ocurrir errores al intentar hacer cuentas con variables de tipo entera.

Gracias por responder!

Ve a Documentación => Indice de temas tutoriales => millis()
Ahi tienes 4 o 5 tutoriales sobre millis().
No uses nada que no sea unsigned long con millis().

Moderador:
Ten presente que he editado tu post inicial (no fue lo que hiciste).
Las imágenes deben verse.
Los códigos siempre con etiquetas.
No lo olvides!!