Problema al encender salida un tiempo determinado y solamente una vez

Que tal buen día amigos!

Tengo un selector de pasos con el cual ingreso tiempos diferentes en que debe encender un reactor, y donde la primera posición del mismo significa reactor apagado. Además tengo otro botón, con el cual doy inicio al encendido del reactor, el cual apagará hasta que termine el tiempo fijado por mi selector (como suena un horno de microondas al terminar tiempo de calentamiento).

El problema es que cuando termine el tiempo de encendido del reactor (cuando se apague) debe sonar una chicharra durante un segundo y después permanecer apagada. Otra condición que se debe cumplir para que suene la chicharra igualmente un segundo es al estar encendido el reactor (en cualquier tiempo) y yo manualmente lo apago colocando mi selector en off.

Aquí les dejo mi código el cual lo hice con switch case para que se den una idea y me puedan ayudar ya que lo e intentado de varias maneras y no e podido hacer lo que necesito.

De antemano les agradezco!

const int min = 0;     
const int max = 1023; 
const int reac=7;
const int start=4;
int reacState = LOW;                  
long OnTime = 120000;                     
unsigned long previousMillis = 0; 
int buzzer=9;
int lamp=12;
int vent=3;


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

void loop() 
{
  if(reacState== HIGH)  
 {
 digitalWrite(vent, HIGH);
 }
 else 
 { digitalWrite(vent, LOW);
 }
 digitalWrite(lamp, HIGH); 
 int sensorReading = analogRead(A0);
 int range = map(sensorReading, min, max, 0, 7);
 unsigned long currentMillis = millis();
 switch (range) 
 {
 case 0:                    //Cuando se de caso 0, la alarma debe sonar 1 segundo y apagarse
 reacState=LOW;
 Serial.println("OFF");
 break;

 case 1:           //En los casos 1-7 la alarma debe sonar 1 segundo y apagarse al terminar el conteo
 if((reacState == HIGH) && (currentMillis - previousMillis >= OnTime))  
 {
 reacState = LOW;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState); 
 }
 else if ((reacState == LOW) && digitalRead(start)== HIGH)
 {
 reacState = HIGH;  
 previousMillis = currentMillis;   
 digitalWrite(reac, reacState); 
 }
 Serial.println("TIEMPO 1");
 break;

 case 2:     
 if((reacState == HIGH) && (currentMillis - previousMillis >= (OnTime + 180000)))  
 {
 reacState = LOW; 
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 else if ((reacState == LOW) && digitalRead(start)== HIGH)
 {
 reacState = HIGH;  
 previousMillis = currentMillis;   
 digitalWrite(reac, reacState); 
 }
 Serial.println("TIEMPO 2");
 break;
 
 case 3:   
 if((reacState == HIGH) && (currentMillis - previousMillis >= (OnTime + 480000)))
 {
 reacState = LOW;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 else if ((reacState == LOW) && digitalRead(start)== HIGH)
 {
 reacState = HIGH;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 Serial.println("TIEMPO 3");
 break;
   
 case 4:   
 if((reacState == HIGH) && (currentMillis - previousMillis >= (OnTime + 780000)))
 {
 reacState = LOW;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 else if ((reacState == LOW) && digitalRead(start)== HIGH)
 {
 reacState = HIGH;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 Serial.println("TIEMPO 4");
 break;
   
 case 5:   
 if((reacState == HIGH) && (currentMillis - previousMillis >= (OnTime + 1080000)))
 {
 reacState = LOW;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 else if ((reacState == LOW) && digitalRead(start)== HIGH)
 {
 reacState = HIGH;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 Serial.println("TIEMPO 5");
 break;
   
 case 6:   
 if((reacState == HIGH) && (currentMillis - previousMillis >= (OnTime + 1680000)))
 {
 reacState = LOW;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 else if ((reacState == LOW) && digitalRead(start)== HIGH)
 {
 reacState = HIGH;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 Serial.println("TIEMPO 6");
 break;
   
 case 7:   
 if((reacState == HIGH) && (currentMillis - previousMillis >= (OnTime + 3480000)))
 {
 reacState = LOW;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 else if ((reacState == LOW) && digitalRead(start)== HIGH)
 {
 reacState = HIGH;  
 previousMillis = currentMillis;  
 digitalWrite(reac, reacState);  
 }
 Serial.println("TIEMPO 7");
 break;
 }

 digitalWrite(reac, reacState); 
 delay(100);        
}

Hola, ArmandoAmaros
Creo que te contesté en otro post, aunque en aquél no dabas la información de forma tan entendible; pero creo que igualmente la respuesta te servirá. Básicamente lo que tienes que hacer es detectar cuándo cambia el estado del selector. Para ello no sólo debes leerlo, sino comparar con el último estado, y si ha cambiado comenzar la acción correspondiente.