Uscita da ciclo While

Ciao a tutti,
non ho ben capito il ciclo while, lo sto utilizzando per fare un controllo di uno switch per porta automatizzata, con segnalazione di errore se la porta non arriva mai a fine corsa, il pezzo di programma sotto riporta la parte di apertura, la domanda è questa, dopo il ciclo while io ho lo stop del relè comando porta, e va bene, mentre dentro il ciclo ho un if per il tempo trascorso, che se scade, attiva un flag, che poi nel loop mi da l'allarme... Questo flag dovrei però disattivarlo se lo switch funziona, quindi dove ho messo lo stop del relè comando porta, ma non va bene, sarebbe sempre azzerato. In pratica, il ciclo while, sia che "lavori" o che non "lavori" il programma va sempre a leggere dopo le graffe di chiusura del ciclo... Quindi? Come fare? Dove mi sono incartato? Spero di essere riuscito a spiegarmi.
Grazie

//*********************************************************
void apriporta()
{
  digitalWrite(DISPLAY, HIGH);             // attiva il relè per alimentare il display
  GLCD.ClearScreen();                       // cancella display
  GLCD.print("Porta in apertura");        // scrive
  digitalWrite(APRI_PORTA, HIGH);       // attivo il relè per aprire la porta
  inizio = millis();                              // carico tempo per ettesa per errore
  while (digitalRead(APERTA) == HIGH) // controllo se la porta è aperta
  {
    if ((millis() - inizio) >= tempo)        // controllo se è scaduto il tempo
    {
      all_ap_porta = 1;                       // avviso di dare l'allarme
      break;                                     // esco dal ciclo while
    }
  }
  digitalWrite(APRI_PORTA, LOW);       // disattivo il relè per aprire la porta
}

//*********************************************************************