Poll
Question: como puedo solucionar
como puedo solucionar - 0 (0%)
o si hay alguna alternativa - 1 (100%)
Total Voters: 1

Pages: [1]   Go Down
Author Topic: NO puedo salir del bucle do.. while  (Read 2184 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muy buenas!soy nuevo en esto del andruino y llevo un día programando y me esta constando solucionar un problema,mi intención es desarrollar un contador que pueda ser programable y que descuente con flanco a 1 mediante un pulsador a una entrada. Aquí dejo el programa que aun no lo e podido solucionar, a la hora de compilar me da un error en la linea


#include <LiquidCrystal.h>              //incluimos la libreria LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  //inicializamos los pines

int mas=0;                                   //Variable a mostrar por LCD mas de litros
int menos=0;                                //Variable a mostrar por LCD menos de litros
int contador=0;                             //Contador de litros
int led=13;                                   //Salida de Valvula
int conta=0;                                 //Litros totales

int msg=0;                                   //Barrera para el mensaje de bienvenida
int start=A2;                                //Pulsador de comienzo
int comienzo=1024;                       //Varible para almacenaje del pulsador de arranque

int buths=A0;                               //Pulsador de aumento en litros
int buthr=A1;                               //Pulsador de decremento en litros

int flujo=A3;                                //Contador de flujo

int varbuths=0;                             //Variable que almacena el valor del pulsador de suma
int varbuthr=0;                             //Variable que almacena el valor del pulsador de resta            
 

void setup()                                 //Se invoca una vez solo cuando se inicia el programa

{
  lcd.begin(16, 2);                         //tamaño de la LCD
  pinMode(buths,INPUT);                 //pulsador de suma de litros
  pinMode(buthr,INPUT);                 //Pulsador de resta de litros
  pinMode(start,INPUT);                  //Pulsador de comienzo
  pinMode(flujo,INPUT);                  //Contador de litros
  pinMode(led,OUTPUT);                 //LED de desactivacion

  msg=0;                                
  comienzo=1024;                        
  
  varbuths=1;
  varbuthr=1;
}


void loop()                            
{
  if(msg==0)
  {
    lcd.setCursor(0,0);
    lcd.print("Programa de");
    lcd.setCursor(0,1);
    lcd.print("Automatizacion");
    delay(2500);                        
    msg=1;
    lcd.clear();                      
  }

  do
  {
    varbuths=analogRead(buths);        
    varbuthr=analogRead(buthr);        

    if(varbuths == 0)                  
    {
      mas = mas + 1;
      delay(250);
    }

    lcd.setCursor(0,0);
    lcd.print("Elige litros");
    lcd.setCursor(4,1);
    lcd.print(conta)
    

    comienzo = analogRead(start)  
    
    
    if(comienzo == 0)                  
    {
    conta = mas;
    }
    
    } while(comienzo != 0);   aquí es donde me da error.        


//Fin programa


si pudierais ayudarme, os lo agradeceria.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puede que en tu sketch la entrada analógica  nunca se ponga a cero.

Has probado con un Serial.print( comienzo ); y forzar la circunstancias que provocan el fin del bucle.
Logged


Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Por el título del post, parece que no puedes salir del bucle cuando ejecutas tu código, sin embargo, luego dices que te da errores de compilación. ¿Cúal es el problema de verdad?

Si el código que utilizas es el que has puesto, entonces si que tienes errores de compilación. Te faltan los ";" al final de varias líneas y la llave que cierra el loop. No sé si son errores al poner el código en el post o los fallos que no sabes solucionar.

PD:  La próxima vez usa otro color que se vea mejor para destacar el código, el amarillo hace daño a la vista  smiley-cool y no se puede leer....incluso podrías usar el botón de insertar código (el del icono #).

Ya nos dirás.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muy buenas Compañeros!y gracias por vuestra comprensión, acabo de llegar a casa y me puesto con el programa, e conseguido poder mostrar en pantalla la selección de una variable(litros a llenar) y poder poner a mi antojo los que quiera, el problema que tengo, es que no consigo que mediante un botón a una entrada por ejemplo A3 de comienzo otro bucle, donde estoy preparando, para que cuente hacia adelante hasta llegar a lo seleccionado anteriormente y se me active al final una salida, con esto ya tendría mi primer programa finalizado, ayer por mi ignorancia no lo explique muy bien, ya que este es el 2º día que estoy programando con arduino.

aqui muestro el codigo:


#include <LiquidCrystal.h>              //incluimos la libreria LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  //inicializamos los pines

int mas=0;                              //Variable a mostrar por LCD mas de litros
int menos=0;                            //Variable a mostrar por LCD menos de litros
int contador=0;                         //Contador de litros
int led=13;                             //Salida de Valvula
int conta=000;                            //Litros totales

int msg=0;                              //Barrera para el mensaje de bienvenida
int start=A2;                           //Pulsador de comienzo
int varcomienzo=0;                      //Varible para almacenaje del pulsador de arranque

int buths=A0;                           //Pulsador de aumento en litros
int buthr=A1;                           //Pulsador de decremento en litros

int flujo=A3;                           //Contador de flujo

int varbuths=0;                         //Variable que almacena el valor del pulsador de suma
int varbuthr=0;                         //Variable que almacena el valor del pulsador de resta             


void setup()                            //Se invoca una vez solo cuando se inicia el programa

{
  lcd.begin(16, 2);                     //Cofiguramos el tamaño de la LCD
  pinMode(buths,INPUT);                 //pulsador de suma de litros
  pinMode(buthr,INPUT);                 //Pulsador de resta de litros
  pinMode(start,INPUT);                 //Pulsador de comienzo
  pinMode(flujo,INPUT);                 //Contador de litros
  pinMode(led,OUTPUT);                  //LED de desactivacion

  msg=0;                                //Barrera del mensaje de bienvenida

 
  varbuths=0;
  varbuthr=0;
}
//------------------------------------
//Funcion ciclicla
//------------------------------------

void loop()                            //Se ejecuta de forma ciclica
{
  if(msg==0)
  {
    lcd.setCursor(0,0);
    lcd.print("Programa de");
    lcd.setCursor(0,1);
    lcd.print("Automatizacion");
    delay(2500);                       //Rotamos la posion de la cedena
    msg=1;
    lcd.clear();                       //Borramos todos los datos de la lCD
  }

 
 do
{
    varbuths=analogRead(buths);        //Leemos boton de añadir litros
    varbuthr=analogRead(buthr);        //Leemos boton de quitar litros

    if(varbuths == 0)                  //Si el boton ha sido pulsado, aumentamos los litros
    {
      conta=conta +1;
      delay(250);
    }
   
    if(varbuthr == 0)                  //Si el boton ha sido pulsado, quitamos litros
    {
      conta=conta-1;
      delay(250);
     
      if (conta<0)                     //Condicion para que no pase de 0 a -1
      {
        conta=0;
      }
     
    }
   
    lcd.setCursor(0,0);
    lcd.print("Elige litros");
    lcd.setCursor(4,1);
    lcd.print("    ");
    lcd.setCursor(4,1);
    lcd.print(conta);

    varcomienzo=analogRead(start);        //Lee el estado del pulsasdor de arranque
    }while(varcomienzo !=0);

   
En este paso me hago un poco de lio y no e acertado con la solución.
   
    do
    {
    lcd.setCursor(0,0);
    lcd.print("Comienzo");
    lcd.setCursor(0,1);
    lcd.print(conta--);
    }while(conta>=0);
}
//Fin programa



Bueno y aquí mi primer programa que seguro q se podría mejorar, pero tiempo al tiempo, el maestro se hizo con la experiencia, así que espero sugerencias, sin vosotros esto no seria =.
Muchas gracias!!
Logged

Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno, vamos avanzando: ya no utilizas el amarillo (bien!!!  smiley), ahora solo tienes que usar el icono "#" para insertar el código.

Si utilizas pulsadores, ¿¿¿Por qué haces lecturas analógicas??? Mira el ejemplo Button (File/Examples/2.Digital/Button) y molificado para los tres pulsadores que utilizas, te quedará un código muuuuucho más sencillo (incluso sin el do...while)

Code:
  if (buttonState1 == HIGH) {     
    // Acción botón 1   
  }
  if (buttonState2 == HIGH) {     
    // Acción botón 2   
  }
  if (buttonState3 == HIGH) {     
    // Acción botón 3   
  }

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias otra vez!probare a modificar como tu bien has dicho la instrucción que empleado por la que tu has mencionado Jorge, mañana lo probare, bueno y acerca de como saldrías del bucle do while.. no se te ocurre algo, bueno seguiré peleando, buenas noches
Logged

Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ya te he dicho que no es necesario que implementes ningún bucle. La aplicación que estas realizando es una cuenta atrás desde un valor configurable. Tienes un pulsador '+'  que aumenta el valor en 1, un '-' que disminuye el valor en 1 y un pulsador 'Start' para comenzar la cuenta atrás. El código del loop tiene que ser algo parecido a lo siguiente:
Code:
  if (buttonState1 == HIGH) {     
    // Acción botón 1 - Sumar 1 a contador   
    Contador++;
  }
  if (buttonState2 == HIGH) {     
    // Acción botón 2 - Restar 1 a contador
    Contador--;
  }
  if (buttonState3 == HIGH) {     
    // Acción botón 3 - Iniciar cuenta atrás
    CuentaAtras = 1;   
  }

  if (CuentaAtras == 1) {     
    lcd.setCursor(0,0);
    lcd.print("Comienzo");
    while(Contador)      // Vas disminuyendo el valor conforme se repite el bucle
    {
        lcd.setCursor(0,1);
        lcd.print(conta--);
    }
    CuentaAtras = 0;
  }

Otro detalle que veo es el contenido del if(msg==1), es algo que solo quieres que se ejecute una vez al principio, entonces ponlo directamente en el sertup() y no necesitarás la variable msg.
Code:
void setup()                            //Se invoca una vez solo cuando se inicia el programa
{
  lcd.begin(16, 2);                     //Cofiguramos el tamaño de la LCD
  pinMode(buths,INPUT);                 //pulsador de suma de litros
  pinMode(buthr,INPUT);                 //Pulsador de resta de litros
  pinMode(start,INPUT);                 //Pulsador de comienzo
  pinMode(flujo,INPUT);                 //Contador de litros
  pinMode(led,OUTPUT);                  //LED de desactivacion

  varbuths=0;
  varbuthr=0;

  lcd.setCursor(0,0);
  lcd.print("Programa de");
  lcd.setCursor(0,1);
  lcd.print("Automatizacion");
  delay(2500);                       //Rotamos la posion de la cedena
  lcd.clear();                       //Borramos todos los datos de la lCD
}

Logged

Pages: [1]   Go Up
Jump to: