REINICIAR MILLIS CADA CAMBIO DE ESTADO

Buen día colegas!

Estoy haciendo un proyecto donde por medio de una perilla de 4 posiciones, pretendo controlar el encendido y tiempo de encendido de una salida la cual llamé "reac". Las condiciones de la perilla son:

1.-Siempre que la perilla esté en posición 1, mi salida reac debe apagarse.

2.-Si la perilla esta en posición 2, la salida "reac" debe encenderse 40 segundos, después apagarse 10 segundos y volver a repetir este ciclo de encendido y apagado permanentemente.

3.-Si la perilla esta en posicion 3, la salida "reac" debe encenderse 50 segundos, después apagarse 10 segundos y volver a repetir este ciclo de encendido y apagado permanentemente.

4.-Si la perilla está en posición 4, la salida "reac" debe encenderse 60 segundos, después apagarse 20 segundos y volver a repetir este ciclo de encendido y apagado permanentemente.

Estas condiciones ya las tengo sin problemas. El problema es que si cambio la perilla, por ejemplo de la posición 2 a la 3 y en ese momento la salida "reac" estaba apagada, al cambiarlo a la 3 sigue apagada mi salida hasta que no termine el tiempo de apagado de la posición anterior y así entre las posiciones 2,3 y 4.
Lo que deseo es que al cambiar la posición la salida se resetién los tiempos para que se encienda de inmediato la salida y se actualize el tiempo de encendido y apagado de la nueva posición. Tengo entendido que con un cambio de estado lo puedo hacer, pero me podrían ayudar a decirme como lo puedo hacer? Ya que es uno de mis primeros proyectos en Arduino.
Gracias!!!

const int min = 0;     
const int max = 1023; 
const int reac=13;
int reacState = LOW;                  
long OnTime = 40000; 
long OffTime= 10000;
unsigned long previousMillis = 0; 

void setup()  {
 pinMode (reac, OUTPUT);
 Serial.begin(9600); 
}
void loop() 
{  
 int sensorReading = analogRead(A0);
 int range = map(sensorReading, min, max, 0, 3);
 unsigned long currentMillis = millis();
 
switch (range) {
case 0:
 reacState=LOW;
 digitalWrite(reac, reacState);
 Serial.println("OFF");
 break;

case 1:  
Serial.println("TIEMPO 1");
 if((reacState == HIGH) && (currentMillis - previousMillis >= OnTime)) {
 reacState = LOW;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState); 
 }
 else if (currentMillis - previousMillis > OffTime )
 {
 reacState = HIGH;  
 previousMillis = currentMillis;   
 digitalWrite(reac, reacState); 
 }
 break;
 
 case 2:  
Serial.println("TIEMPO 2");
if (reacState == LOW) {
  if(currentMillis - previousMillis > OffTime) {
      previousMillis= currentMillis;   
      reacState = HIGH; }
      digitalWrite(reac, reacState);
           
} else {
    if(currentMillis - previousMillis > (OnTime + 10000)) {  
      previousMillis= currentMillis;       
      reacState = LOW;
      digitalWrite(reac, reacState); }     
}
 break;
 
 case 3: 
Serial.println("TIEMPO 3");
if (reacState == LOW) {
  if(currentMillis - previousMillis > OffTime) {
      previousMillis= currentMillis;   
      reacState = HIGH; }
      digitalWrite(reac, reacState);
           
} else {
    if(currentMillis - previousMillis > (OnTme + 20000)) {  
      previousMillis= currentMillis;       
      reacState = LOW;
      digitalWrite(reac, reacState); }     
}
 break;
 
digitalWrite(reac, reacState); 
 delay(100);        
}}

y en lugar de hacerlo como swich case mejor encapsulas tus casos en funciones y el el programa principal solo preguntas con if??? no se algo como esto

void setup(){

if (range == 0) rango0();
if (range == 1) rango1();
if (range == 2) rango2();
if (range == 3) rango3();
if (range == 4) rango4();
}


void rango0(){
reacState=LOW;
 digitalWrite(reac, reacState);
 Serial.println("OFF");
}

void rango1(){
Serial.println("TIEMPO 1");
 if((reacState == HIGH) && (currentMillis - previousMillis >= OnTime)) {
 reacState = LOW; 
 previousMillis = currentMillis; 
 digitalWrite(reac, reacState);
 }
 else if (currentMillis - previousMillis > OffTime )
 {
 reacState = HIGH; 
 previousMillis = currentMillis;   
 digitalWrite(reac, reacState);
 }
}

etc...

algo como eso como siempre, solo es una idea, un pseudo codigo, tendrias que desarrollarlo no esperes que este codigo funcione, pero es la idea jejejeje

creo que al usar la funcion milis de esta manera puedes llevar tus eventos en paralelo y solo hacer mostrar uno cuando lo hagas llamar.

la funcion millis se resetea sola despues 50 dias, osea muchisimo tiempo jajaja
espero te sea de ayuda

Mi versión

#define OFF10  10000
#define OFF20  20000
#define ON40   40000
#define ON50   50000
#define ON60   60000

const int min 	= 0;     
const int max 	= 1023; 
const int reac 	= 13;

int reacState 	= LOW;                  
int range, rangeAnt; 

unsigned long previousMillis = 0; 
unsigned long millis();

void setup()  {
   pinMode (reac, OUTPUT);
   Serial.begin(9600); 
}

void loop() {  

    range = map(analogRead(A0), min, max, 1, 4);
 
	switch (range) {
		case 1: if (range != rangeAnt) {
           			Serial.println("OFF");
    				reacState = LOW;
					digitalWrite(reac, reacState);
				}
				break;

		case 2: tontoff(ON40, OFF10);
				break;
		 
		case 3: tontoff(ON50, OFF10);
				break;
		 
		case 4: tontoff(ON60, OFF20);
				break;   
		}
		rangeAnt = range;
}

void tontoff(long Ton, long Toff){
	if (range != rangeAnt) {
       	reacState = HIGH;
        digitalWrite(reac, reacState);
        previousMillis = millis(); 
        Serial.print("Tiempo ");
        Serial.println(range-1);
    }
    if ((millis() - previousMillis >= Ton)  && reacState == HIGH) {
		reacState = LOW;  
		previousMillis = millis();  
		digitalWrite(reac, reacState);    // Apago luego de 40 seg					 
	}

	if ((millis() - previousMillis >= Toff) && reacState == LOW) {
	 	reacState = HIGH;  
	 	previousMillis = millis();   
	 	digitalWrite(reac, reacState); 
	}
}