Ciao a tutti.
Modificando il mio contatore Geiger di qualche anno fa mi è sorta una curiosità che è per lo più concettuale...
Premessa:
Giorni fa ho notato che se spegnevo la retroilluminazione (lo stato viene salvato in EEPROM!) e poi mi trovavo in un luogo buio non avevo più modo di fare nulla, neanche ripristinare la retroilluminazione! Ho risolto il problema accendendo la retroilluminazione quando entro nel menu, ma con una variabile devo memorizzarne lo stato precedente.
Il menu è una funzione bloccante (lo feci così, funziona e non ho intenzione di metterci le mani!
), in cui l'esecuzione del programma rimane riservata alle impostazioni.
Se rilevo una pressione prolungata dell'encoder dichiaro una variabile per memorizzare lo stato della retroilluminazione, poi vene eseguito il menu e quando riesce imposta nuovamente la retroilluminazione così come era in precedenza. A questo punto la variabile non è più necessaria fino al prossimo giro di loop: posso rimuoverla?
Non so se questa domanda abbia senso, oppure mi è nata solo perché sto usando una variabile locale in maniera sbagliata...
L'IDE, da parte sua, rileva qualcosa di incomprensibile...
C:\Users\giobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino\main.cpp: In function 'main':
E:\Documenti\@ ELETTRONICA\Arduino\@ 4 Contatore Geiger OK R\GEIGERINO_v1.14e\d_Loop_prImpRad_portate.ino:21:29: warning: 'stato_retroill' may be used uninitialized in this function [-Wmaybe-uninitialized]
if (LCD==2) digitalWrite(A0, stato_retroill); // SE LCD è in modo On/Off, ripristina lo stato precedente.
^
E:\Documenti\@ ELETTRONICA\Arduino\@ 4 Contatore Geiger OK R\GEIGERINO_v1.14e\d_Loop_prImpRad_portate.ino:9:13: note: 'stato_retroill' was declared here
uint8_t stato_retroill;
^
Grazie
Gianluca
Allego la parte del codice:
void loop()
{ // PIND&0x20)>>5 è come dire digitalRead(5).
P=(PIND&0x20)>>5; // Legge il pulsante dell'encoder (0=Premuto)
if(Po==1 && P==0) {t1=millis(); Po=0;} // Quando viene premuto il pulsante legge il tempo
if(Po==0 && P==0) // Se era ed è premuto per almeno 1 secondo
{ // salta a Menu, poi ritorna ed esce.
if(millis()-t1>999) //
{
uint8_t stato_retroill;
if (LCD==2)
{
stato_retroill=digitalRead(A0);
digitalWrite (A0, LOW); // Se LCD==2 (retroilluminazione in modo On/Off), accende la retroilluminazione.
}
Po=1; Bip();
detachInterrupt(0); // Blocca gli interrupt per evitare che si accumulino conteggi
Menu(); // che poi verrebbero divisi per un tempo brevissimo, non essendo
while(!(PIND&0x20)) // stata, nel frattempo, incrementata la variabile tempo.
delay(200);
Mask();
if (LCD==2) digitalWrite(A0, stato_retroill); // SE LCD è in modo On/Off, ripristina lo stato precedente.
attachInterrupt(0,ContaAB,FALLING); return;
}
} // END premuto per almeno 1 secondo
// ... ... ...
} // END loop()
