Go Down

Topic: Como salir de un ciclo for? (Read 3925 times) previous topic - next topic

humbertog

Tengo un problemita y es el siguiente:

este es el pequeño programa que tengo el cual no es muy complicado es algo muy basico
#include <Servo.h>

Servo servo1;
void setup()
{
  servo1.attach(9);
}

void loop()
{
  for(int i=0; i<=45; i=i+1)
  {
   
     servo1.write(i);
     delay(100);
  }
}

en este programa lo que hago es aumentar de angulo de 1 en 1 hasta llegar a 45 grados al llegar a 45 este comienza de nuevo desde 0 grados.

el problema es que yo necesito que cuando llegue a 45 grados pare ahi mismo, se que puedo dar el angulo directamente de 0 a 45 de golpe pero no es correcto para lo que quiero realizar. con esto e intentado varias cosas agregandole if,con while etc. y no e podido e leido bastante e intentado muchas cosas y el ciclo continua sin parar en el angulo 45 que tengo que hacer? (soy aprendiz).

nayma

Hola humbertog,
te aconsejo te mires los tutoriales del playground que seguro te ayudaran mucho. Hay varias maneras de hacer lo que quieres, por ejemplo le puedes poner una condicion que se cumpla siempre una vez que ha llegado a la posición deseada, por ejemplo usando un while.

el problema es que yo necesito que cuando llegue a 45 grados pare ahi mismo, se que puedo dar el angulo directamente de 0 a 45 de golpe pero no es correcto para lo que quiero realizar.


Podría meter el for dentro de un if definiendo antes una variable de control.

Code: [Select]
go = true
if ( go == true ) {
for {}
go = FALSE }


Luego si quieres reactivar el servo por ejemplo con un botón seria añadir más código para cambiar la variable go a TRUE al pulsar el mismo.

Un saludo!

curro92

Hola,
Para salir de un for(;;) puedes usar break.

Cuando haya varios for() anidados, también se puede usar el goto, aunque se recomienda no abusar de ese recurso.



chocala

No seria más fácil usar un while?


#include <Servo.h>

Servo servo1;
int i = 0;

void setup()
{
  servo1.attach(9);
}

void loop()
{
  while(i<=45)
{
     servo1.write(i);
     delay(100);
     i++;
  }
}

PepeChorva


Hola,
Para salir de un for(;;) puedes usar break.

Cuando haya varios for() anidados, también se puede usar el goto, aunque se recomienda no abusar de ese recurso.


Cada vez que un programador usa un goto, $deity hace un corto en una placa  :smiley-mr-green:
Puedes meter ese for en el setup, si solo lo ha de realizar una vez, el loop es la rutina que va a estar siempre repitiéndose continuamente. El while que propone chocala también es una buena solución.
---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

nayma

hay muchas maneras de hacerlo:

#include <Servo.h>

Servo servo1;


void setup()
{
  servo1.attach(9);
}

void loop(){
     for (int i = 0; i < 45; i++){
           servo1.write(i);
           delay(100);
            i++;
     }
     while (1 == 1){//aquí podrías poner por ejemplo un botón por si quieres que vuelva a hacerlo
     delay (100);
}

Borrajo

si lo hace una sola vez, te conviene ponerlo en el setup().

Opcion 1 :

#include <Servo.h>

Servo servo1;

void setup(){
  servo1.attach(9);
  for (int i = 0; i < 45; i++){
           servo1.write(i);
           delay(100);
            i++;
     }
}

void loop(){
}

Opcion 2 :

como el loop() se repite indefinidamente, tenes que poner un corte de control. poniendo un if antes y utilizar una variable global como contador. 


#include <Servo.h>

Servo servo1;

int cant = 0 ;

void setup()
{
  servo1.attach(9);
}

void loop(){
if (cant < 1 ){                           // modificando la cantidad del if es la cantidad de veces que se hace!
     for (int i = 0; i < 45; i++){
           servo1.write(i);
           delay(100);
            i++;
     }
      delay (100);
cant++;
}
}

chocala


si lo hace una sola vez, te conviene ponerlo en el setup().

Opcion 1 :

#include <Servo.h>

Servo servo1;

void setup(){
  servo1.attach(9);
  for (int i = 0; i < 45; i++){
           servo1.write(i);
           delay(100);
            i++;
     }
}

void loop(){
}

Opcion 2 :

como el loop() se repite indefinidamente, tenes que poner un corte de control. poniendo un if antes y utilizar una variable global como contador. 


#include <Servo.h>

Servo servo1;

int cant = 0 ;

void setup()
{
  servo1.attach(9);
}

void loop(){
if (cant < 1 ){                           // modificando la cantidad del if es la cantidad de veces que se hace!
     for (int i = 0; i < 45; i++){
           servo1.write(i);
           delay(100);
            i++;
     }
      delay (100);
cant++;
}
}



en la opcion 1 dentro del for no hace falta poner i++ porque ya esta puesto en el incremento

PepeChorva

De hecho, es un error de programación, haces el incremento de 2 en 2, con lo que el for no da el resultado esperado.
---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

Lorizz

hola tengo el siguiente problema
//CONTROL DE CAJONES DE ESTACIONAMUENTO
int boton1 = 0;
int boton2 = 0;
int boton3 = 0;
int boton4 = 0;
void setup()
{
  pinMode(13,OUTPUT);
  pinMode(2,INPUT);
  pinMode(12,OUTPUT);
  pinMode(3,INPUT);
  pinMode(11,OUTPUT);
  pinMode(4,INPUT);
  pinMode(10,OUTPUT);
  pinMode(5,INPUT);
  pinMode(9,OUTPUT);
  pinMode(6,OUTPUT);
  Serial.begin(9600);
}

void loop(){
  boton1=digitalRead(2);
  if(boton1==HIGH){
    digitalWrite(13, HIGH);
    Serial.print("CAJON 1 OCUPADO");
   
  }
  else{
    digitalWrite(13,LOW);
    Serial.print("CAJO 1 DISPONIBLE");
  }

  boton2=digitalRead(3);
  if(boton2==HIGH){
    digitalWrite(12, HIGH);
    Serial.print("CAJON 2 OCUPADO");
  }
  else{
    digitalWrite(12,LOW);
    Serial.print("CAJON 2 DISPONIBLE");
  }

   boton3=digitalRead(4);
   if(boton3==HIGH){
    digitalWrite(11, HIGH);
    Serial.print("CAJON 3 OCUPADO");
  }
  else{
    digitalWrite(11,LOW);
    Serial.print("CAJON 3 DISPONIBLE");
  }

    boton4=digitalRead(5);
    if(boton4==HIGH){
    digitalWrite(10, HIGH);
    Serial.print("CAJON 4 OCUPADO");
  }
  else{
    digitalWrite(10,LOW);
    Serial.print("CAJON 4 DISPONIBLE");
  }

  if(boton1==HIGH, boton2==HIGH, boton3==HIGH ,boton4==HIGH){
  digitalWrite(9,HIGH);
  digitalWrite(6,LOW);
  Serial.print("ESTACIONAMIENTO LLENO");
  }
  else{
    digitalWrite(9,LOW);
    digitalWrite(6,HIGH);
    Serial.print("ESPACIOS DISPONIBLES");
  }
}
pero no lo puedo sacar de ciclo y la memoria se satura y se traba la maquina ayuda
:smiley-roll-sweat:

Go Up