Creo que haría falta una descripción mucho más detallada tanto del código como del hardware.
En principio, un servo puede estar en su estado original o "trucado" de dos formas diferentes.
Un servo normal de fábrica está formado por un motor que mueve el mecanismo y un sensor que mide la posición del mecanismo. El sensor que mide la posición viene a ser un potenciómetro y la posición se mide midiendo la resistencia. Este potenciómetro suele tener una carrera mecánica (el ángulo de giro que abarca) de unos 240º grados y una carreta eléctrica de unos 220º. Así que el mecanismo puede moverse hasta 240º antes de dar en el tope mecánico pero la resistencia solo cambia y la posición solo puede medirse en los 220º centrales.
El control del servo suele estar ajustado para que cuando la señal de control va de extremo a extremo el servo se mueva unos 90º.
Si se truca este potenciómetro la amplitud del movimiento se puede ampliar hasta 200 o 220º.
Otro "truco" consiste en suprimir y los topes mecánicos y entonces el servo se convierte en un "servo de rotación continua", que puede dar, por ejemplo, 12 vueltas en un sentido y luego 16 en el otro. El problema es que con este "truco" deja de ser posible conocer la posición en que está el servo y el servo, en realidad, deja de ser un servomotor.
El código típico para una cosa de estas podría tener esta pinta general:
Vamos a suponer que la posición del servo (pos) puede moverse desde 0 (extremo izquierda) hasta 255 (derecha), que y que el valor medido en la fotoresistencia (val) crece cuando el servo se mueve hacia la derecha y que queremos pararnos el el valor de fotoresistencia TARGET.
Necesitamos una función, o unas líneas de código que ordenen al servo una nueva posición, lo llamaremos servo_pos() y otra función o lineas de código que miden el valor de la resistencia, lo llamaremos mide_val()
#define MIN_SERVO 0
#define MAX_SERVO 255
#define T_INICIAL 1500
#define T_PASO 15
#define TARGET 1000
servo_pos(MIN_SERVO);
delay(T_INICIAL); // Damos tiempo al servo a llegar al extremo izquierdo
for(n = MIN_SERVO; n<= MAX_SERVO; n++){
if(mide_val()>TARGET) break;
servo_pos(n);
delay(T_PASO);
}
if(TARGET<mide_val()) Serial.printnl(Error: El target no ha sido alcanzado);
La instrucción break; hace que la ejecución "salte fuera" del bucle y continúe, el problema es que no sabemos si hemos salido del bucle porque val ha alcanzado el target o porque se ha alcanzado el extremo izquierdo de las posiciones del servo.
Con "while" se puede emplear break; o hacer falsa la condición del while
#define MIN_SERVO 0
#define MAX_SERVO 255
#define T_INICIAL 1500
#define T_PASO 15
#define TARGET 1000
servo_pos(MIN_SERVO);
delay(T_INICIAL); // Damos tiempo al servo a llegar al extremo izquierdo
int continua = 1;
int posicion = MIN_SERVO;
while(continua==1){
if(mide_val()>TARGET) continua=2;
servo_pos(posicion);
posicion++;
if(posicion>MAX_SERVO) continua=3;
delay(T_PASO);
}
if(continua==2) Serial.printnl(Target alcanzado);
if(continua==3) Serial.printnl(Error: Target no alcanzado);