Cancello scorrevole con relè cambio marcia

Salve ho realizzato un cancello scorrevole che potete vedere nel link nel video - YouTube però non mi piace lo sketch che ho fatto perché usa delay, come sapiamo il delay e un autobloccante in questo caso e anche pericoloso perché ignora anche le sicurezze.
devo usare (millis().
che facile da spiegare ma quando arrivo ad applicarla non ci capisco niente,
qualcuno ha qualche sketch pronto o simile che provo a caricalo su e lo modificarlo alla mio cancello.
forse chiedo troppo :slight_smile:

const int releapri = 13;
const int relechiude = 12;
const int fotocellula = A0;
const int conttato = A1;
const int buttonPin = 2; 
const int buttonPin1 = 4;    
const int micro = 8;         


// variables will change:
int buttonState = 0;  
int buttonState1 = 0;  //
int microState = 0;  

void setup() {
  Serial.begin(9600);

  pinMode(releapri, OUTPUT);
  pinMode(relechiude, OUTPUT);
  pinMode(fotocellula, INPUT);
    pinMode(conttato, INPUT);
  pinMode(buttonPin, INPUT);
   pinMode(buttonPin1, INPUT);
     pinMode(micro, INPUT);
}

void loop() {
  int fotocellulaStatus = analogRead(fotocellula);  
    int conttatoStatus = analogRead(conttato);  
  buttonState = digitalRead(buttonPin);
   buttonState1 = digitalRead(buttonPin1);
    microState = digitalRead(micro);
         
         if ( buttonState == LOW)  {
          digitalWrite(relechiude, LOW);
             digitalWrite(releapri, LOW);
          delay(100); 
digitalWrite(relechiude, HIGH);
    digitalWrite(releapri, LOW);
    Serial.println(micro);
      Serial.println(conttatoStatus);
    }

    
         if ( buttonState1 == LOW)  {
           digitalWrite(relechiude, LOW);
             digitalWrite(releapri, LOW);
          delay(100); 
digitalWrite(relechiude, LOW);
    digitalWrite(releapri, HIGH);}

       if (fotocellulaStatus <= 40)
   {
   
digitalWrite(relechiude, LOW);
delay(5000);
    digitalWrite(releapri, HIGH);
   }
   if (microState == HIGH) {
   if (fotocellulaStatus >= 40)
   
   {
 digitalWrite(relechiude, HIGH);
 
}
     if (conttatoStatus <= 1005)
  
 { digitalWrite(releapri, LOW);
  }  }
  
     

      if ((microState == LOW)&& (conttatoStatus >= 1005))
   {

        digitalWrite(relechiude, LOW);



   

   
   }

    
    
    
    
    }

Hai già provato a studiare bene prima QUI, poi QUI ed infine leggere anche QUI e QUI ?

Guglielmo