Esto:
while(digitalRead(pBTN_PUERTA));
es un bucle infinito, mientras pBTN_PUERTA esté en HIGH. Si tienes el botón configurado en pull-up, como sospecho, no pasará a LOW (ni saldrá del bucle) hasta que no pulses el botón. Prueba a cambiar la instrucción a
while(!digitalRead(pBTN_PUERTA));
Creo que sólo con eso debería acercarse más al funcionamiento deseado.
Limpiado un poco el código, y agregando detección para cambio de estado (si mantengo el pulsador, no esté continuamente abriendo y cerrando):
int LED = 13; //El LED esta conectado en el pin 9
int LDR = 0; //El LDR esta conectador en el pin A0
int brillo; //variable para el brillo
int luz = 0;
int valor_sensor = 0;
bool ultimo_estado_pulsador;
const int valor_limite = 50;
const byte pBTN_PUERTA = 2;
const byte pPUERTA = 3;
void setup()
{
Serial.begin(9600);
pinMode(LED,OUTPUT);
pinMode(LDR,INPUT);
pinMode(pBTN_PUERTA, INPUT);
pinMode(pPUERTA, OUTPUT);
ultimo_estado_pulsador=digitalRead(pBTN_PUERTA);
}
void loop()
{
////////////////////////////////////////////////////////////////////////////
//Control de iluminación - Sala Multiusos
valor_sensor = analogRead(LDR);
luz = (5.0 * valor_sensor * 100.0)/1024.0;
Serial.print(luz);
Serial.println(" Luz");
delay(300);
if (luz <= valor_limite) //Si el valor de luz es menor o igual que el valor limite
{
digitalWrite (LED, HIGH); //El led se apaga
}
else // Está claro que si luz no es menor o igual, es que es mayor
{
digitalWrite (LED, LOW); //El led se eniende
}
////////////////////////////////////////////////////////////////////////////
//Apertura y cierre manual - Garaje
bool estado_actual_pulsador = digitalRead(pBTN_PUERTA);
if( estado_actual_pulsador != ultimo_estado_pulsador)
{
if (estado_actual_pulsador == HIGH) // LOW, si lo tienes conectado como pullup
digitalWrite(pPUERTA, !digitalRead(pPUERTA));
}
}