INSTRUCCION WHILE " rebelde" ??

Hola amigos:

Estoy hace tiempo peleándome con la sentencia WHILE en varios programas y no le encuentro el "truco" para hacerla funcionar correctamente.

Os envío uno de los programas.

Llevando el pulsador al estado LOW no produce el cambio deseado: (que no funcione la instrucción siguiente). Sigue parpadeando !!!

/*
      
      APLICACIÓN DE "WHILE"
        
  CIRCUITO;
 * LEDS conectados a PINS: 10,11 y 12 y a través de resistencia 
 * 260 ohms con GND(-).
 * Pulsador conectado entre pin 2 y 5V(+)
 * Resistencia 10K conectada entre pin 2 y GND(-).            
 
*/

      
       
    const int pulsPin = 4; // el numero del pin pulsador(ENTRADA)
    const int ledPin1 = 10; // el numero de los pin LED (SALIDAS)
    const int ledPin2 = 11;
    const int ledPin3 = 12;
                 
  void setup()
{                              
      pinMode(pulsPin, INPUT);  // "pulsPin" entrada pulsador                                
      pinMode(ledPin1, OUTPUT); // id los "ledPin" para salida
      pinMode(ledPin2, OUTPUT);
      pinMode(ledPin3, OUTPUT);          
} 
  void loop()
  {      
   int pulsEstado = digitalRead(pulsPin);// lee el valor  del pulsador:
      
   int espera1 = 500; //Cambia tiempo  LOOP
      
    
    while(pulsEstado == HIGH) 
  {    
                                         
    digitalWrite(ledPin1, HIGH); 
    delay(espera1);
    digitalWrite(ledPin1, LOW);
    delay(espera1);
    digitalWrite(ledPin2, HIGH);
    delay(espera1);
    digitalWrite(ledPin2, LOW);
    delay(espera1);
    digitalWrite(ledPin3, HIGH);
    delay(espera1);
    digitalWrite(ledPin3, LOW);
    delay(espera1);   
  } 
  } 
 //  ==================  FIN  ==================

Como siempre, espero de vuestros conocimientos una ayuda.

Muchas gracias !!!

en realidad si funciona, lo que ocurre es que tu le dices a tu programa esto

cada pulsEstado == HIGH demora

    digitalWrite(ledPin1, HIGH); 
      delay(500);
      digitalWrite(ledPin1, LOW);
      delay(500);
      digitalWrite(ledPin2, HIGH);
      delay(500);
      digitalWrite(ledPin2, LOW);
      delay(500);
      digitalWrite(ledPin3, HIGH);
      delay(500);
      digitalWrite(ledPin3, LOW);
      delay(500);

3 segundos en ejecutarse y mientras tu cambias esperando que haga otra cosa pero en realidad hace lo que le pediste que hiciera.

Hola surbyte !!

Es un placer volver a contactar contigo, sigo regularmente el Foro y veo que haces una tarea realmente encomíable ( como tus otros compañeros )

Volvamos a la cuestión.

== El problema es: No es que yo cambie de estado el pulsador mientras se ejecuta la instrucción, sino que, manteniendo el nuevo estado durante un tiempo no cambia y sigue el loop de encendido y apagado sucesivo de los leds ?.

Lo he probado con INPUT_PULLUP y pasa igual !!

Y el caso es, que he montado algún circuito mucho mas complicado con la sentencia WHILE sin problemas.

Saludos y muchas gracias !!

Entonces vuelve a lo básico.

Realmente tu pulsador detecta HIGH y LOW.
Esta claro que HIGH lo detecta, pero ve el LOW?

Escribe otro sketch y prueba solo el pulsador y mira por el monitor serie.

Saludos surbyte

En días próximos haré varias pruebas .

Ya te explicare...

Como siempre gracias !!!

Mira el ejemplo básico del IDE que testea un pulsador y verifica que funciona.
O usa un multímetro y mira que ocurre.
Tu crees que cambia a LOW. Eso nunca lo asegures hasta verlo.

Hola surbyte

Probare tus sugerencias,,,,

Hasta pronto !!

Buenas
tu problema esta en el concepto de while

tu while se ejecuta eternamente ya que una vez entras no cambias el valor del "pulsEstado" dentro de el por lo que no puede salir de ahi es eterno

pon

while(pulsEstado == HIGH) 
{    
                                       
  digitalWrite(ledPin1, HIGH); 
  delay(espera1);
  digitalWrite(ledPin1, LOW);
  delay(espera1);
  digitalWrite(ledPin2, HIGH);
  delay(espera1);
  digitalWrite(ledPin2, LOW);
  delay(espera1);
  digitalWrite(ledPin3, HIGH);
  delay(espera1);
  digitalWrite(ledPin3, LOW);
  delay(espera1);
  pulsEstado = LOW;
}

que seria equivalente a poner if(pulsEstado==high){...}

es un problema de concepto de while

Por favor, pon tu código entre tags.

jaking:
Buenas
tu problema esta en el concepto de while

tu while se ejecuta eternamente ya que una vez entras no cambias el valor del "pulsEstado" dentro de el por lo que no puede salir de ahi es eterno

pon

while(pulsEstado == HIGH) 

{    
                                     
 digitalWrite(ledPin1, HIGH);
 delay(espera1);
 digitalWrite(ledPin1, LOW);
 delay(espera1);
 digitalWrite(ledPin2, HIGH);
 delay(espera1);
 digitalWrite(ledPin2, LOW);
 delay(espera1);
 digitalWrite(ledPin3, HIGH);
 delay(espera1);
 digitalWrite(ledPin3, LOW);
 delay(espera1);
 pulsEstado = LOW;
}




que seria equivalente a poner if(pulsEstado==high){...}

es un problema de concepto de while

Hola jacking !!

ACTUALICEMOS LA DISCUSIÓN:

1 - He probado el programa que os presenté originalmente en otro ordenador y FUNCIONA BIEN !!, hace el cambio de instrucción cuando cambio el estado LOW / HIGH .

2 - No he entendido lo que comentas:...ya que una vez entras no cambias el valor del "pulsEstado" dentro de el por lo que no puede salir de ahi es eterno....

Estoy preparando otro programa con monitor serial para comprobar las variaciones dentro del sketch.
Ya os pasare algunas curiosidades.

De todas maneras GRACIAS !!

Lo que quiero decir es que el while te va a leer la condición "pulsEstado == HIGH" y una vez entra va a ejecutar todo lo que este en el, cuando llega a la ultima linea del "while", sube y vuelve a preguntarse
es "pulsEstado == HIGH"?
como tu no pones dentro nada que pueda cambiar el valor de "pulsEstado" siempre seguirá dentro ya que siempre dará "HIGH" una vez a entrado por eso te digo que si no actualizas el valor jamas podrás salir de ahí y por tanto no podrá comprar el cambio de "HIGH" a "LOW"

Deberias cambiarlo por:

if (pulsEstado == HIGH)

Hector_A:
Por favor, pon tu código entre tags.

Hector_A
Es a mi, a quien envias esa advertencia ? ?

jose:
Deberias cambiarlo por:

if (pulsEstado == HIGH)

Gracias jose

Pero lo que necesitaba es la utilización de WHILE para otros sketch en los que ordéne:

WHILE (MIENTRAS) que la entrada sea LOW o HIGH,(segun el caso) .: Haz esta instruccion

Gracias igualmente !!

otra forma de usarlo con el while sería asi

while(pulsEstado == HIGH) {    
            
  digitalWrite(ledPin1, HIGH); 
  delay(espera1);
  digitalWrite(ledPin1, LOW);
  delay(espera1);
  digitalWrite(ledPin2, HIGH);
  delay(espera1);
  digitalWrite(ledPin2, LOW);
  delay(espera1);
  digitalWrite(ledPin3, HIGH);
  delay(espera1);
  digitalWrite(ledPin3, LOW);
  delay(espera1);
  pulsEstado = digitalRead(pulsPin);// lee el valor  del pulsador:
}

Hola amigos

Despues de dar vueltas a la instruccion WHILE que me daba problemas, creo que ya estoy en el buen camino.
Por si le sirve de ayuda a alguien:
Adjunto os envio un sketch con un aplicación de WHILE con visualización de monitor, que nos da la visión de como se va desarrollando el programa.

He escrito ahora: while(digitalRead(PinPuls) == LOW)
Antes ponia: while(pulsEstado == LOW) -funcionamiento incierto -(pero no daba error de compilación)

Ya me direis si os parece correcto

Gracias a todos por la colaboración ! !

 /*
  
  A-APLICACION-WHILE
    APLICACIÓN DE "WHILE" , INPUT_PULLUP Y MONITOR SERIAL.
    Efecto: CADENA LUCES(RATA) mientras (while) está en LOW
    Con HIGH se abstiene.  
         
  CIRCUITO;
 * LEDS conectados a PINS: 10,11 y 12 y a través de 
 * resistencias 260 ohms con GND(-).
 * Conmutador o pulsador conectado entre pin 2 y 
 * resistencia 10K a GND(-).(INPUT_PULLUP)
 
            ============= ENGRAL ================= 
 */

       // CONSTANTES SIN CAMBIO: 
       
const int PinPuls = 2;       // el numero del pin del Conmutador o pulsador(ENTRADA)
const int PinLed1= 10;      // el numero de los pin LED (SALIDAS)
const int PinLed2= 11;
const int PinLed3= 12;
    
  int espera1 = 300;  // tiempos de espera    
  int espera2 = 500;         
  
void setup()
{                              
      pinMode(PinPuls, INPUT_PULLUP);//inicializa "PinPuls" entrada pulsador                                
      pinMode(PinLed1, OUTPUT);   // id los "PinLed" para salida
      pinMode(PinLed2, OUTPUT);
      pinMode(PinLed3, OUTPUT);
      Serial.begin(9600);          
} // LL-SETUP
 
 void loop()
  {     Serial.println("EMPIEZA LOOP"); 
      int estadoPin = digitalRead(PinPuls);
            
      Serial.print("NIVEL PULSADOR = ");// Escribe el estado de "PinPuls" 
      Serial.println(digitalRead(PinPuls));
      delay(espera2);
                          
    while(digitalRead(PinPuls) == LOW) 
 {         
    Serial.print("ESTADO PULSADOR = ");   
    Serial.println(digitalRead(PinPuls));// Escribe el estado de "PinPuls" 
    delay(espera2);
    
    
    Serial.println("EMPIEZA RATA ");
    Serial.println("");//Espacio en blanco
    
    Serial.println("ENCIENDE LED 1");                                                                            
    digitalWrite(PinLed1, HIGH); 
    delay(espera1);                
    digitalWrite(PinLed1, LOW);
    delay(espera1);
    
    Serial.println("ENCIENDE LED 2");
    digitalWrite(PinLed2, HIGH);
    delay(espera1);    
    digitalWrite(PinLed2, LOW);
    delay(espera1);
    
    Serial.println("ENCIENDE LED 3");
    digitalWrite(PinLed3, HIGH);
    delay(espera1);
    digitalWrite(PinLed3, LOW);
    delay(espera1);
    
    Serial.println("FINAL RATA");
    Serial.println("");  // Espacio en blanco.
  } // LL-WHILE
}// LL-LOOP

 //  ==================  FIN SKETCH ==================