no puedo resetear el contador

buenas noches amigos

necesito un temporizador donde le ingrese low por el pin 31 inicie el conteo del temporizador, el problema esta en que inicia el conteo pero cuando le ingreso nuevamente pin high no se resetea el temporizador al volver a ingresar low por el pin 31, no se como realizar este proceso de reset … agradecería mucho sus ayudas

#include <LiquidCrystal.h>
// LiquidCrystal display with:
// rs on pin 53
// rw on pin 51
// enable on pin 49
// d4, d5, d6, d7 on pins 47, 45, 43,41
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int minutos=3;     // minutos a contar el temporizador 
int segundos =1;
int decimas =0;
long milisegundos =0;
int boton = 31;
int flag =0;
int ledpin36 = 36; // LED conectado al pin 24
const int TIEMPO_NESESARIO = 1000;



void setup()
  {
     pinMode(ledpin36, OUTPUT); // pin 13 (LED)actua como SALIDA
     Serial.begin(9600);
     pinMode(boton, INPUT);
     pinMode(35, OUTPUT);
     digitalWrite(boton, LOW);
     lcd.begin(16, 2); 
  }



void loop(){
 //boton de inicio
 if (digitalRead(boton)==HIGH){    // si en el pin 31 esta en HIGH esta cerrada la puerta   

   flag=0;                         // si el pin 31 esta en low esta abierta la puerta ... comienza el conteo regresivo 
   delay(200);
       lcd.clear ();
       lcd.setCursor(1, 0);
       lcd.print("PUERTA CERRADA");     
       lcd.setCursor(3, 1);
       lcd.print("ECOMTEC SAS");
       delay(1000);  
       lcd.clear ();
   digitalWrite(35, LOW);         // SI esta cerrada la puerta el pin 35 o el bombillo esta apagado
 }
     
  if (flag==0){ 
 
 milisegundos =millis();

 if(milisegundos%100==0){
   decimas--;
   if (decimas==-1){
     decimas=10;
     segundos--;
   }
   if(segundos==-1){
     segundos=59;
     minutos--;
   }
  
   ///mostrar en pantalla      
      
   // coloco un tiempo de subida de puerta
      
   lcd.setCursor(0,0);
   lcd.print("TIEMPO RESTANTE");
   lcd.setCursor(5,1);
   if(minutos< 10){
     lcd.print("0");
   }
   lcd.print(minutos);
   lcd.print(":");
   lcd.setCursor(8,1);
   if(segundos< 10){
     lcd.print("0");
     }
   lcd.print(segundos);
    if (minutos==-1){
     flag=0;
     minutos =1;
     segundos =0;
     digitalWrite(35, LOW);
     lcd.clear ();

      digitalWrite(ledpin36, HIGH);
      delay(200);
      digitalWrite(ledpin36, LOW);
      
      lcd.clear ();
      lcd.setCursor(1, 1);
      lcd.print("Cerrando puerta");
      delay(15000);
      lcd.clear ();
      
   }
    }
   }
 }

Tu código tiene demasiados errores para intentar corregirlo. Debes empezar de cero otra vez.

Pusiste una resistencia de pull-up de 10K en el pin 31 para que al soltar el botón (puerta cerrada) el pin regrese a HIGH ?
Si no tienes esta resistencia cambia en setup() a esto que es lo mismo:

pinMode(boton, INPUT_PULLUP);

Luego si pin 31 es salida no puedes escribir en el, borra digitalWrite(boton, LOW);

Si pones un delay(15000); congelas el Arduino por ese tiempo y no se dará cuenta si cierras la puerta o cualquier otra cosa. La idea es que guardes en una variable "hora" tipo unsigned long el valor de millis() cuando se abre la puerta y dejes que se ejecute miles de veces el loop() esperando a ver que ocurre primero si los 3 min o el cierre de la puerta.

Como sabras que se cerro la puerta :

if (digitalRead(boton){
   //Desarma alarma
};

Como sabrás si se cumplió los 3 min (60x3x1000) ?

if (millis() - hora > 180000){
   //Activa alarma
};

Antes de meterte en el código te recomiendo dibujar un esquema de bloques.