Como salir de un ciclo for?

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).

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.

humbertog: 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.

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!

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.

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++;
}
}

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.

Cada vez que un programador usa un goto, $deity hace un corto en una placa :grin: 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.

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);
}

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++;
}
}

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++;
}
}

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

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.

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 :cold_sweat: