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.
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.
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.
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.
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"
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 ==================