Retroilluminazione LCD che fà la pazza

Buongiorno,
ho riadattato questo codice, preso da Dea1993, per accendere o spegnere con un pulsante la retroilluminazione di un display LCD YxRobot.
il codice è questo:

#include <Wire.h>                                    //dichiarazione librerie lcd
#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>                      //dichiarazione librerie lcd
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);   
void setup() {
  // Devo inizializzare il display LCD 20 caratteri per 4 linee
  lcd.begin(20,2); 
  // Pulisce l'LCD e pone il cursore all'inizio
  lcd.setCursor(0, 1);
  
  lcd.clear(); 
pinMode(8,OUTPUT); // uscita relè  
pinMode(7,INPUT);  // entrata segnale bottone
pinMode(9,OUTPUT); // cicalino
pinMode(A0,INPUT); // ingresso sensore umidità
pinMode(6,OUTPUT); // led pompa
pinMode(5,OUTPUT); // led ok
pinMode(4,OUTPUT); // led funzionamento
Serial.begin(9600);
}
int valore = 0;  //da qui accende o spegne la luce dell'lcd
int stato = 0;
int luce = 0;
void loop()
{
 lcd.noBacklight(); 
 valore = digitalRead(7); 
  //se si preme il pulsante e la luce è spenta, stato diventa 1
  if ((valore == HIGH)&&(luce == 0)) {
    stato = 1;
    delay(250);  //introduco un ritardo per risolvere il problema del rimbalzo del segnale
  }
   //se si preme il pulsante e la luce è accesa, stato diventa 0
  if ((valore == HIGH)&&(luce == 1)) {
    stato = 0;
    delay(250);  //introduco un ritardo per risolvere il problema del rimbalzo del segnale
  }
  if (stato == 1) {
    luce = 1;
    valore = 0;
    //digitalWrite(LED, HIGH);     //accende il LED
    lcd.backlight();
  }
  
  else {
    luce = 0;
    valore = 0;
    //digitalWrite(LED, LOW);     //spegne il LED
    lcd.noBacklight();
  }                                                                //fin a qui accende o spegne la luce dell'lcd
lcd.print("Lett sens: ");
lcd.print(analogRead(A0));
lcd.setCursor(0,1);
int perc;
int lett=analogRead(A0);
perc=(lett/100)*10;
lcd.print("Perc sens: ");
lcd.print(perc);
lcd.print(" %");
delay(1000);
lcd.clear();
 /*if ( lett < 400 )
  {
    digitalWrite(8,HIGH);
    lcd.clear();
    lcd.print("Avvio pompa");
    //digitalWrite(9,HIGH);
    lcd.setCursor(0,1);
    lcd.print(perc);
    lcd.print(" %");
    delay(10);
    lcd.clear();
  }*/

il problema adesso è che la retro illuminazione mi lampeggia lentamente un paio di volte e poi rimane tutto acceso… con la prima compilazione funzionava tutto bene…
voi più esperti vedete errori nel codice?
grazie in anticipo

codice LCD.txt (2.28 KB)

È un modo errato di programmare. All inizio loop spegni la retroilluminazione per poi accennderla in un secondo momento o dopo 250mS. Se tieni il pulsante premuto la retroilluminazione lampeggia. Stesso problema per scrivere sul display. Lo cancelli e poi dopo un po di tempo scrivi la temperatura. Evita di cancellarlo con lcd.clear(); ma posiziona il cursore e scrivi il valore letto al limite devi aggiungere qualche spazio per cancellare tutte li caratteri della precedente visualizzazione.

int lett=analogRead(A0);
perc=(lett/100)*10;

Non calcola precisamente la percentuale. Devi dividere il valore letto per 1023.0 e moltiplicarlo per 10.

Per la funzione corretta del pulsante vedi https://www.arduino.cc/en/Tutorial/Switch http://www.instructables.com/id/Beginner-Arduino/step15/Button-As-Toggle-Switch/

Ciao Uwe

grazie mille proverò cosí