Control de servo mediante fotoresistencia

Muy buenas a todos y gracias de antemano por vuestra atención, llevo en este foro muy poco tiempo así que espero no liarla mucho :sweat_smile:

Me encuentro desarrollando un pequeño prollecto de fin de grado de Bellas Artes, y estoy teniendo problemas con el control de un servo. La idea es hacer reaccionar un brazo en función de la luz que le llega. Para esto he conectado en un Arduino Uno un servo y una fotoresistencia, de manera que cuando se le quita la luz de forma gradual , el servo debería moverse también gradualmente.
El problema que tengo es que sé como hacer que el servo se mueva ‘x’ grados en funcion de ‘y’ cantidad de luz, pero no tengo ni idea de hacerlo reaccionar a todo un rango de cantidad de luz y relacionarlo con el movimiento que debe hacer en consecuencia (quiero pensar que me estoy explicando debidamente, aunque lo empiezo a dudar).

En cualquier caso, lo que tengo de momento es esto. Como podréis ver he programado el servo para rotar 180º cuando el sensor detecta menos de 200 unidades de luz (esta puesto por probar, no por nada en concreto):

#include <Servo.h>

Servo myservo;

const int sensorpin=A0;

int sensorvalue=0;

int proximityvalue=0;

void setup() {
Serial.begin(9600);
myservo.attach(2);
myservo.writeMicroseconds(600);
}

void loop() {
proximityvalue=analogRead(sensorpin);
delay(5);

myservo.write(0);

if(proximityvalue<200)
{
myservo.write(180);
delay(600);
}
else
{
myservo.write(0);
delay(600);
}
Serial.println(proximityvalue);
}

No sé si se os ocurre algo para solucionar esto, he estado buscando otros topics pero en ninguno encuentro que nadie haya tenido este problema

Puedes usar la funcion map para convertir la lectura de la fotoresistencia en un numero entre 0 y 180: map() - Arduino Reference .Para conseguir los valores a convertir puedes hacer un sketch que solo lea la entrada analogica de la fotoresistencia y anotar los valores que te de con minima y maxima luz.

La función map será tu amiga fiel, según entiendo yo:

myservo.write(map(proximityvalue, 0, 1023, 180, 0));

Edita el código usando etiquetas </>. Lee las Normas del foro

Como dicen la función map te será de utilidad.

Cuidado con el primer myservo.write() que escribes en el loop. Se te fijas lo que estás haciendo en cada ciclo del bucle es poner el servo en la posicíon 0 y seguidamente es ponerlo en la posición "deseada", la que puede darte oscilaciones del servo muy rapidas e indeseadas, además de otros inconvenientes.