leo72:
Non può perché il delay è una funzione che ferma l'esecuzione del codice per il numero di ms specificato. Per funzionare usa leggere i millisecondi da millis, ma questa funzione è basata su un contatore che viene incrementato da un interrupt agganciato all'overflow del timer 0.
Il leOS usa uno schedulatore inserito in un altro timer e viene richiamato all'interno di un interrupt. All'interno di un interrupt, vengono bloccati tutti gli altri interrupt, per cui il delay non funzionerà e la tua funzione congelerà il microcontrollore.
E poi perché devi mettere un'attesa di 1 secondo all'interno di una funzione? Stai usando male il leOS. Spiega cose devi fare che troviamo la soluzione più adatta.
Ok, ora mi è chiaro perchè il delay non funziona.
Cerco di riassumere un po la situzione anche se non ho il codice sotto mano ora.
Nel loop ho due principali funzioni
leggiPulsanti();
navigaMenu();
leggiPulsanti mi restituisce un'intero.
navigaMenu è utilizzata dalla libreria menubeckend.
Navigo senza problemi nel menu, ho utilizzato 4 tasti totali (destra, sinistra, enter ed esc) e riesco tranquillamente ad accedere a menu e sottomenu e, nel caso utilizzare un menu(aumentare/diminuire setting ed altro)...
Il problema ora mi è sorto nel menu chiamato "info".
(Non ho detto che sto utilizzando un display 16x2 gestito tramite liquidcrystal.h)
In questo menu io vorrei che una volta avuto accesso, del testo scorresse, in modo verticale.
Ecco la fonte del problema, il testo che scorre in verticale, io ho pensato di risovlerlo così:
void stampaInfo()
{
char* testo[]={"riga1", "riga2", "riga3", "rirga4"}
for(int i=0; i<4; i++)
{
lcd.setCursor(0,0);
lcd.print(testo[i]);
lcd.setCursor(0,1);
lcd.print(testo[i+1]);
delay(1000); //questo è il delay che mi serve prima che il testo scorra verso sopra
lcd.clear()
}
}
Ora, questo è il codice che viene eseguito se io entro nel menu info, il problema sta proprio nel delay che ferma il codice e non mi permette di poter controllare la pressione eventuale del tasto ESC (che mi permetterebbe di uscire dal menu info e andare al menu principale).
(In realta premendo ripentutamente il tasto ESC alla fine ci riesco anche, ma è poco user friendly xD )
Ho pensato subito a leOS! E le soluzioni (da me pensate all'inzio) erano 2:
Implemento leOS ogni tot ms per leggere i tasti e tolgo quella funzione dal loop(): Sarebbe l'ideale ma siccome per ora la funzione che legge i tasti mi restiutisce un'intero non mi andava di modificarla.
Ho pensato allora di fare il contrario(il mio problema): Al setup inizializzo il tastk di leOS per la stampa del testo e lo metto in pausa(non lo avvio subito).
Quando premo enter per entrare nel menu info attivo il task..
A questo punto lui doveva farmi la funzione con il delay che genere il problema
(nel frattempo la lettura dei pulsanti è sempre attiva)..
..e quindi se premo ESC torno al menu principale e rimetto in pausa il tastk leOS visto che non mi serve..
Da qui il problema, leOS non può fare il delay..
Spero di aver spiegato + o - bene ma purtroppo senza codice davanti è difficile..
Grazie!