ciao a tutti, non mi è chiaro e arduino riesca a eseguire varie funzioni durante il loop, nel senso io ho creato un programma con un lcd touch screen con 2 pulsanti e due if associate che se premo parte il programma all'interno delle if e qua tutto ok, ma se io voglio aggiungere ad esempio sullo schermo un riquadro con un realclock lo dovrei fare che si aggiorna ogni secondo, pero diventerebbe lento nella lettura del pannello, in poche parole se io metto nel loop tutto in fila (if;if;delay(1000) la lettura del pannelo è rallentata, lo so che potrei mettere il delay piu corto ma mettiamo il caso ch devo avere questo delay...
grazie
Non si capisce molto da quello che hai spiegato!
Arduino non può eseguire più funzioni contemporaneamente! Se vengono richiamate più funzioni in sequenza nel loop() eseguirà prima la prima e in successione le altre. Ma non può fare più cose contemporaneamente!
Per questo ci vuole un sistema operativo che permetta il multiprocesso e multithread!
O, semplicemente, basta programmare senza delay() ma basandosi su millis() per le azioni temporizzate. Vedi l'esempio BlinkWithoutDelay.
passo88:
ciao a tutti, non mi è chiaro e arduino riesca a eseguire varie funzioni durante il loop, nel senso io ho creato un programma con un lcd touch screen con 2 pulsanti e due if associate che se premo parte il programma all'interno delle if e qua tutto ok, ma se io voglio aggiungere ad esempio sullo schermo un riquadro con un realclock lo dovrei fare che si aggiorna ogni secondo, pero diventerebbe lento nella lettura del pannello, in poche parole se io metto nel loop tutto in fila (if;if;delay(1000) la lettura del pannelo è rallentata, lo so che potrei mettere il delay piu corto ma mettiamo il caso ch devo avere questo delay...
grazie
Se ho capito quel che intendi, non devi usare delay().
Il delay ferma l'esecuzione di tutto il programma per il tempo che gli dici.
Devi usare la libreria <Time.h>
Questa ti mette a disposizione la funzione millis().
Nei tuoi loop anzichè fermare l'esecuzione decidi cosa fare in base al tempo passato.
Time.h non c'entra niente, millis() è una funzione di Wiring, disponibile di default in Arduino.
>passo88: ... come ti è già stato suggerito, devi studiarti come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che poi ti sarà più chiaro come fare
Guglielmo
P.S.: A tutti gli altri, occhio a dare suggerimenti fuorvianti o errati ... grazie
ok allora avevo capito male la funzione millis() ora me la studio meglio
grazie
gpb01 ho capito male Ma il suo titolo e il suo testo è fuorviante quanto le risposte:) Forse con l'intuito quanto parla di daley e ritardo.
passo88:
se io metto nel loop tutto in fila (if;if;delay(1000) la lettura del pannelo è rallentata, lo so che potrei mettere il delay piu corto ma mettiamo il caso ch devo avere questo delay...
Al posto di un delay(1000) potresti mettere cento delay(10), quando ne hai contati cento sai che "dovrebbe" (*) essere passato un secondo, ma nel frattempo hai fatto cento altre cose (quindi si tratta di strutturare l'elaborazione in più passaggi successivi invece che in un'unica sequenza di istruzioni).
(*) ATTENZIONE: delay genera un ritardo di almeno N millisecondi, ma spesso anche un po' di più soprattutto se si usa per realizzare ritardi periodici. Su questo di più non abbiamo alcun controllo, con errori di parecchi secondi al minuto o maggiori.
Quando riesci a strutturare il programma sotto forma di ritardi lunghi ottenuti tramite innumerevoli ripetizioni di "delay piccoli", allora si può anche smettere di usare il delay e contare il tempo con millis, lasciando girare liberamente il loop principale migliaia o decine di migliaia di volte al secondo.
A quel punto starai programmando a stati e gestendo tutto "contemporaneamente".
Claudio_FF:
A quel punto starai programmando a stati e gestendo tutto "contemporaneamente".
Ottimo articolo! Grazie.