Retroilluminazione temporizzata LCD

Salve a tutti,
Ho un problema con uno sketch che non riesco proprio a risolvere. La cosa potrebbe risultarvi banale ma ci sto sbattendo la testa da questa mattina ma non trovo soluzione.

Vi spiego:
Ho un lcd su cui "stampo" data e ora (ore:minuti:secondi), la retro illuminazione è spenta e ho un pulsante che accende la retroilluminazione quando è premuto. Volevo impostare la retroilluminazione in modo che, una volta premuto il pulsante, restasse accesa per 5 secondi.
Ho provato con un delay all'interno dell'if ma ho notato che, nel tempo che la retroilluminazione è accesa, lcd resta frizzato e i secondi non scorrono per poi riprendere quando la retroilluminazione si spegne. (utilizzo un rtc quindi l'orario non viene falsato)

Mi dite come posso fare per far restare la retroilluminazione accesa e i secondi che continuano a scorrere?

Devi a studiarti come si usa la millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

Grazie per la risposta, ho letto quello che mi hai linkato e sono cose che avevo già trovato da me su Internet ma non riesco ad estrapolare una soluzione valida per il mio problema. Qualche altro aiuto?

Se li hai studiati (... e non solo guardati) dovresti aver visto l'esempio BlinkWithoutDelay che ti fa esattamente vedere come fare una certa cosa quando è passato un certo intervallo di tempo, SENZA bloccare il ciclo loop().

Accendi il tuo backlight, ti segni il momento in cui lo hai acceso e passati i 5 secondi lo spegni.

Guglielmo

Concettualmente ho capito come fare ma non riesco a far segnare il momento in cui premo il pulsante. Quando premo il pulsante lo schermo si accende e poi non si spegne più oppure si accende e appena lascio si rispegne...

Metti qui il codice che hai scritto (… mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> … primo a sinistra) utilizzando quello che hai studiato relativo a millis() e vediamo dove sbagli … ::slight_smile:

Ah, al fine di capire bene l’uso … scrivi un programmino MINIMO che legge il pulsante, accende il backlight, lo spegne dopo 5 secondi e … null’altro. Tanto una volta che hai capito come fare questo, lo integri facilmente nel programma più generale.

Guglielmo

Ok, ecco il codice che ho scritto:

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
int  val = 0;
int tempo;
#define rill 8

LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7);

void setup () {
Wire.begin();

lcd.begin(20, 4);
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(LOW);
    
}
void loop(){


val = digitalRead(rill);

if (val == HIGH) { 
    lcd.setBacklight(HIGH);
    tempo = millis();
}
if(millis() - tempo > 5000) {
   lcd.setBacklight(LOW);
   tempo = millis();
}  
}

Con questo codice la cosa sembra funzionare ma dopo 4/5 volte che faccio fare l’operazione (cioè premo il pulsante, si accende la retroilluminazione, passano 5 secondi e poi si spegne) fa uno strano scherzetto, inizia a non funzionare più, cioè inizia ad accendersi solo mentre tengo premuto il pulsante.
C’è qualcosa che non va nel codice?

Però, se nella IF riassegni "tempo = millis();" ... riattivi il ciclo, mentre tu lo devi verificare solo se si preme il pulsante :wink:

Quindi, togli solo quel "tempo = millis();" dentro l'IF in cui verifichi il passare del tempo e ... dovrebbe andare.

Guglielmo

Ma da quello che ho letto, quella stringa dovrebbe azzerare il contatore...forse ho solo inteso male le varie pagine trovate in internet

Ho modificato come dicevi e l'ho integrato nel programma generale, il problema sussiste ancora, ti dirò di più quando inizia a fare quello scherzetto, se mantengo premuto il pulsante, l'lcd inizia a lampeggiare come se ci fosse un continuo refresh e anche le scritte lampeggiano

Ma sopratutto correggi il tipo di variabile

int tempo;

La millis() è una unsigned long

Cortesemente mi diresti di preciso come devo definirla?

unsigned long tempo;

La funzione millis() ti ritorna un numero a 32 bit, non a 16 !!!

Guglielmo

NelloCrescenzo:
Cortesemente mi diresti di preciso come devo definirla?

long tempo

ExperimentUno:

long tempo

Sbagliato !!!

unsigned long tempo;

... come ho già scritto! :smiling_imp:

Guglielmo

Hai ragione, a parte 2 scusanti
A) OP parla di 5 minuti. Ci sarebbero errori di casting ?
B) non hai usato il tag </> del codice :slight_smile:

A) ... il problema è che se insegni una cosa sbagliata, poi l'utente la usa sempre in modo sbagliato perché così ha imparato. Quindi, NON esiste il caso particolare, esiste SOLO la regola ed il "tipo" ritornato da millis().

B) ... :smiley: :smiley: :smiley: ... si chiama ottimizzazione dello spazio e verifica degli emoticons ...

... ottimizzazione dello spazio perché una riga senza tag occupa meno di una con i tag, verifica degli emoticons perché io comunque RILEGGO sempre i miei post e, se ci fosse stato un problema, avrei sicuramente, nonostante una sola riga, usato i tag.
Per problema degli emoticons intendo ... a = (b * 8 ); ... scritto così NON da problema perché ho messo uno spazio tra il 8 e la parentesi, ma se scrivo senza ... ecco il risultato: a = (b * 8); ... che si commenta da solo!

Guglielmo