Una parte del loop no se repite

Hola a todos.

Estoy trabajando en un proyecto el cual se compone de varios estados (con la función "while"). El problema lo tengo en una parte del mismo la cual quiero que se repita constantemente, con independencia del estado en el que se encuentre. Se trata en concreto de una lectura de temperatura cada segundo. Si coloco dicha parte del código al principio del void loop, la temperatura sólo se lee una única vez (no infinitas veces cada segundo como yo desearía). También he probado a crear una función "void" para después llamarla antes de cada "while", y efectivamente se ejecuta una única vez en cada estado, pero no continuamente.

A ver si alguien me puede ayudar con este tema.

Gracias.

Hola,

Pue yo creo que te falta un ; en la linea 10100.

Jajajaja, es broma, si no pones el código no sabremos si el problema es que se pierde, que se queda bloqueado, que tienes un delay muy largo.

Por favor pon el código y te podremos ayudar, tambien di que sensor de temperatura usas y que libreria para leerlo.

10 msg Rubikub y no sabes que debes poner el código? Vamos... tomate un tiempito y re lee las normas por favor.
Postea el código y ahi tendras una respueta en poco tiempo.

Hola. En primer lugar, pedir disculpas si no he posteado como se supone que debería haberlo hecho.

Mis conocimientos de programación son muy limitados, y básicamente me busco la vida haciendo corta-pega para ajustar los programas ya existentes a mis necesidades. Este es uno de esos casos. En un primer momento, tenía 2 placas de Arduino para realizar dos tareas distintas. Cada una por separado cumplían perfectamente su función. Pero ahora, para ahorrarme una placa, un adaptador de corriente, etc. quiero unificarlo todo en un mismo sketch. He visto y leído tutoriales en Internet y he conseguido hacerlo funcionar, salvo ese detalle que comentaba.

Adjunto la primera parte del código de programación (completo, con las aclaraciones que voy añadiendo en los programas, ocupa más caracteres de los permitidos para publicarlo).

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <RCSwitch.h>

LiquidCrystal_I2C lcd(0x3F,16,2);

RCSwitch mySwitch = RCSwitch();

//------------------------------------------------------------------------------
char* secretCode  = "XXXX";      // PIN.
char* secretCode1 = "XXXX";      // PIN2 ver datos intrusion y alarmas.
char* secretCode2 = "XXXX";      // PIN3 borrar datos.
char* secretCode3 = "XXXX";     // PUK.
String keydata;
int position = 0;
const byte rows = 4;           
const byte cols = 4; 
char keys[rows][cols] = {     
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

byte rowPins[rows] = {12, 11, 10, 9};
byte colPins[cols] = {8, 7, 6, 5};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);

byte switchs = A4;
byte pir = A3;
byte leds = A1;
byte sirena = A2;
byte buzzer = 13;

byte estado = 0;
byte cntPul = 0;
byte cntInt = 0;

char recibirDato;
long tiempo;
char key;
boolean claveBien = false;
boolean claveMal = false;

String versi = "09-01-2017 20:52";
int x = 0, mrest, luz = 0, secs, srest, timeluz = 10000, twatch = 10000;
unsigned long watchmillis, watchluz, rearmado = 60000;
int sube = 1, trig1 = 0, trig2 = 0; long value =0;


//Para activar y desactivar el sensor PIR y el relé de la sirena y leer la temperatura:

#include <SPI.h> 
#include <Ethernet.h> //Declaración de la direcciones MAC e IP.
byte mac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED}; //MAC 
IPAddress ip(192, 168, X, XX); //IP 
EthernetServer servidor(XX
); //Puerto
int PIN_LED=23; // Activa/Desactiva el relé de la sirena.
int PIN_PIR=22; // Activa/Desactiva el sensor de movimiento PIR.
String readString=String(30); //lee los caracteres de una secuencia en una cadena.
//Los strings se representan como arrays de caracteres (tipo char) 
String state1=String(3);
String state2=String(3);


const int sensorTemp= A0;

//----------------------------------------------------------------------------------------

void setup()
{
{  
Serial.begin(9600);
  delay(200);
lcd.begin(16, 2);
  Serial.println("Inicio:");
  
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin 2 
  
delay(50);

pinMode(pir, INPUT);
pinMode(switchs, INPUT);
pinMode(leds, OUTPUT);
pinMode(sirena, OUTPUT);
pinMode(buzzer, OUTPUT);
Serial.print("Alarma aun desactivada. Pulsar PIN para conectarla.");

 lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("BIENVENIDO"); // Mensaje a despegar
  delay(3000);

  watchluz = millis();
  } 
   
  
{
  Ethernet.begin(mac, ip);
servidor.begin(); 
pinMode(PIN_LED,OUTPUT);
digitalWrite(PIN_LED,LOW);
state1="OFF";
pinMode(PIN_PIR,OUTPUT);
digitalWrite(PIN_PIR,HIGH);
state2="ON";
}
}//  end setup

//------------------------------------------------------------------------------
void loop(){ 
  
    int value = analogRead(sensorTemp);
  float millivolts = ((value / 1023.0) * 5000)-25;
  float celsius = millivolts / 10;
  Serial.print(celsius);
  Serial.println("C");
  delay(1000);


  //EthernetClient Crea un cliente que se puede conectar a 
  //una dirección específica de Internet IP
  
EthernetClient cliente= servidor.available(); 
if(cliente) {
boolean lineaenblanco=true; 
while(cliente.connected()) {
if(cliente.available()) {
char c=cliente.read(); 
if(readString.length()<30) {
readString.concat(c);
//Cliente conectado
//Leemos petición HTTP caracter a caracter
//Almacenar los caracteres en la variable readString
} 
if(c=='\n' && lineaenblanco) //Si la petición HTTP ha finalizado 
{
int LED = readString.indexOf("LED="); 
if(readString.substring(LED,LED+5)=="LED=T") {
digitalWrite(PIN_LED,HIGH);
state1="ON"; } 
else if (readString.substring(LED,LED+5)=="LED=F") {
digitalWrite(PIN_LED,LOW); 
state1="OFF";
}

int PIR = readString.indexOf("PIR="); 
if(readString.substring(PIR,PIR+5)=="PIR=T") {
digitalWrite(PIN_PIR,HIGH);
state2="ON"; } 
else if (readString.substring(PIR,PIR+5)=="PIR=F") {
digitalWrite(PIN_PIR,LOW); 
state2="OFF";
  
}


//Cabecera HTTP estándar
cliente.println("HTTP/1.1 200 OK"); 
cliente.println("Content-Type: text/html"); 
cliente.println(); //Página Web en HTML 
cliente.println("<html>"); 
cliente.println("<head>"); 
cliente.println("<title>ALARMA ON/OFF</title>"); 
cliente.println("</head>");
cliente.println("<body width=100% height=100%>"); 
cliente.println("<center>"); 
cliente.println("<h1>ALARMA ON/OFF</h1>");
cliente.print("

"); 
cliente.print("Estado del sensor de movimiento: "); 
cliente.print(state2);
cliente.print("

"); 
cliente.println("<input type=submit value=ON style=width:200px;height:75px onClick=location.href='./?PIR=T\'>"); 
cliente.println("<input type=submit value=OFF style=width:200px;height:75px onClick=location.href='./?PIR=F\'>");
cliente.print("



");
cliente.print("Estado de la sirena: "); 
cliente.print(state1); 
cliente.print("

");
cliente.println("<input type=submit value=ON style=width:200px;height:75px onClick=location.href='./?LED=T\'>"); 
cliente.println("<input type=submit value=OFF style=width:200px;height:75px onClick=location.href='./?LED=F\'>");
cliente.print("



");
cliente.print("Temperatura: "); 
cliente.print(celsius);
cliente.print(" ºC");  
cliente.println("</center>"); 
cliente.println("</body>"); 
cliente.println("</html>"); 
cliente.stop();
//Cierro conexión con el cliente 
readString="";

}
}
}
}
  
  
/* ESTADO 0
 

while (estado == 0){

 if (watchluz + timeluz <= millis() && luz == 1){
  lcd.setBacklight(0);
  luz = 0;
 }  
  
puertoSerie();
digitalWrite(leds, LOW);
digitalWrite(sirena, HIGH);
digitalWrite(buzzer, LOW);
lcd.setCursor(0, 0);
lcd.print("Alarma:   O F F  ");
lcd.setCursor(0, 1);
lcd.print("PIN para Activar");

clavePin2();
value = 0;
remote();

  if (keydata == secretCode1 || value == 16776966){
  lcd.clear();
  beep();
  lcd.setBacklight(1);
  lcd.setCursor(0,0);
  lcd.print("  Datos grabados ");
  delay(1000);
  lcd.setCursor(0,0);
  lcd.print("Intrusiones:     ");
  lcd.setCursor(12,0);
  lcd.print(trig1);  
  lcd.setCursor(0,1);
  lcd.print("    Alarmas:     ");
  lcd.setCursor(12,1);
  lcd.print(trig2);   
  delay(5000);
  keydata = "";
  value = 0;
  watchluz = millis(); 
  lcd.clear();
  claveBien = false;
  }

 if (keydata == secretCode2){
  lcd.clear();
  beep();
  lcd.setCursor(0,0);
  lcd.print("Datos-> BORRADOS");
  trig1 = 0;
  trig2 = 0;
  keydata = "";
  value = 0;
  delay(1000);
  watchluz = millis(); 
  lcd.clear();
  claveBien = false;
  }

 
  if (value == 5592512){
  lcd.clear();
  beep();
  estado = 4;
  watchmillis = millis();
  watchluz = millis(); 
  lcd.clear();
  luz = 1;
  keydata = "";
  value = 0;
  trig2++;
  claveBien = false;
  Serial.print("4"); 
  }
 
  
if (claveBien || value == 16776967){
keydata = ""; 
estado = 1;
beep();
lcd.clear();
value = 0;
lcd.setBacklight(1); 
watchmillis = millis();
watchluz = millis();
Serial.print("Alarma conectada.");
claveBien = false;
} 
else if (claveMal){
estado = 5;
beep();
lcd.clear();
lcd.setBacklight(1); 
watchmillis = millis();
watchluz = millis();
luz = 1;
keydata = "";
Serial.print("5");
claveMal = false;
} 

}  // end while estado0
//----------------------------------------------

La parte que quisiera que se repitiera constantemente es la que comienza justo debajo del void loop hasta que empieza el "ESTADO 0" (lectura de temperatura y monitorización y control de sensores y relé a través de internet).

Gracias.

Hola,
Primer problema que veo

while (estado == 0){

if (watchluz + timeluz <= millis() && luz == 1){
 lcd.setBacklight(0);
 luz = 0;
}

Si estado es igual a 0 nunca saldrá de ese while ya que no actualizas estado nunca.

Hola. Como ya he comentado, esta es sólo una parte del código. Si estoy entendiendo bien lo que quieres decir, el estado se actualizaría cuando, por ejemplo, introduces el código PIN, o el sensor PIR detecta un movimiento, etc. ¿no es así?

Adjuntaré el resto de la programación por partes. Ahí va la continuación.

while (estado == 1){
  
 if (watchluz + timeluz <= millis() && luz == 1){
  lcd.setBacklight(0);
  luz = 0;
 } 
  
digitalWrite(sirena, HIGH);
digitalWrite(buzzer, LOW);
lcd.setCursor(0, 0);
lcd.print("Alarma: O K");
lcd.setCursor(0, 1);
lcd.print("Activa en    sec");

        srest = (((watchmillis + twatch) - millis()) % 60000) ;
        int secs = srest /1000;
        if (secs > 9){
        lcd.setCursor(10,1);
        }
        else {
        lcd.setCursor(10,1);
        lcd.print("0");  
        lcd.setCursor(11,1);
        } 
        lcd.print(secs);

clavePin();
remote();       

if (claveBien || value == 16776965){
estado = 0;
beep();
delay(50);
beep();
lcd.clear();
watchluz = millis();
luz = 1;
value = 0;
Serial.print("0");
claveBien = false;
}

if (claveMal){
estado = 5;
beep();
lcd.clear();
lcd.setBacklight(1); 
watchmillis = millis();
watchluz = millis();
luz = 1;
Serial.print("5");
claveMal = false;
} 

if (watchmillis + twatch < millis()){
estado = 2;
beep();
lcd.clear();
watchluz = millis();
lcd.setBacklight(1); 
luz = 1;
value = 0;
x = 0;
sube = 1;
Serial.print("A la espera de movimiento.");
}

}  // end while estado1
//----------------------------------------------



while (estado == 2){

 if (watchluz + timeluz <= millis() && luz == 1){
  lcd.setBacklight(0);
  luz = 0;
 }

if (sube == 1){
  x++;
}

if (sube == 0){
  x--;
}

puertoSerie();
digitalWrite(leds, HIGH);
digitalWrite(sirena, HIGH);
digitalWrite(buzzer, LOW);
lcd.setCursor(0, 0);
lcd.print("* A L A R M A *");
lcd.setCursor(x, 1);
lcd.print(".");

delay(15);

if (sube == 1 && x == 16){
lcd.setCursor(0, 1);
lcd.print("                ");
digitalWrite(leds, HIGH);
delay(20);
sube = 0;
}

if (sube == 0 && x == -1){
lcd.setCursor(0, 1);
lcd.print("                ");
digitalWrite(leds, LOW);
delay(20);
sube = 1;
}

clavePin();
remote();

if (claveBien || value == 16776965){
estado = 0;
beep();
delay(50);
beep();
lcd.clear();
watchluz = millis();
luz = 1;
value = 0;
Serial.print("0");
claveBien = false;
}

else if (claveMal){
estado = 6;
watchluz = millis(); 
beep();
lcd.clear();
luz = 1;
Serial.print("6");
claveMal = false;
}

if (digitalRead (switchs) == HIGH || digitalRead (pir) == HIGH){
estado = 3;
lcd.clear();
trig1++;
Serial.print("Movimiento detectado. La alarma sonara en 10 segundos.");
delay(50);
}

}  // end while estado2
//----------------------------------------------

while (estado == 3){

 lcd.setBacklight(1);
  
tiempo = millis() + twatch;
watchmillis = millis();

do {
digitalWrite(leds, HIGH);
digitalWrite(sirena, HIGH);
digitalWrite(buzzer, LOW);
lcd.setCursor(0, 0);
lcd.print("*  INTRUSION   *");
lcd.setCursor(0, 1);
lcd.print("SIRENA en    seg");

        srest = (((watchmillis + twatch) - millis()) % 60000) ;
        int secs = srest /1000;
        if (secs > 9){
        lcd.setCursor(10,1);
        }
        else {
        lcd.setCursor(10,1);
        lcd.print("0");  
        lcd.setCursor(11,1);
        } 
        lcd.print(secs);

clavePin();
remote();

if (claveBien || value == 16776965){
estado = 0;
beep();
delay(50);
beep();
lcd.clear();
watchluz = millis();
luz = 1;
value = 0;
Serial.print("0");
claveBien = false;
break;
} 

digitalWrite(leds, LOW);
delay(25);

if (claveBien || claveMal || (Serial.available()>0)){
break;
}
}  // end while estado3
//----------------------------------------------

while(tiempo > millis());

puertoSerie();
remote();

if (claveBien || value == 16776965){
estado = 0;
beep();
delay(50);
beep();
lcd.clear();
watchluz = millis();
luz =1;
value = 0;
Serial.print("0");
claveBien = false;
}
else if (claveMal){
estado = 6;
watchluz = millis();
beep();
lcd.clear();
luz = 1;
Serial.print("6");
claveMal = false;
}
else if (estado!= 0){
estado = 4;
watchmillis = millis();
watchluz = millis(); 
beep();
lcd.clear();
luz = 1;
trig2++;
Serial.print("Alarma sonando.");
}
}  // end while tiempo
//----------------------------------------------


while (estado == 4){

 if (watchmillis + rearmado < millis()){
 estado = 1;
 beep();
 luz = 1;
 watchluz = millis();
 Serial.print("1");
 claveBien = false;
 }  
 
  if (watchluz + timeluz < millis() && luz == 1){
  lcd.setBacklight(0);
  luz = 0;
  }
   
puertoSerie();
digitalWrite(leds, HIGH);
digitalWrite(sirena, LOW);
digitalWrite(buzzer, LOW);
lcd.setCursor(0, 0);
lcd.print("* A L A R M A *");
lcd.setCursor(0, 1);
lcd.print("Desactivar  PIN");

delay(25);
digitalWrite(leds, LOW);
delay(25);

clavePin();
remote();

if (claveBien || value == 16776965){
estado = 0;
beep();
delay(50);
beep();
lcd.clear();
watchluz = millis();
luz = 1;
value = 0;
Serial.print("0");
claveBien = false;
}

else if (claveMal){
estado = 6;
watchmillis = millis();
beep();
lcd.clear();
luz = 1;
watchluz = millis();
Serial.print("6");
claveMal = false;
}
}  // end while estado4
//----------------------------------------------

Tercera y última.

while (estado == 5){
 
 if (watchmillis + rearmado < millis()){
 estado = 1;
 beep();
 watchluz = millis();
 luz = 1;
 Serial.print("1");
 claveBien = false;
 }
 
  if (watchluz + timeluz < millis() && luz == 1){
  lcd.setBacklight(0);
  luz = 0;
  }
  
puertoSerie();
digitalWrite(leds, HIGH);
digitalWrite(sirena, HIGH);
digitalWrite(buzzer, LOW);
lcd.setCursor(0, 0);
lcd.print("*PIN Bloqueado*");
lcd.setCursor(0, 1);
lcd.print("Meta codigo PUK");

clavePuk();
value = 0;
remote();

if (claveBien || value == 16776965){
estado = 0;
beep();
delay(50);
beep();
lcd.clear();
luz = 1;
value = 0;
watchluz = millis();
digitalWrite(leds, LOW);
Serial.print("1");
claveBien = false;
}
}  // end while estado5
//----------------------------------------------


while (estado == 6){
 
 if (watchmillis + rearmado < millis()){
 estado = 1;
 beep(); 
 Serial.print("1");
 claveBien = false;
 } 
  if (watchluz + timeluz < millis() && luz == 1){
  lcd.setBacklight(0);
  luz = 0;
 }

puertoSerie();
digitalWrite(leds, HIGH);
digitalWrite(sirena, LOW);
digitalWrite(buzzer, LOW);
lcd.setCursor(0, 0);
lcd.print("*ALARMA* Entrar");
lcd.setCursor(1, 1);
lcd.print("Desactivar  PUK");
delay(25);
digitalWrite(leds, LOW);
delay(25);

clavePuk();
remote();

if (claveBien || value == 16776965){
estado = 0;
beep();
delay(50);
beep();
lcd.clear();
watchluz = millis();
luz = 1;
value = 0;
Serial.print("0");
claveBien = false;
}
}  // end while estado6
//----------------------------------------------

}  // end LOOP
//-------------------------------------------------------------------------------------


void puertoSerie(){
if (Serial.available() > 0){
recibirDato = Serial.read();
if (recibirDato == '1'){
estado = 1;
beep(); 
Serial.print("1");
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
}
else if (recibirDato == '0'){
estado = 0;
beep(); 
Serial.print("0");
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
}
}
}  // end void puertoserie
//---------------------------------------------------------------------------------

void clavePin(){

key = keypad.getKey();

if (key == '*' || key == '#'){
position = 0;
cntPul = 0;
beep();
lcd.setBacklight(1);
watchluz = millis();
luz = 1;
delay(50);
}
if (key == secretCode[position]){
position ++;
delay(50);
}
if (key >= '0'){
cntPul ++;
beep();
lcd.setBacklight(1);
watchluz = millis();
luz = 1;
delay(100);
}
if (cntPul == 4){
if (position == 4){
claveBien = true;
cntPul = 0;
cntInt = 0;
position = 0;
lcd.clear();
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
lcd.setCursor(0, 0);
lcd.print("       PIN      ");
lcd.setCursor(0, 1);
lcd.print("     correcto    ");
delay(500);
}
else {
cntPul = 0;
cntInt ++;
position = 0;
keydata = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("       PIN      ");
lcd.setCursor(0, 1);
lcd.print("  *   ERROR   * ");
digitalWrite(buzzer, HIGH);
digitalWrite(leds, HIGH);
delay(1000);
digitalWrite(buzzer, LOW);
digitalWrite(leds, LOW);
}
}
if (cntInt == 3){
cntInt = 0;
claveMal = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("*PIN Bloqueado*");
lcd.setCursor(0, 1);
lcd.print("Meta codigo PUK");
digitalWrite(leds, HIGH);
digitalWrite(buzzer, HIGH);
delay(1000);
}
}   // end clavepin
//---------------------------------------------------------------------------------

void clavePin2(){

key = keypad.getKey();

if (key == '*' || key == '#'){
position = 0;
cntPul = 0;
beep();
lcd.setBacklight(1);
watchluz = millis();
luz = 1;
delay(50);
}

if (key == secretCode[position] || key == secretCode1[position] || key == secretCode2[position]){
position ++;
delay(50);
}

if (key >= '0'){
cntPul ++;
beep();
lcd.setBacklight(1);
watchluz = millis();
luz = 1;
keydata = keydata + key;
delay(100);
}

if (cntPul == 4){
if (position == 4){
  if (keydata == String(secretCode)){
  claveBien = true;
  cntPul = 0;
  cntInt = 0;
  position = 0;
  lcd.clear();
  digitalWrite(buzzer, HIGH);
  delay(100);
  digitalWrite(buzzer, LOW);
  lcd.setCursor(0, 0);
  lcd.print("       PIN      ");
  lcd.setCursor(0, 1);
  lcd.print("     correcto    ");
  delay(500);
  }
  if (keydata == String(secretCode1)  || keydata == String(secretCode2)){
  claveBien = true;
  cntPul = 0;
  cntInt = 0;
  position = 0;
  lcd.clear();
  }
}
else {
cntPul = 0;
cntInt ++;
position = 0;
keydata = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("       PIN      ");
lcd.setCursor(0, 1);
lcd.print("  *   ERROR   * ");
digitalWrite(buzzer, HIGH);
digitalWrite(leds, HIGH);
delay(1000);
digitalWrite(buzzer, LOW);
digitalWrite(leds, LOW);
}
}
if (cntInt == 3){
cntInt = 0;
claveMal = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("*PIN Bloqueado*");
lcd.setCursor(0, 1);
lcd.print("Meta codigo PUK");
digitalWrite(leds, HIGH);
digitalWrite(buzzer, HIGH);
delay(1000);
}
}   // end clavepin
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

void clavePuk(){
  
key = keypad.getKey();

if (key == '*' || key == '#'){
position = 0;
cntPul = 0;
beep();
lcd.setBacklight(1);
watchluz = millis();
luz = 1;
delay(50);
}
if (key == secretCode3[position]){
position ++;
delay(50);
}
if (key >= '0'){
cntPul ++;
beep();
lcd.setBacklight(1);
watchluz = millis();
luz = 1;
delay(50);
}
if (cntPul == 8){
if (position == 8){
claveBien = true;
cntPul = 0;
position = 0;
lcd.clear();
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(leds, LOW);
digitalWrite(buzzer, LOW);
lcd.setCursor(0, 0);
lcd.print("       PUK      ");
lcd.setCursor(0, 1);
lcd.print("  *  correcto  * ");
delay(1500);
}
else {
cntPul = 0;
position = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("       PUK      ");
lcd.setCursor(0, 1);
lcd.print("  *   ERROR   * ");
digitalWrite(buzzer, HIGH);
delay(1000);
}
}
}   // end clavepuk
//--------------------------------------------------------------------------
void beep(){
    digitalWrite(buzzer, HIGH);
    delay(30);
    digitalWrite(buzzer, LOW);
}
//-------------------------------------------------------
void remote(){
      
     if (mySwitch.available()) {
      value = mySwitch.getReceivedValue();
  
      if (value == 16776967 || value == 16776965 || value == 16776966 || value == 5592512){
      beep;
      lcd.setBacklight(1);
      watchluz = millis();
      luz = 1;
      }
      
      mySwitch.resetAvailable();
       
     delay(50);
     }  // end if myswitch 
   
}  // end void remote
//-------------------------------------------------------

Bien, analiza cuando se actualiza estado, fuera del while ¿No? ¿Y dónde está la llamada a clavepin? Fuera también ¿No? Por lo tanto una vez dentro del while nunca saldrá ya que estado siempre será cero. While es un bucle que se ejecuta mientras se cumpla la condición.
En el segundo while donde estado==1 te pasará lo mismo.
Ten en cuenta que la ejecución del código es secuencial.
Por cierto se pueden adjuntar ficheros .
Recapitulando todo lo que tengas detrás del while no se ejecutará nunca si cuando llega al while estado es igual a cero.

Bien, en la tercera parte si actualizas estado si cumples una condición, con ese en un principio no tendrías problemas. Pero con los otros dos si.