Conversione da Delay a Millis ,non è equivalente..

Ciao,in un pezzo di codice che ho utilizzato inizialmente la funzione delay,è tutto funziona correttamente,quando l'ho sostituita col millis non funziona correttamente,non capisco..help help..

Pezzo di codice Originale :

//
// Rotazione delle Colonne [ 1,2 ] in funzione On / Off
//

switch(colonne) {

//
// Colonna Numero [1] 
//

case 1:
if(valore >= 10) {
	digitalWrite(colonna1, VCC_ON);
	break;
}
else
{
	digitalWrite(colonna1, VCC_OFF);
	break;
}

//
// Colonna Numero [2] 
//

case 2:

if(valore >= 1) {
	digitalWrite(colonna2, VCC_ON);
	if(F_pwm == 2){
		delay(10); // Vorrei convertire la funzione Delay in millis in questo punto ??
		break;
	}
	break;
}
else
{
	digitalWrite(colonna2, VCC_OFF);
	break;
}
}

NON esiste di poter "sostituire uno ad uno" ... occorre cambiare la LOGICA del programma !

Un programma con delay() si ferma, con millis() continua la sua esecuzione quindi ... ovviamente NON si "sostituisce", ma si "ripensa" il programma in altro modo.

Come mi pare di aver già detto ... devi studiarti come si usa la millis(), prima QUI, poi QUI ed infine leggere anche QUI e QUI ... dovrebbero chiarirti le idee.

Guglielmo

Puoi, in realtà, sostituire 1/1 delay (intervallo); con una funzione while (millis()-tempo_precedente<intervallo)
{
}
In questo modo, avendo caricato all'inizio del conto su variabile visibile anche li (tipo locale alla loop() tempo_precedente (meglio se unsigned Long) il programma resterà nel while() fino a quando non sarà passato intervallo, restando a fare il vuoto. Successivamente il programma uscirà dalla while() per fare le azioni che avresti messo dopo delay(). É corretto?

giovepluvio:
É corretto?

NO, è del tutto INUTILE ... mi dici che sostituisci a fare delay() com millis() in quel modo ? ? ? :o

Allora lascia la delay() ... che tanto al suo interno fa la stessa cosa ...
... se si usa la millis() è perché il programma va rivisto per NON bloccarsi e fare altre cose mentre il tempo passa e, allo scadere del tempo fissato, fare quello che si deve fare. Magari sarà il caso che anche tu ti dai una letta hai link che ho messo sopra ... ::slight_smile:

Guglielmo

Lo so che non sono equivalenti, adesso fanno la stessa cosa in questo modo. Non so cosa ci vada messo li, dipende dal programma. La domanda era, se ho capito bene, "Posso sostituire delay() a millis()?"
La risposta é "si, in questo modo fanno la stessa cosa". Poi in quel while {} ci puoi mettere quello che vuoi. Io non so cosa ci voglia mettere

giovepluvio:
... Poi in quel while {} ci puoi mettere quello che vuoi. Io non so cosa ci voglia mettere

Questa frase fa capire che non ti è chiaro l'uso di millis() come meccanismo di scheduling da usare ogni volta che DOPO un certo tempo, si debba fare una determinata cosa (delay() introduce un ritrado, quindi fare una cosa DOPO un tempo x, NON durante il tempo x) senza però interrompere il ciclo di loop().

Ripeto che lo studio dei link messi ti sarebbe utile ... ::slight_smile:

Guglielmo

A livello indicativo ... usare millis al posto di delay, dipende da per cosa usavi inizialmente il delay ... se si usa il delay per, ad esempio, aspettare un tot di tempo prima di fare una certa cosa, si puo mettere quella cosa in un'if che controlla se il tempo rispetto a millis e' passato e la esegue solo dopo che e' passato ... se si usava per eseguire una certa cosa per un certo tempo, si fa lo stesso ma iniziandola fuori dall'if e terminandola all'interno dell'if dopo che il tepo e' passato ... o se serve che una certa cosa sia fatta ad intervalli, si fa una funzione che la contiene e si richiama la funzione controllando i tempi nello stesso modo ... e cosi via, ci sono molti modi possibili di usarla, dipendono pero' ovviamente da COSA si vuole fare ed in che modo lo si vuole fare ...

Se invece si usa il delay per fare il debounce, dopo aver guardato l'edizione integrale della "Corazzata Potiomkin" stando in ginocchio sui ceci come punizione (:D), si eliminano i delay e si usano resistenze e condensatori ... :wink:

Etem ... girala come vuoi, SE DEVI usare la millis() al posto di delay() e SOLO perché la delay() ti blocca il programma, mentre con l'uso della millis() il programma può proseguire e fare altre cose.

Sostituire la delay() con un inutile while() che aspetta del tempo è ... semplicemente riscrivere la delay() :smiling_imp:

Guglielmo

Guglielmo, su quello sono daccordo, dicevo solo per dire in che modi si puo usare la millis, e che serve ripensare lo sketch in base alle necessita' ... :wink: