Recupero tempo millis()

Ciao ragazzi vi spiego il problema che mi affligge da un pò di giorni,

sto realizzando un progetto che tramite un orologio (software) avvia un motore che pilota una coclea (tempo di funzionamento 15 secondi); ora questa coclea a volte si blocca, quindi per risolvere il problema ho aggiunto un amperometro che rileva l'aumento di corrente e quindi lo stallo del motore, quando succede fermo il motore e lo faccio girare nel senso opposto, per poi ritornare alla marcia normale.

Il problema e che il tempo di funzionamento reale in marcia avanti non è mai di 15 secondi se si verifica uno stallo perchè la funzione millis() non ferma il suo "contare".

Avevo pensato quando si verifica lo stallo di sottrarre a millis un tempo:
currentMillis = millis() - 2000;
ma non viene recepito

sicuramente sbaglio qualcosa, avete suggerimenti?

Mica si capisce quello che vuoi fare ...
... millis() è un orologio (... e come tale la devi considerare) e quindi è ovvio che non si ferma mai.

Prova a mettere il codice che stai usando (... mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra) e, ripeto, spiega bene cosa il programma deve fare.

Guglielmo

Probabilmente usi un algoritmo, una soluzione al problema non corretta. Dovresti usare millis() per contare i secondi e non per vedere se sono passati 15 secondi. Se io conto secondo per secondo e entro in una funzione che svolge un compito, il conteggio dei secondi si arresta. Se invece uso millis() per vedere se sono passati 15 secondi, svolgendo un altro compito il tempo non cessa di trascorrere, e quindi ti ritrovi i 15 secondi siano passati.

Secondo me tu fai qualcosa del genere

if(millis()-currentMillis >=15000){

     currentMillis=millis();

}

Dovresti invece crearti un contatore di secondi, e usare i secondi nei confronti

int avvio=0;
int secondi = 0;
unsigned long tempo=0;

void setup()
{
  
}

void loop(){

    if(millis()-tempo>=1000){

         secondi++;
         tempo=millis();
    }

    if(secondi<=15 &&  avvio==1){

         //ACCENDI

    }else{

         secondi=0;
         avvio=0;
         //SPEGNI

    }
  
}

... in ogni caso ricordo che la millis() è piuttosto imprecisa sui tempi lunghi (ore, giorni, ecc.), per cui, se NON si ha necessità di precisione nella ripetizione di certe operazioni, va benissimo, ma se è richiesta una certa precisione ... l'uso di un RTC diventa fondamentale :wink:

Guglielmo