E qualche mese che uso Arduino e mi sono imbattuto in un problema nella programmazione di un progetto.
Sostanzialmente voglio che due "programmi" differenti siano eseguiti contemporaneamente senza interferenze per il delay().
Ho provato a usare la funzione millis() come anche la libreria Metro, però sono ugualmente a un punto fermo.
Il programma è strutturato così:
serie di comandi a dei led
serie di comandi a un motore.
Per non creare interferenza, la linea che seguirei è di verificare a ogni ciclo quanto è il tempo con millis(), e far eseguire alcune istruzioni piuttosto che altre con IF.
Il problema sorge dal fatto che i comandi ai led sono molti; sono quasi 5 cicli di for con all'interno una ventina di comandi ciascuno.
Sarebbe molto comodo usare la funzione Switch, che però non è possibile utilizzare per dei range di valori.
Come posso fare senza mettere una clausola del tipo if( valore x < millis() < valore y ) per ogni comando ai led che voglio mandare? e senza ovviamente usare i delay che mi impedirebbero il multitasking?
(i comandi ai led in tutto penso siano un centinaio. Sarebbe una sorta di effetto visivo di sottofondo a una canzone, e quindi è molto modulato.)
Non puoi usare for. devi usare if e ++
Non ti resta nient altro che programmare con millis e modificare la logica dei sketch.
Dacci i 2 sketch.
Ciao Uwe
Sull'Arduino non esiste un sistema operativo che condivide la CPU tra più programmi. Anzi, non esiste neanche il concetto di più programmi. C'è solo un programma, il tuo sketch, che gira in loop infinito.
Se devi programmare dei compiti ad intervalli scadenzati, devi usare la funzione millis() come metronomo per verificare quando eseguire questi compiti.
Questo mio articolo spiega come usare millis per fare ciò.
Ho scritto anche Looper, che non è proprio un sistema multitasking ma è comunque un semplice scheduler basato su millis che permette di eseguire in modo semplice dei compiti ad intervalli regolari senza disturbare il resto delle funzioni del chip.
Se le cose che vuoi far fare a i diversi led possono essere parametrizzate, allora puoi pensare di creare una funzione, che in base ai parametri che ci passi si comporti nel modo voluto.
I parametri per ogni led li puoi salvare in una struttura dati con struct o class (es.LedPar) e poi
creare un array di struct LedPar di n elementi tanti quanti sono i led.
In ciclo leggerai un elemento dell'array e lo passerai come parametro alla funzione, questa legge
i parametri da dentro la struct e in base a questi si comporterà.
Non è semplice, specie per un principiante e per di più se si può fare come detto dipende dall'applicazione finale.