Problema de control "while"

Buenos días estoy realizando un proyecto para gestionar unas bombas, electrovalvulas y otros elementos. Comencé con las funciones if-else pero llega un momento que al tener muchas variables y casos diferentes unas funciones corrompen a otras por lo que decidí que sería más apropiado estructurar el programa con While pero no consigo que salga del bucle, busco lo que la teoria dice que es while mientras se cumplan unas condiciones haz esto sino sal del bucle, he probado incluso colocando el if-else dentro pero no me sale del bucle y no hace caso al else, fijo que algo estoy haciendo mal agradecería me echarais un cable.

Os muestro uno de los casos

  //*********************caso2 grifo o ducha agua caliente con bypass***************************

/*
  while ((estadopulsador5 == HIGH && (estadopulsador3 | estadopulsador4 == HIGH)))// && (estadopulsador6 == LOW && estadopulsador2 == LOW))//con bypass y contacto grifo o contacto ducha e intreptor controlador off
  {
    if ((estadopulsador5 == HIGH && (estadopulsador3 | estadopulsador4 == HIGH)))
  {
    digitalWrite(salida11, HIGH);//abro la ev1
    delay(1000);
    digitalWrite(salida12, HIGH);//alimento calentador
  }
  else
  {
    digitalWrite(salida12,LOW );//abro la ev1
    delay(1000);
    digitalWrite(salida11,LOW);//alimento calentador
    break;

    }

Explicanos un poco más qué quieres hacer exactamente, cómo cambian de valor las variables estadopulsador....

Tal y como lo tienes puesto el while se ejecutara siempre y cuando estadopulsador5 sea 1 y una de las dos o las dos (estadopulsador3 y estadopulsador4) sean 1.

Ahora bien cuando se deje de cumplir esta condición saldra del bucle while no entrando al else. El if de dentro yo lo quitaria, lo que tienes dentro del if ponlo dentro del while, y lo que esta en el else fuera del while, de tal modo que si no se cumple la condición no entrará al while y ejecutará lo de fuera.

 //*********************caso2 grifo o ducha agua caliente con bypass***************************

/*
  while ((estadopulsador5 == HIGH && (estadopulsador3 | estadopulsador4 == HIGH)))// && (estadopulsador6 == LOW && estadopulsador2 == LOW))//con bypass y contacto grifo o contacto ducha e intreptor controlador off
  {
    digitalWrite(salida11, HIGH);//abro la ev1
    delay(1000);
    digitalWrite(salida12, HIGH);//alimento calentador
  }

digitalWrite(salida12,LOW );//abro la ev1
delay(1000);
digitalWrite(salida11,LOW);//alimento calentador

Un saludo!!!

Hola,
Y si pruebas a ponerle a estadopulsador3 alguna condición de comparación. No le tienes puesto nada.

Hola de nuevo y gracias por vuestra respuesta, pero sigo volviéndome loco...

DANICAP, tal y como dices lo he probado pero no sale del while salvo que ponga break.

RODRIPELTO, perdona pero no te entiendo

Os paso código completo con los dos primeros casos.

//***seguir en este

//variables de entrada
const int pulsador2 = 2;     //
const int pulsador3 = 3;     //
const int pulsador4 = 4;     //
const int pulsador5 = 5;     //
const int pulsador6 = 6;     //
const int pulsador7 = 7;     //

int estadopulsador2 = 0;         // 
int estadopulsador3 = 0;         // 
int estadopulsador4 = 0;         // 
int estadopulsador5 = 0;         // 
int estadopulsador6 = 0;         // 
int estadopulsador7 = 0;         //

//variables de salida
const int salida13 =  13;
const int salida12 =  12;
const int salida11 =  11;
const int salida10 =  10;
const int salida9 =  9;
const int salida8 =  8;

//variables para reset salidas
int estadosalida13 = 0;
int estadosalida12 = 0;
int estadosalida11 = 0;
int estadosalida10 = 0;
int estadosalida9 = 0;
int estadosalida8 = 0;



void setup() {

  pinMode(pulsador2, INPUT); //contacto controlador
  pinMode(pulsador3, INPUT); //contacto grifo
  pinMode(pulsador4, INPUT); //interruptor ducha
  pinMode(pulsador5, INPUT); //bypas
  pinMode(pulsador6, INPUT); //interuptor on/off controlador
  pinMode(pulsador7, INPUT);

  pinMode(salida8, OUTPUT);
  pinMode(salida9, OUTPUT);  //alimentación controlador on/off
  pinMode(salida10, OUTPUT); //ev2
  pinMode(salida11, OUTPUT); //ev1
  pinMode(salida12, OUTPUT); //calentador
  pinMode(salida13, OUTPUT); //bomba de agua

}

void loop() {

  //lectura pulsadores

  estadopulsador2 = digitalRead(pulsador2);
  estadopulsador3 = digitalRead(pulsador3);
  estadopulsador4 = digitalRead(pulsador4);
  estadopulsador5 = digitalRead(pulsador5);
  estadopulsador6 = digitalRead(pulsador6);
  estadopulsador7 = digitalRead(pulsador7);

  //reset casos
  estadosalida13 = digitalRead (salida13);
  estadosalida12 = digitalRead (salida12);
  estadosalida11 = digitalRead (salida11);
  estadosalida10 = digitalRead (salida10);
  estadosalida9 = digitalRead (salida9);
  estadosalida8 = digitalRead (salida8);

    //Reset salidas
    if (estadosalida13 == HIGH)
    { digitalWrite (salida13, LOW);
    }
    if (estadosalida12 == HIGH)
    { digitalWrite (salida12, LOW);
    }
    if (estadosalida11 == HIGH)
    { digitalWrite (salida11, LOW);
    }
    if (estadosalida10 == HIGH)
    { digitalWrite (salida10, LOW);
    }
    if (estadosalida9 == HIGH)
    { digitalWrite (salida9, LOW);
    }
    if (estadosalida8 == HIGH)
    { digitalWrite (salida8, LOW);
    }
 



  //caso1 grifo o ducha agua fria********************************************

  while (((estadopulsador4 || estadopulsador3 == HIGH) && estadopulsador5 == LOW  ))//contacto grifo o contacto ducha sin bypass tambien funciona con el controlador encendido
  {
    digitalWrite(salida13, HIGH);//enciendo bomba de agua

  }

  //*********************caso2 grifo o ducha agua caliente con bypass***************************

  while ((estadopulsador5 == HIGH && (estadopulsador3 | estadopulsador4 == HIGH)))// && (estadopulsador6 == LOW && estadopulsador2 == LOW))//con bypass y contacto grifo o contacto ducha e intreptor controlador off
  {

    {
      digitalWrite(salida11, HIGH);//abro la ev1
      delay(1000);
      digitalWrite(salida12, HIGH);//alimento calentador
    }
  }
}

Lo que dice rodripelto, y creo que tiene razon es lo siguiente:

//***seguir en este

//variables de entrada
const int pulsador2 = 2;     //
const int pulsador3 = 3;     //
const int pulsador4 = 4;     //
const int pulsador5 = 5;     //
const int pulsador6 = 6;     //
const int pulsador7 = 7;     //

int estadopulsador2 = 0;         // 
int estadopulsador3 = 0;         // 
int estadopulsador4 = 0;         // 
int estadopulsador5 = 0;         // 
int estadopulsador6 = 0;         // 
int estadopulsador7 = 0;         //

//variables de salida
const int salida13 =  13;
const int salida12 =  12;
const int salida11 =  11;
const int salida10 =  10;
const int salida9 =  9;
const int salida8 =  8;

//variables para reset salidas
int estadosalida13 = 0;
int estadosalida12 = 0;
int estadosalida11 = 0;
int estadosalida10 = 0;
int estadosalida9 = 0;
int estadosalida8 = 0;



void setup() {

  pinMode(pulsador2, INPUT); //contacto controlador
  pinMode(pulsador3, INPUT); //contacto grifo
  pinMode(pulsador4, INPUT); //interruptor ducha
  pinMode(pulsador5, INPUT); //bypas
  pinMode(pulsador6, INPUT); //interuptor on/off controlador
  pinMode(pulsador7, INPUT);

  pinMode(salida8, OUTPUT);
  pinMode(salida9, OUTPUT);  //alimentación controlador on/off
  pinMode(salida10, OUTPUT); //ev2
  pinMode(salida11, OUTPUT); //ev1
  pinMode(salida12, OUTPUT); //calentador
  pinMode(salida13, OUTPUT); //bomba de agua

}

void loop() {

  //lectura pulsadores

  estadopulsador2 = digitalRead(pulsador2);
  estadopulsador3 = digitalRead(pulsador3);
  estadopulsador4 = digitalRead(pulsador4);
  estadopulsador5 = digitalRead(pulsador5);
  estadopulsador6 = digitalRead(pulsador6);
  estadopulsador7 = digitalRead(pulsador7);

  //reset casos
  estadosalida13 = digitalRead (salida13);
  estadosalida12 = digitalRead (salida12);
  estadosalida11 = digitalRead (salida11);
  estadosalida10 = digitalRead (salida10);
  estadosalida9 = digitalRead (salida9);
  estadosalida8 = digitalRead (salida8);

    //Reset salidas
    if (estadosalida13 == HIGH)
    { digitalWrite (salida13, LOW);
    }
    if (estadosalida12 == HIGH)
    { digitalWrite (salida12, LOW);
    }
    if (estadosalida11 == HIGH)
    { digitalWrite (salida11, LOW);
    }
    if (estadosalida10 == HIGH)
    { digitalWrite (salida10, LOW);
    }
    if (estadosalida9 == HIGH)
    { digitalWrite (salida9, LOW);
    }
    if (estadosalida8 == HIGH)
    { digitalWrite (salida8, LOW);
    }
 



  //caso1 grifo o ducha agua fria********************************************

  while (((estadopulsador4 == HIGH || estadopulsador3 == HIGH) && estadopulsador5 == LOW  ))//contacto grifo o contacto ducha sin bypass tambien funciona con el controlador encendido
  {
    digitalWrite(salida13, HIGH);//enciendo bomba de agua

  }

  //*********************caso2 grifo o ducha agua caliente con bypass***************************

  while ((estadopulsador5 == HIGH && (estadopulsador3 == HIGH | estadopulsador4 == HIGH)))// && (estadopulsador6 == LOW && estadopulsador2 == LOW))//con bypass y contacto grifo o contacto ducha e intreptor controlador off
  {

    {
      digitalWrite(salida11, HIGH);//abro la ev1
      delay(1000);
      digitalWrite(salida12, HIGH);//alimento calentador
    }
  }
}

Fransp87:
while ((estadopulsador5 == HIGH && (estadopulsador3 | estadopulsador4 == HIGH)))

No puede ser, bueno podria ser si estadopulsador3 fura verdadero o falso.

while ((estadopulsador5 == HIGH && (estadopulsador3==HIGH | estadopulsador4 == HIGH)))

Así si, simpre tiene que haber una comparación, por decirlo de alguna manera las comparaciones no son acumulables.

Nada sigue igual, no sale del while, de hecho caso más sencillo que el primero que planteo y no salga no me lo explico.

//***seguir en este

//variables de entrada
const int pulsador2 = 2;     //
const int pulsador3 = 3;     //
const int pulsador4 = 4;     //
const int pulsador5 = 5;     //
const int pulsador6 = 6;     //
const int pulsador7 = 7;     //

int estadopulsador2 = 0;         // 
int estadopulsador3 = 0;         // 
int estadopulsador4 = 0;         // 
int estadopulsador5 = 0;         // 
int estadopulsador6 = 0;         // 
int estadopulsador7 = 0;         //

//variables de salida
const int salida13 =  13;
const int salida12 =  12;
const int salida11 =  11;
const int salida10 =  10;
const int salida9 =  9;
const int salida8 =  8;

//variables para reset salidas
int estadosalida13 = 0;
int estadosalida12 = 0;
int estadosalida11 = 0;
int estadosalida10 = 0;
int estadosalida9 = 0;
int estadosalida8 = 0;



void setup() {

  pinMode(pulsador2, INPUT); //contacto controlador
  pinMode(pulsador3, INPUT); //contacto grifo
  pinMode(pulsador4, INPUT); //interruptor ducha
  pinMode(pulsador5, INPUT); //bypas
  pinMode(pulsador6, INPUT); //interuptor on/off controlador
  pinMode(pulsador7, INPUT);

  pinMode(salida8, OUTPUT);
  pinMode(salida9, OUTPUT);  //alimentación controlador on/off
  pinMode(salida10, OUTPUT); //ev2
  pinMode(salida11, OUTPUT); //ev1
  pinMode(salida12, OUTPUT); //calentador
  pinMode(salida13, OUTPUT); //bomba de agua

}

void loop() {

  //lectura pulsadores

  estadopulsador2 = digitalRead(pulsador2);
  estadopulsador3 = digitalRead(pulsador3);
  estadopulsador4 = digitalRead(pulsador4);
  estadopulsador5 = digitalRead(pulsador5);
  estadopulsador6 = digitalRead(pulsador6);
  estadopulsador7 = digitalRead(pulsador7);

  //reset casos
  estadosalida13 = digitalRead (salida13);
  estadosalida12 = digitalRead (salida12);
  estadosalida11 = digitalRead (salida11);
  estadosalida10 = digitalRead (salida10);
  estadosalida9 = digitalRead (salida9);
  estadosalida8 = digitalRead (salida8);

    //Reset salidas
    if (estadosalida13 == HIGH)
    { digitalWrite (salida13, LOW);
    }
    if (estadosalida12 == HIGH)
    { digitalWrite (salida12, LOW);
    }
    if (estadosalida11 == HIGH)
    { digitalWrite (salida11, LOW);
    }
    if (estadosalida10 == HIGH)
    { digitalWrite (salida10, LOW);
    }
    if (estadosalida9 == HIGH)
    { digitalWrite (salida9, LOW);
    }
    if (estadosalida8 == HIGH)
    { digitalWrite (salida8, LOW);
    }
 



  //caso1 grifo o ducha agua fria********************************************

  while (((estadopulsador4==HIGH || estadopulsador3 == HIGH) && estadopulsador5 == LOW  ))//contacto grifo o contacto ducha sin bypass tambien funciona con el controlador encendido
  {
    digitalWrite(salida13, HIGH);//enciendo bomba de agua

  }

  //*********************caso2 grifo o ducha agua caliente con bypass***************************

  while ((estadopulsador5 == HIGH && (estadopulsador3== HIGH | estadopulsador4 == HIGH)))// && (estadopulsador6 == LOW && estadopulsador2 == LOW))//con bypass y contacto grifo o contacto ducha e intreptor controlador off
  {

    {
      digitalWrite(salida11, HIGH);//abro la ev1
      delay(1000);
      digitalWrite(salida12, HIGH);//alimento calentador
    }
  }
}

Pon || en lugar de | en la condición or del while

¿De cual de los dos no sale?
¿Los pulsadores funcionan bien? Asegurate de que cuando pulsas cambian de estado.
Prueba con

while ((estadopulsador5 == HIGH && (estadopulsador3== HIGH || estadopulsador4 == HIGH)))

Dos | en lugar de una se que hay una ligera diferencia en la comparación (al menos en C#).

Cuentanos cuando quieres que salga del while,

En el primero siria mientras que este pulsado el pulsador 4 o 3 y no este pulsado el 5 se mantiene, y el segundo se mantiene mientras esten pulsados a la vez el 5 y el 3 o el 4
¿ Es así?.

Tampoco es eso, de hecho es así como lo tengo en el caso 1 y tampoco me sale del while, habrá alguna llave mal puesta?...

Ahora que lo dices tienes dos llaves de mas en el 2º while

 { [b]ESTA[/b]
      digitalWrite(salida11, HIGH);//abro la ev1
      delay(1000);
      digitalWrite(salida12, HIGH);//alimento calentador
    } [b]Y ESTA[/b]

rodripelto perdona en el post de antes nos pisamos y no te había leido aún. si la lógica es como dices, cierto esas llaves sobraban pero no me ha variado nada.

Todos estos casos los tenía por separado con if-else y los simulo con un pequeño simulador fisico que hice para funciones lógicas, por separado todos los casos me funcionaron bien, pero ahora me da rabia que no sepa o pueda usar el while pues ni en el caso 1 que es el mas sencillo, sale del bucle.. a ver si conseguimos una solución.

Saludos y gracias.

Bueno, claro, me he dado cuenta ahora, es imposible conseguir l,o que quieres tal como lo tienes.

el estado de las variables estdaopulsador, una vez que entras en el while nunca cambian.
Prueba esto

//***seguir en este

//variables de entrada
const int pulsador2 = 2;     //
const int pulsador3 = 3;     //
const int pulsador4 = 4;     //
const int pulsador5 = 5;     //
const int pulsador6 = 6;     //
const int pulsador7 = 7;     //

int estadopulsador2 = 0;         //
int estadopulsador3 = 0;         //
int estadopulsador4 = 0;         //
int estadopulsador5 = 0;         //
int estadopulsador6 = 0;         //
int estadopulsador7 = 0;         //

//variables de salida
const int salida13 =  13;
const int salida12 =  12;
const int salida11 =  11;
const int salida10 =  10;
const int salida9 =  9;
const int salida8 =  8;

//variables para reset salidas
int estadosalida13 = 0;
int estadosalida12 = 0;
int estadosalida11 = 0;
int estadosalida10 = 0;
int estadosalida9 = 0;
int estadosalida8 = 0;



void setup() {

  pinMode(pulsador2, INPUT); //contacto controlador
  pinMode(pulsador3, INPUT); //contacto grifo
  pinMode(pulsador4, INPUT); //interruptor ducha
  pinMode(pulsador5, INPUT); //bypas
  pinMode(pulsador6, INPUT); //interuptor on/off controlador
  pinMode(pulsador7, INPUT);

  pinMode(salida8, OUTPUT);
  pinMode(salida9, OUTPUT);  //alimentación controlador on/off
  pinMode(salida10, OUTPUT); //ev2
  pinMode(salida11, OUTPUT); //ev1
  pinMode(salida12, OUTPUT); //calentador
  pinMode(salida13, OUTPUT); //bomba de agua

}

void loop() {

  //lectura pulsadores

  comprobarpulsadores();

  //reset casos
  estadosalida13 = digitalRead (salida13);
  estadosalida12 = digitalRead (salida12);
  estadosalida11 = digitalRead (salida11);
  estadosalida10 = digitalRead (salida10);
  estadosalida9 = digitalRead (salida9);
  estadosalida8 = digitalRead (salida8);

    //Reset salidas
    if (estadosalida13 == HIGH)
    { digitalWrite (salida13, LOW);
    }
    if (estadosalida12 == HIGH)
    { digitalWrite (salida12, LOW);
    }
    if (estadosalida11 == HIGH)
    { digitalWrite (salida11, LOW);
    }
    if (estadosalida10 == HIGH)
    { digitalWrite (salida10, LOW);
    }
    if (estadosalida9 == HIGH)
    { digitalWrite (salida9, LOW);
    }
    if (estadosalida8 == HIGH)
    { digitalWrite (salida8, LOW);
    }
 



  //caso1 grifo o ducha agua fria********************************************

  while (((estadopulsador4==HIGH || estadopulsador3 == HIGH) && estadopulsador5 == LOW  ))//contacto grifo o contacto ducha sin bypass tambien funciona con el controlador encendido
  {
    digitalWrite(salida13, HIGH);//enciendo bomba de agua
    comprobarpulsadores();// Compruebo el estado de los pulsadores
  }

  //*********************caso2 grifo o ducha agua caliente con bypass***************************

  while ((estadopulsador5 == HIGH && (estadopulsador3== HIGH | estadopulsador4 == HIGH)))// && (estadopulsador6 == LOW && estadopulsador2 == LOW))//con bypass y contacto grifo o contacto ducha e intreptor controlador off
  {

    {
      digitalWrite(salida11, HIGH);//abro la ev1
      delay(1000);
      digitalWrite(salida12, HIGH);//alimento calentador
      comprobarpulsadores();// Compruebo el estado de los pulsadores
    }
  }
}
void comprobarpulsadores()
 {
  estadopulsador2 = digitalRead(pulsador2);
  estadopulsador3 = digitalRead(pulsador3);
  estadopulsador4 = digitalRead(pulsador4);
  estadopulsador5 = digitalRead(pulsador5);
  estadopulsador6 = digitalRead(pulsador6);
  estadopulsador7 = digitalRead(pulsador7);
 }

MUCHÍSIMAS GRACIAS rodripelto !!! diste en el clavo, por cierto ahora me gustaría que me explicaras porqué hubo que colocar la variable, yo creía que while siempre está comprobando la condición.

Al final nada que ver el código inicial de if-else con el final jejeje

//***seguir en este

//variables de entrada
const int pulsador2 = 2;     //
const int pulsador3 = 3;     //
const int pulsador4 = 4;     //
const int pulsador5 = 5;     //
const int pulsador6 = 6;     //
const int pulsador7 = 7;     //

int estadopulsador2 = 0;         //
int estadopulsador3 = 0;         //
int estadopulsador4 = 0;         //
int estadopulsador5 = 0;         //
int estadopulsador6 = 0;         //
int estadopulsador7 = 0;         //

//variables de salida
const int salida13 =  13;
const int salida12 =  12;
const int salida11 =  11;
const int salida10 =  10;
const int salida9 =  9;
const int salida8 =  8;

//variables para reset salidas
int estadosalida13 = 0;
int estadosalida12 = 0;
int estadosalida11 = 0;
int estadosalida10 = 0;
int estadosalida9 = 0;
int estadosalida8 = 0;



void setup() {

  pinMode(pulsador2, INPUT); //contacto controlador
  pinMode(pulsador3, INPUT); //contacto grifo
  pinMode(pulsador4, INPUT); //interruptor ducha
  pinMode(pulsador5, INPUT); //bypas
  pinMode(pulsador6, INPUT); //interuptor on/off controlador
  pinMode(pulsador7, INPUT);

  pinMode(salida8, OUTPUT);
  pinMode(salida9, OUTPUT);  //alimentación controlador on/off
  pinMode(salida10, OUTPUT); //ev2
  pinMode(salida11, OUTPUT); //ev1
  pinMode(salida12, OUTPUT); //calentador
  pinMode(salida13, OUTPUT); //bomba de agua

}

void loop() {

  //lectura pulsadores

  comprobarpulsadores();

  //reset casos
  estadosalida13 = digitalRead (salida13);
  estadosalida12 = digitalRead (salida12);
  estadosalida11 = digitalRead (salida11);
  estadosalida10 = digitalRead (salida10);
  estadosalida9 = digitalRead (salida9);
  estadosalida8 = digitalRead (salida8);

  //Reset salidas
  if (estadosalida13 == HIGH)
  { digitalWrite (salida13, LOW);
  }
  if (estadosalida12 == HIGH)
  { digitalWrite (salida12, LOW);
  }
  if (estadosalida11 == HIGH)
  { digitalWrite (salida11, LOW);
  }
  if (estadosalida10 == HIGH)
  { digitalWrite (salida10, LOW);
  }
  if (estadosalida9 == HIGH)
  { digitalWrite (salida9, LOW);
  }
  if (estadosalida8 == HIGH)
  { digitalWrite (salida8, LOW);
  }




  //*********************caso1 grifo o ducha agua fria**************************************** ok 09/08

  while (((estadopulsador4 == HIGH || estadopulsador3 == HIGH) && estadopulsador5 == LOW  )) //contacto grifo o contacto ducha sin bypass tambien funciona con el controlador encendido
  {
    digitalWrite(salida13, HIGH);//enciendo bomba de agua
    comprobarpulsadores();// Compruebo el estado de los pulsadores

  }

  //*********************caso2 grifo o ducha agua caliente con bypass*************************** ok09/08
  while (estadopulsador5 == HIGH)

  {
    if (estadopulsador3 == HIGH || estadopulsador4 == HIGH)
    {
      digitalWrite(salida11, HIGH);//abro la ev1
      delay(200);
      digitalWrite(salida12, HIGH);//alimento calentador
    }
    else
    {
      digitalWrite(salida12, LOW);
      delay(200);
      digitalWrite(salida11, LOW);
    }

    comprobarpulsadores();// Compruebo el estado de los pulsadores
  }


  //****************caso3 recirculado de agua hasta consigna del controlador y posibilidad de abrir o cerrar grifo************ ok09/08

  while (estadopulsador6 == HIGH && estadopulsador5 == LOW) //interruptor on/off controlador y bypass cerrado
  {
    digitalWrite(salida9, HIGH); //enciendo controlador

    if (estadopulsador2 == HIGH)
    { digitalWrite (salida10, HIGH);// enciendo ev2
      delay (200);
      digitalWrite (salida12, HIGH);// enciendo calentador
    }
    else
    { digitalWrite (salida12, LOW);
      delay (200);
      digitalWrite (salida10, LOW);
    }
    if (estadopulsador3 == HIGH || estadopulsador4 == HIGH)
    {
      digitalWrite (salida13, HIGH);
    }
    else
    {
      digitalWrite (salida13, LOW);
    }

    comprobarpulsadores();// Compruebo el estado de los pulsadores
  }


}
void comprobarpulsadores()
{
  estadopulsador2 = digitalRead(pulsador2);
  estadopulsador3 = digitalRead(pulsador3);
  estadopulsador4 = digitalRead(pulsador4);
  estadopulsador5 = digitalRead(pulsador5);
  estadopulsador6 = digitalRead(pulsador6);
  estadopulsador7 = digitalRead(pulsador7);
}

Saludos y gracias

A ver si consigo explicarlo bien.

While esta comprobando la variable en cada vuelta, pero la variable no se actualiza sola.
Tu lo hacias al principio del loop por lo que al llegar al while se queda dando vueltas esperando a cumplir la condiciones, por lo que nunca volvia al principio del loop.
Otra opción habría sido leer directamente el PIN de los botones directamente en el while.
Por ejemplo
while(digitalRead(pulsador2)==HIGH)
Así no necesitarlas actualizar las variables, directamente compruebas los botones.
Personalmente ésta opción me gusta mas, ahorras memoria en variables y bajo mi punto de vista mejoras en rendimiento.