LOL, capisco cosa intendi ... no, ho usato p1 (ed altre) perche' essendo associate ai pulsanti, mi richiamano quale pulsante e' (p1 = pulsante 1, ecc) ... le dichiaro globali perche' poi qualsiasi funzione possa usarle (ad esempio nel mio sketch le variabili delle condizioni sono impostate in una funzione void checkpuls() e poi controllano l'esecuzione in altre funzioni diverse, dichiarandole globali non corro il rischio di "perdermele" ... almeno, il mio ragionamento era quello)
Ho modificato il pezzo che ho usato come esempio, comunque, per cercare di renderlo pui comprensibile, e l'ho diviso in due diversi esempi, secondo te e' meglio cosi ?
Esempio uno, codice da eseguire solo una volta, quando il pulsante viene premuto, oppure quando viene rilasciato, oppure due diversi codici da eseguire uno quando il pulsante e' premuto e l'altro quando e' rilasciato, a scelta (premessa: pulsanti con pullup interno abilitato e rete RC)
//variabili globali dichiarate (per poterle usare in qualsiasi funzione)
byte Gbutton1 = 0;
byte Goldbutton1 = 0;
... ecc ...
void setup() ... ecc ...
void loop()
{
Gbutton1 = digitalRead(PinPulsante1); //legge lo stato del pulsante
if ((Gbutton1 != Goldbutton1) && (Goldbutton1 == 0) // il pulsante e' stato premuto (cambio di stato)
{
Goldbutton1 = Gbutton1; //mette Goldbutton1 allo stesso valore di Gbutton1
//nota: se una funzione deve essere eseguita nel momento in cui il pulsante viene premuto,
//ed una volta sola, va messa qui, perche' questa condizione viene eseguita solo una
//volta, quando il pulsante passa da "non premuto" a "premuto"
}
if ((Gbutton1 != Goldbutton1) && (Goldbutton1 == 1) //il pulsante e' stato rilasciato (cambio di stato)
{
Goldbutton1 = Gbutton1; //rimette Goldbutton1 al valore di Gbutton1
//nota: se una funzione deve essere eseguita nel momento in cui il pulsante viene rilasciato,
//ed una volta sola, va messa qui, perche' questa condizione viene eseguita solo una
//volta, quando il pulsante passa da "premuto" a "non premuto"
}
}
Esempio 2, istruzioni diverse, anche all'interno di funzioni indipendenti diverse, da eseguire o meno in base allo stato di una variabile modificata dalla pressione di un pulsante (esempio indicativo, alla variabile condition potrebbero essere assegnati anche valori diversi, cosi da poterla usare per condizionare piu di due sole combinazioni di istruzioni)
//variabili globali dichiarate (per poterle usare in qualsiasi funzione)
byte Gbutton1 = 0;
byte Goldbutton1 = 0;
byte Gcondition = 0;
... ecc ...
void setup() ... ecc ...
void loop ()
{
chechButtons();
funzione1();
funzione2();
}
void checkButtons()
{
Gbutton1 = digitalRead(PinPulsante1); //legge lo stato del pulsante
if ((Gbutton1 != Goldbutton1) && (Goldbutton1 == 0) // il pulsante e' stato premuto (cambio di stato)
{
Goldbutton1 = Gbutton1; //mette Goldbutton1 allo stesso valore di Gbutton1
}
if ((Gbutton1 != Goldbutton1) && (Goldbutton1 == 1) //il pulsante e' stato rilasciato (cambio di stato)
{
Goldbutton1 = Gbutton1; //rimette Goldbutton1 al valore di Gbutton1
if (gcondition == 0) //ciclo che cambia stato alla variabile condition
{
Gcondition = 1;
}
else
{
Gcondition = 0;
}
//nota: questo ciclo if si puo usare sia nel primo ciclo di controllo (se si
//vuole cambiare la variabile alla pressione del tasto) che nel secondo
//ciclo (come qui, per cambiarla al rilascio del tasto)
}
void funzione1()
{
....
//istruzioni da eseguire sempre
....
if (Gcondition == 1) //se gcondition e' uno, esegui anche le istruzioni seguenti, altrimenti no
{
.....
// istruzioni da eseguire solo se Gcondition e' uno
.....
}
}
void funzione2()
{
....
//istruzioni da eseguire sempre
....
if (Gcondition == 0) //se condition e' zero, esegui anche le istruzioni seguenti, altrimenti no
{
.....
// istruzioni da eseguire solo se Gcondition e' zero
.....
}
}
... ecc
Un test pratico comunque al momento non lo posso fare, perche' ho appena riformattato tutto, e sto bestemmiando (in Sanscrito antico, con sottotitoli in Georgiano corsivo :P) per cercare di reinstallare tutti i programmi di lavoro (che regolarmente non vanno mai al primo colpo perche' manca sempre qualche fantomatico driver custom ... maledetto fantasma di murphy, se lo becco lo smaterializzo
XD)