Pausar el movimiento de un servo al pasar por un sensor

Saludos. Estoy trabajando en un proyecto que incluye un servo que va moviendo un sensor de un extremo al otro. Mi plan es que, cuando el sensor detecte un “obstáculo” estando en cierta posición, quede pausado en esa posición, y que cuando deje de detectar tal obstáculo, retome su rutina.

Aún no pruebo con el servo y el sensor, sino que estoy probando con un LED (reemplazando el movimiento por brillo) y un pulsador que toma el lugar del sensor. Resulta que cuando simulo con el pulsador la detección de parte del sensor, el LED deja de variar en brillo solo cuando vuelve a su “punto de inicio”, y esto solo si en ese punto estoy pulsando el pulsador.

Hasta ahora he probado con booleanos que hacen de “condicionales” y con sub-rutinas void.

Mi código hasta el momento es este:

#define led 9
#define led2 7
int brillo = 0;
int pulsador = 2;
int lectura;

void setup() {
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(pulsador, INPUT);

}

void loop() {
lectura = digitalRead(pulsador);
if (lectura == LOW) {
movimiento();
}
else if (lectura == HIGH) {

pausa();
}
}

void movimiento() {

digitalWrite(led2, LOW);

for(brillo = 0; brillo <= 255; brillo = brillo + 1) {
analogWrite(led, brillo);
delay(1);
}
for(brillo = 255; brillo >= 0; brillo = brillo - 1) {
analogWrite(led, brillo);
delay(1);
}

}

void pausa() {
digitalWrite(led2, HIGH);
}

“led2” solo está para monitorear que ese void se está ejecutando correctamente.

La verdad es que no estoy seguro si un Arduino puede hacer puntualmente lo que quiero programar, pero si se puede, agradezco desde ya cualquier sugerencia para lograrlo.

RESUELTO

Soy el mismo usuario. Había eliminado la cuenta de "c_electronico", pero por un error (posiblemente el caché del navegador) al crear el post apareció con la cuenta supuestamente eliminada.

Finalmente llegué a la conclusión que tanto for() como while() me iban a impedir "intervenir" en el programa hasta que se cumplieran las condiciones establecidas en alguna de esas dos estructuras, así que probé simplemente con if(). Así quedó el código:

define led 9

define led2 7

float brillo = 0; int pulsador = 2; int lectura; int direccion;

void setup() { pinMode(led, OUTPUT); pinMode(led2, OUTPUT); pinMode(pulsador, INPUT);

}

void loop() { lectura = digitalRead(pulsador); if(lectura == LOW) { movimiento(); } else if(lectura == HIGH) { pausa(); } if(brillo == 0) { direccion = 1; } else if(brillo == 255){ direccion = 2; }

}

void movimiento() { digitalWrite(led2, LOW); if(direccion == 1) { analogWrite(led, brillo); delay(5); brillo++;

}

else if(direccion == 2) {

analogWrite(led, brillo); delay(5); brillo--;

}

}

void pausa() { digitalWrite(led2, HIGH); }

La variable "direccion" representa cuando el servo ha llegado a uno de los extremos. Por ejemplo, si el servo llegó a la posición 0 (en este caso, si el brillo es 0), el valor de "dirección" es 1, y cumple con la condición del if() que empieza a mover el servo a la posición 180 (en este caso, aumentar el brillo a 255), y así por el estilo.

Presionando el pulsador (que simula la detección por parte del sensor), el brillo del LED que simula el servo queda "en pausa", por lo que asumo que en el caso del servo ocurriría lo mismo.

Si resulta oportuno, puedo convertir esto en un breve tutorial (no encontré algún post como este en el foro).

Por su atención, gracias.