timer doppio con millis

ho bisogno di fare un timer doppio cioe che controlli sia la pausa che il lavoro pero non posso usare delay perché parte di un progetto piu grande, credo di dover utilizzare millis() ma non so come
ho fatto varie prove ma il problema per me è che gli intervalli sono variabili.
un aiuto?

Basta che usi 2 variabili dove memorizzi i millis di partenza e 2 variabili per l’ intervallo.
Per il resto guarda l’ esempio “Blink without delay”.
Ciao Uwe

ho provato ma forse essendo l intervallo variabile mi da un problema avendo collegato un rele è come se andasse in stallo..... ne aperto ne chiuso bho

Qui un articolo in cui spiego come usare millis per programmare compiti basati sullo scorrere del tempo. Tra gli esempi, ne trovi anche uno che esegue 2 compiti a 2 intervalli differenti. Penso possa fare al tuo caso.

si avevo letto ed ho anche installato la libreria leos per fare qualche prova
il problema sta che il timer deve fare questo lavoro:
accendi, per un tot di tempo determinato da un potenziometro o da 2 pulsanti
spegni, per un tot di tempo determinato da un potenziometro o da 2 pulsanti

Allora ti basta un solo timer.
Usa
ton = tempo di accensione
toff = tempo di spegnimento
entrambe unsigned long
ed altre unsigned long
now
previous

Il leOS è uno scheduler che serve per programmare compiti semplici ripetitivi. Quel che vuoi fare si può fare anche con il leOS, volendo. Se apri l'esempio modifyTask vedrai come si può variare la frequenza del lampeggio ad un task in esecuzione.

Tu potresti fare una cosa simile, mettendo nel task un check per vedere se il led viene acceso o spento. A seconda del caso, leggi il valore del potenziometro o poi modifichi l'intervallo per la successiva esecuzione.
Questo è un esempio. Io uso 2 valori numerici ma tu sostituirai quei valori con le lettura dei pin analogici a cui hai collegato i potenziometri.

//include the OS
#include "leOS.h"

leOS myOS; //create a new istance of the class leOS

//variables to control the LED
byte led1Status = 0;
const byte LED1 = 13;

//program setup
void setup() {
    myOS.begin(); //initialize the scheduler
    pinMode(LED1, OUTPUT);
    
    //add the tasks at the scheduler
    myOS.addTask(flashLed1, 10000, IMMEDIATESTART);
}


//main loop
void loop() {
    
}


//flashing task
void flashLed1() {
    led1Status^=1;
    digitalWrite(LED1, led1Status);
    if (led1Status) {
        myOS.modifyTask(flashLed1, 500);
    } else {
        myOS.modifyTask(flashLed1, 5000);
    }
}

ho risolto in un altro modo e se mi riesce posto il codice
A volte la soluzione a un problema si trova quando non ci pensi

La bellezza della programmazione e che non esiste mai un solo modo per risolvere un problema ma infiniti, più o meno efficienti, più o meno ottimizzati.
Col leOS hai però il vantaggio di far partire il task e di scordarti di lui nel codice principale.