Avrei bisogno di un consiglio/suggerimento su un determinato problema che vi esporrò qui di seguito.
Posto un rapido codice esplicativo che andrò a commentare dopo:
if (A>B) {
do {
azione1
} while (non sono passati 300ms da quando azione1 è iniziata);
}
Avrei bisogno di fare azione1 per 300ms se A>B, ma allo stesso tempo non posso rimanere fermo nel do/while perchè devo fare altri controlli nel loop durante questi 300ms in cui azione1 viene eseguita. Ho provato a sbatterci la testa utilizzando millis() (che penso sia la soluzione da mettere in pratica), ma non sono riuscito a saltarci fuori.
Bisognerebbe sapere che cos'è azione1. Se devi fare ininterrottamente azione1 per 300ms, evidentemente non puoi fare altro! Molto probabilmente, però, questa fantomatica e segretissima azione1 non è necessario che sia veramente continua... Comunque, non devi usare un while se non puoi restarci chiuso dentro!
Vuoi accendere un LED quando A diventa maggiore di B e spegnerlo dopo 300ms? Allora l'azione non è continua, ma sono due azioni brevissime distanziate di 300ms. Usa millis().
Vuoi far suonare un cicalino passivo? Allora usa tone(pin, freq, 300);
azione1 è un parte di programma che deve essere eseguita a ogni giro di loop? Allora usa millis(), prendendo il tempo t_AmagB nell'istante in cui A diventa maggiore di B ed esegui la funzione azione1() finché è vero millis()-t_AmagB<300.
No naturalmente questa segretissima azione1 era stata omessa solamente per questione di praticità e chiarezza, che ha poi creato l'effetto opposto. Praticamente l'azione1 non è altro con il pilotaggio di un ponte H per un motore in un verso ed ad una determinata velocità, questo per 300ms. Dopodiché deve continuare in altro verso ad altra velocità per altro tempo X. Tutto questo mentre continuo indisturbato il loop per procedere con altri controlli. Spero di essere stato leggermente più chiaro ora!
Ti scoccierebbe molto spiegarmela? Perché non mi piace tanto l'idea di copiarlo ed incollarlo così spudoratamente (potrebbe servirmi in altre applicazioni e non lo saprei applicare...). Dunque a me serve che se la prima condizione è vera, l'azione1 deve essere fatta per 300ms,il tutto mentre altri controlli non deve essere interrotti. Quindi tu mi dici di segnarmi millis() in una variabile Y non appena diventa vera la prima condizione e da lì fare azione1 fin che millis()-Y <300. Ora non capisco proprio concettualmente come mettere in codice quel "fin che" Millis.....
Ricollegandomi alla tua terza "opzione" è in parte vero quello che vorrei fare, perché azione1 non deve esser fatta ogni volta che gira il loop, ma ogni volta che gira il loop e la condizione iniziale è verificata
if(A<=B) {t_AmagB=millis();}
Finché A<=B, aggiorna continuamente t_AmagB con il tempo corrente.
else if(millis()-t_AmagB<300) {azione1();}
Se A>B, chiama azione1() a ogni passaggio se il tempo trascorso da quando A è divenuto maggiore di B è minore di 300ms.