Puerta cerrada con sensor de proximidad

Buen dia comunidad,

Estoy desarrollando un proyecto para una puerta que debe permanecer cerrada. La idea es que después de que el usuario pulsa el botón de abrir, la puerta hace su recorrido de apertura, espera un tiempo y debe comenzar a cerrar. Mientras está cerrando, hay un sensor de proximidad que debe indicar si hay un obstáculo (carro, persona, etc), por lo que debe detenerse el proceso de cierre y esperar a que no haya obstáculo y seguir cerrando.
El indicador de que está cerrada la puerta, tengo la idea de que sería cuando el obstáculo demore más de 10 ciclos y no se retire, ahí se debe entender que la puerta está cerrada.

Elaboré este código (también va adjunto) y le he estado trabajando pero no hace lo que necesito, requiero colocar una condición para cuando hay un obstáculo. Por favor ayuda.

int pinSensor =8;
int pinpuertacerrada =13;
int pinpulsador =12;
int pinpuertabierta =2;
int pinobstaculo =7;
int pincerrando =4;

bool puertabierta;

void cerrarpuerta();

void setup()
{
pinMode(pinSensor,INPUT);
pinMode(pinpuertacerrada,OUTPUT);
pinMode(pinpulsador,INPUT);
pinMode(pinpuertabierta,OUTPUT);
pinMode(pinobstaculo,OUTPUT);
pinMode(pincerrando,OUTPUT);
}

void loop()
{
if (digitalRead(pinpulsador)) {
digitalWrite(pinpuertabierta,HIGH);
digitalWrite(pinpuertacerrada,LOW);
puertabierta=true;
delay(6000);
cerrarpuerta();
}
}

void cerrarpuerta(){
if(puertabierta){
digitalWrite(pinpuertabierta,HIGH);
digitalWrite(pinpuertacerrada,LOW);

for (int i=1; i<=6;i++){
int lectura=digitalRead(pinSensor);
if(lectura==HIGH) {
digitalWrite(pinobstaculo,LOW);
digitalWrite(pincerrando,HIGH);
delay(4000);
}
if(lectura==LOW){
digitalWrite(pinobstaculo,HIGH);
digitalWrite(pincerrando,LOW);
delay(4000);

}

}

puertabierta=false;
digitalWrite(pinpuertacerrada,HIGH);
digitalWrite(pinpuertabierta,LOW);
digitalWrite(pincerrando,LOW);
digitalWrite(pinobstaculo,LOW);

}

}

Puerta_sensorprox.txt (1.44 KB)

Moderador
Por favor edita tu post usando etiquetas de código.

Normas del foro

Ve a documentación y estudia como reemplazar los delays() por millis().
Hay muchos tutoriales al respecto.
Si haces algo que verifica si hay obstáculos no puedes ponerle una venda en los ojos para que durante el tiempo que se ejecute el delay() no haga nada y permita por ejemplo que alguien salga lastimado.