Go Down

Topic: Salir de bucle con entrada de serie (Read 106 times) previous topic - next topic

monicaco1

Nov 09, 2018, 10:50 am Last Edit: Nov 09, 2018, 10:55 am by monicaco1 Reason: error tipográfico
Hola a todos.
Ando con mi primer proyecto y... mi primer atasco.
:D

He mirado en el foro y, aunque he encontrado varios posts sobre salir de bucles, no he visto ninguno que resuelva el problema específico que me ha surgido.

La idea es controlar una serie de salidas con el puerto de serie, entre ellas unos leds.
Los leds tienen que encenderse progresivamente con una entrada del puerto ('1') y quedarse oscilando (como si fuesen un fuego. Luego, con otra pulsación ('2') se deberían apagar.


He escrito unas funciones a las que llamo desde el loop, una para encender, otra para apagar y otra para la oscilación del led:
Code: [Select]
void setup()
{
Serial.begin(9600);
pinMode(led, OUTPUT);
}

void loop()
{
if (Serial.available() > 0)
  {
    estado = Serial.read();
  }


if (estado == '1')
  {
    encendido();
    flame();
  }


  if (estado == '2')
  {
    apagado();
  }

}




Esta es la función que contiene el código para simular la oscilación del led:
Code: [Select]

void flame()
{
  
  for (; estado == '2'; i = random(120) + 135)
  {
    analogWrite(led, i);
    delay(15);
  }
}

en la que "i" es la variable que uso para aumentar y disminuir la luminosidad del led.

En general, el sketch funciona en cuanto a las entradas del puerto serie y todo eso, el problema es que no consigo salir del loop cuando pulso ('2') a pesar de que el for incluye esa condición (for; estado == '2'; i = random(120) + 135).

He probado a sustituir esa condición por otra, por ejemplo una variable bool que cambia cuando pulso el apagado... pero nada.
Es como si, una vez que entra en ese bucle ya no escucha las entradas del puerto serie.

Alguien que sepa más de programación que yo (o sea, el resto de la humanidad) puede ayudarme? Intuyo que es un problema básico de planteamiento propio de un novato como yo.

Gracias de antemano.

:-)



surbyte

Lo primero es que postees siempre TODO el código no parcializado.
Ejemplo es que este código si lo uno, no puede compilar porque

estado no esta definido.

Asi que supongamos lo defino como int estado y además como global o sea antes del setup

me dice que led no esta definido y de nuevo, defino a led de este modo

Code: [Select]
const byte led = 13;

y una vez mas tengo errores de que

encendido() y apagado() no esta definidos por lo que te voy  a pedir que coloques el código completo


monicaco1

Muchas gracias surbyte.

Pues este es el último código que escribí, en el que traté de usar (sin éxito) una variable lógica para salir del bucle:

Code: [Select]

int led = 9;
int estado = 0;
int i = 0;
bool b = false;

void apagado()
{
  for (i = 256; i > 0; i--)
  {
    analogWrite(led, i);
    delay(4);
    digitalWrite(led, LOW);
  }
}


void encendido()
{

  for (i = 0; i < 256; i++)
  {
    analogWrite(led, i);
    delay(4);
  }
}


void flame()
{
 
  for (;b = true ; i = random(120) + 135)
  {
    analogWrite(led, i);
    delay(15);
  }
}



void setup()
{
Serial.begin(9600);
pinMode(led, OUTPUT);
}



void loop()
{
if (Serial.available() > 0)
  {
    estado = Serial.read();
  }


if (estado == '1')
  {
    encendido();
    flame();
  }


  if (estado == '2')
  {
    b = true;
    apagado();
  }

}




Espero que así sea más fácil detectar mi error.

Un saludo y muchas gracias.


:-)

GO_zalo

#3
Nov 09, 2018, 01:56 pm Last Edit: Nov 09, 2018, 01:57 pm by GO_zalo
tu sistema es un poco complejo pero no voy a entrar a modificarlo todo

tu problema esta aqui, pone:

for (;b = true ; i = random(120) + 135)

cuando deberia poner

for (;b == true ; i = random(120) + 135)

monicaco1

Muchísimas gracias GO_zalo
Lo he cambiado tal como dices, pero sigue sin funcionar.

En cuanto a lo que dices de que el sistema te parece complejo, probablemente es porque no tengo mucha experiencia programando, pero si crees que se puede plantear de otra forma más simple, te lo agracecería sinceramente.
La idea es aprender...
:-)


Un saludo.



GO_zalo

claro ahora veo otro problema

que cuando estas en flame no estas leyendo el puerto serie, entonces no se entera de que pulses el dos para parar

otro fallo es también que cuando entras a una de la dos opciones no estabas borrando el valor leído, y al no hacerlo volvía entrar inmediatamente, a ti quizás este problema ni lo has notado por que tenias el serial monitor en "ambos NL & CR" y cada vez que pulsas te llegan tres caracteres y los otros dos son los que te hacen de 'borrado' (no se si me explico...)

te dejo aquí una modificación rudimentaria que funciona

Code: [Select]

int led = 9;
int estado = 0;
int i = 0;
bool b = false;

void apagado()
{
  Serial.println("apagado");
  for (i = 256; i > 0; i--)
  {
    Serial.print(".");
    analogWrite(led, i);
    delay(4);
    digitalWrite(led, LOW);
  }
  Serial.println();
}


void encendido()
{
Serial.println("encendido");
  for (i = 0; i < 256; i++)
  {
     Serial.print(",");
    analogWrite(led, i);
    delay(4);
  }
  Serial.println();
}


void flame()
{
  Serial.println("flame");
  for (;b = true ; i = random(120) + 135)
  {
     Serial.print("-");
    analogWrite(led, i);
    delay(15);
    if (Serial.available() > 0)
      {
        estado = Serial.read();
        if (estado == '2')
          {
            b = true;
            Serial.println();
            apagado();
            estado='0';
           
            return;
          }
      }
  }
}



void setup()
{
Serial.begin(9600);
pinMode(led, OUTPUT);
}



void loop()
{
if (Serial.available() > 0)
  {
    estado = Serial.read();
  }
 


if (estado == '1')
  {
    encendido();
    flame();
    estado='0';
  }

/*
  if (estado == '2')
  {
    b = true;
    apagado();
    estado='0';
  }
*/
 

}




y la salida por puerto serie es:

Code: [Select]

//aqui he pulsado 1
encendido
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
flame
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //aqui he pulsado 2
apagado
...

monicaco1

Un millón de gracias!!!!
Funciona perfectamente.


Ahora a analizar bien tus cambios para entenderlo todo y aprender de ello.

Un saludo y más gracias.


:-)




Go Up