PCA9685 y EEPROM

Buenas¡ llevo bastante tiempo peleandome con la EEPROM y la tarjeta PCA9685, en ella monto 2 servos con movimiento lento (slowmove) y los leds correspondientes de 3 pins R/G, en el scketch que quiero usar, tambien hay dos leds que se guardan bien en la EEPROM, pero los servos no he encontrado la manera de que me lo guarde, os subo el scketch, para si podeis orientarme. Decir que me he leido todos los manuales y he probado varios scketch y que tansolo con la tarjeta UNO, me han funcionado.
Os agradezco de ante mano el tiempo y la ayuda.

#include <Adafruit_PWMServoDriver.h>  //libreria modulo PCA9685
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <EEPROM.h>
Adafruit_PWMServoDriver servos = Adafruit_PWMServoDriver(0x40);

unsigned int pos0 = 172; // ancho de pulso en cuentas para pocicion 0° (configuracion de la libreria servos)
unsigned int pos180 = 565; // ancho de pulso en cuentas para la pocicion 180° (configuracion de la libreria servos

const int buttonPin1 = 2;    // pushbutton pin
const int ledPin1 = 7;       // LED pin
const int buttonPin2 = 3;    // pushbutton pin
const int ledPin2 = 8;       // LED pin

int ledState1;              // variable para mantener el estado del led
int buttonState1 = 0;       // la lectura actual del pin de entrada
int lastButtonState1 = 0;   // la lectura anterior del pin de entrada
int ledState2;              
int buttonState2 = 0;       
int lastButtonState2 = 0;   

long lastDebounceTime = 0;  // la última vez que se alteró el pin de salida
long debounceDelay = 30;    // el tiempo antirrebote; aumentar si la salida parpadea

int estadoboton1 = 0;           //guarda el estado del boton
int estadoanteriorboton1  = 0;  //guarda el estado anterior del boton
int estadoboton2 = 0;           //guarda el estado del boton
int estadoanteriorboton2  = 0;  //guarda el estado anterior del boton
int estadoboton3 = 0;           //guarda el estado del boton

int salida1 = 0;     //estado inicial del rele 0=apagado, 1= encendido
int salida2 = 0;

int currentPos[16];   // current positions for 4 servos numbered 0 - 3

const int tiempoantirebote = 80; //funcion para el antirebote del boton
boolean antirebote(int pin) {
  int contador = 0;
  boolean estado;
  boolean estadoanterior;

  do {
    estado = digitalRead(pin);
    if (estado != estadoanterior)
    {
      contador = 0;
      estadoanterior = estado;
    }
    else {
      contador = contador + 1;
    }
    delay(1);//Retardo al apretar pulsador
  } while (contador < tiempoantirebote);
  return estado;
}


void setup() {
  servos.begin();
  servos.setPWMFreq(60); //Frecuecia PWM de 60Hz o T=16,66ms
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Desvios v1 by Mario");
  lcd.setCursor(0, 1);
  lcd.print(" guardar a EEPROM");
  lcd.setCursor(0, 2);
  lcd.print("  estat led's");
  lcd.setCursor(0, 3);
  lcd.print("  i servos");

  pinMode(A4, INPUT);
  pinMode(A5, INPUT);

  pinMode(buttonPin1, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(ledPin2, OUTPUT);
  // define el estado inicial del LED
  digitalWrite(ledPin1, ledState1);
  digitalWrite(ledPin2, ledState2);
  digitalWrite(salida1, estadoboton1);
  digitalWrite(salida2, estadoboton2);
  Serial.begin (9600);
  //Verifique el estado del LED almacenado en EEPROM usando la función definida al final del código
  checkLedState();
}
// Velocidad de rotación +- lenta
void slowMove(int n_servo, int delayTime, int to) { //
  if (currentPos[n_servo] == to) return;  // Nada que hacer si ya está ahí
  else if (to > currentPos[n_servo])
  {
    for (int i = currentPos[n_servo]; i < to; i++)
    {
      servos.setPWM(n_servo, 0, i);
      delay(delayTime);
    }
  }
  else if (currentPos[n_servo] > to)
  {
    for (int i = currentPos[n_servo]; i > to; i--)
    {
      servos.setPWM(n_servo, 0, i); // (pin PCA9685, delay, grados)
      delay(delayTime);
    }
  }
  currentPos[n_servo] = to; // guarda la posición actual del servo
}
// Encender/Apagar led 3 pins RG (pin PCA9685, 4096, 0)(encendido), (pin PCA9685, 0, 4096)(Apagado)
void setPin(uint8_t num, uint16_t val, bool invert) {
  // Clamp value between 0 and 4095 inclusive.
  val = min(val, (uint16_t)4095);
  if (invert) {
    if (val == 0) {
      // Special value for signal fully on.
      servos.setPWM(num, 4096, 0);
    } else if (val == 4095) {
      // Special value for signal fully off.
      servos.setPWM(num, 0, 4096);
    } else {
      servos.setPWM(num, 0, 4095 - val);
    }
  } else {
    if (val == 4095) {
      // Special value for signal fully on.
      servos.setPWM(num, 4096, 0);
    } else if (val == 0) {
      // Special value for signal fully off.
      servos.setPWM(num, 0, 4096);
    } else {
      servos.setPWM(num, 0, val);
    }
  }
}

void loop() {

  int reading1 = digitalRead(buttonPin1);
  int reading2 = digitalRead(buttonPin2);

  if (reading1 != lastButtonState1) {
    // restablecer el temporizador de eliminación de rebotes
    lastDebounceTime = millis();
  }
  if (reading2 != lastButtonState2) {
    // restableix el temporitzador de rebot
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // sea ​​cual sea la lectura, ha estado ahí por más tiempo
    // que el retardo de rebote, así que tómelo como el estado actual real:

    // si el estado del botón ha cambiado:
    if (reading1 != buttonState1) {
      buttonState1 = reading1;
      // solo cambie el LED si el nuevo estado del botón es BAJO

      if (buttonState1 == LOW) {
        ledState1 = !ledState1;
      }
    }
    if (reading2 != buttonState2) {
      buttonState2 = reading2;
      // solo cambie el LED si el nuevo estado del botón es BAJO
      if (buttonState2 == LOW) {
        ledState2 = !ledState2;
      }
    }
  }

  // define el estado del LED
  digitalWrite(ledPin1, ledState1);
  digitalWrite(ledPin2, ledState2);
  digitalWrite(salida1, estadoboton1);
  digitalWrite(salida2, estadoboton2);
  // guardar el estado actual del LED en la EEPROM
  EEPROM.update(0, ledState1);
  // guardar la lectura. La próxima vez a través del bucle,
  // será el lastButtonStat
  lastButtonState1 = reading1;
  EEPROM.update(1, ledState2);
  // guardar la lectura. La próxima vez a través del bucle,
  // será el lastButtonStat
  lastButtonState2 = reading2;
  EEPROM.update(2, salida1);
  // guardar la lectura. La próxima vez a través del bucle,
  // será el lastButtonStat
 
  EEPROM.update(3, salida2);
  // guardar la lectura. La próxima vez a través del bucle,
  // será el lastButtonStat
  

  //Desvio 1 - Pos Módulo PCA9685 0
  estadoboton1 = digitalRead(2);  //lee el estado del boton
  if ((estadoboton1 == HIGH) && (estadoanteriorboton1 == LOW)) { //si estado de boton cambia
    if (antirebote(2)) { //El numero del antirebote debe coincidir con el numero del pin leido digitalread
      salida1 = 1 - salida1;  //cambiamos el estado del boton
    }
  }
  estadoanteriorboton1 = estadoboton1; //guarda el estado del boton
  if (salida1 == 1) {  //cambia el servo para cambiar la aguja
    servos.setPWM(1, 4096, 0); //enciende el led rojo //led bicolor RG 3 pins
    servos.setPWM(2, 0, 4096); //apaga el led verde //led bicolor RG 3 pins
    slowMove(0, 15, 125); // pin placa PCA9586, delay(velocidad rotación), grados
  }
  else {
    servos.setPWM(1, 0, 4096); //apaga el led rojo
    servos.setPWM(2, 4096, 0); //enciende el led verde
    slowMove(0, 15, 160); // pin placa PCA9586, delay(velocidad rotación), grados
  }
  //Desvio 2 - Pos Módulo PCA9685 3
  estadoboton2 = digitalRead(3);  //lee el estado del boton
  if ((estadoboton2 == HIGH) && (estadoanteriorboton2 == LOW)) { //si estado de boton cambia
    if (antirebote(3)) {  //El numero del antirebote debe coincidir con el numero del pin leido digitalread
      salida2 = 1 - salida2; //cambiamos el estado del boton
    }
  }
  estadoanteriorboton2 = estadoboton2; //guarda el estado del boton
  if (salida2 == 1) { //cambia el servo para cambiar la aguja
    servos.setPWM(4, 4096, 0); //enciende el led
    servos.setPWM(5, 0, 4096);  //apaga el led
    slowMove(3, 15, 125); // pin placa PCA9586, delay(velocidad rotación), grados
  }
  else {
    servos.setPWM(4, 0, 4096);  //apaga el led
    servos.setPWM(5, 4096, 0);  //enciende el led
    slowMove(3, 15, 160); // pin placa PCA9586, delay(velocidad rotación), grados
  }

}
void checkLedState() {
  Serial.println("LED status after restart: ");
  ledState1 = EEPROM.read(0);
  if (ledState1 == 1) {
    Serial.println ("Off");
    digitalWrite(ledPin1, LOW);
  }
  if (ledState1 == 0) {
    Serial.println ("On");
    digitalWrite(ledPin1, HIGH);
  }
  ledState2 = EEPROM.read(1);
  if (ledState2 == 1) {
    Serial.println ("Off");
    digitalWrite(ledPin2, LOW);
  }
  if (ledState2 == 0) {
    Serial.println ("On");
    digitalWrite(ledPin2, HIGH);
  }
  estadoboton1 = EEPROM.read(2);
  if (estadoboton1 == 1) {
    Serial.println ("Off");
    digitalWrite(ledPin1, LOW);
  }
  if (estadoboton1 == 0) {
    Serial.println ("On");
    digitalWrite(ledPin1, HIGH);
  }
  estadoboton2 = EEPROM.read(3);
  if (estadoboton2 == 1) {
    Serial.println ("Off");
    digitalWrite(ledPin2, LOW);
  }
  if (estadoboton2 == 0) {
    Serial.println ("On");
    digitalWrite(ledPin2, HIGH);
  }
}
``

Tienes todas las variables definidadas como int (enteros) que son 2 bytes y tu guardas todo usando EEPROM.upadte() que parece hacerlo correctamente. Tengo dudas acá!!
Pero luego lees enteros usando EEPROM.read() que lee bytes y eso no es correcto.
Lee usando EEPROM.get(direccion, valor)

Gracias por la respuesta, en lo que son los leds, los guarda y lee correctamente, el problema es como guardar, o que variable de la PCA9685, probare lode EEPROM.get y ya dire el resultado.

Quiero que comprendas algo importante.
Los tipos de variables ocupan diferente cantidad de bytes. get y put resuelven eso del modo adecuado, write y read tambien pueden usarse pero se debe tener conocimiento mas preciso de que se esta haciendo, de hecho antes se hacia asi.
Entonces si tienes una variable int que ocupa dos bytes, usar get con direcciones que cambian cada 2 luegares porque se ocupan 2 lugares, no generará problemas.
Dices que con el UNO no tienes problemas pero no dices que pasa con otro Arduino. O eso es lo que yo entendí.
Ahora hablas de como guardar los datos de los servos.
Los datos de los servos son tmb en 16 bits o unsigned int que es lo mismo, 2 bytes.
si la posicion libre fuera 10, entonces como guardas algo de los servos?
Tomo esta parte de tu código

void setPin(uint8_t num, uint16_t val, bool invert) {
  // Clamp value between 0 and 4095 inclusive.
  val = min(val, (uint16_t)4095);

y quieres guardar val. Bueno entonces usando EEPROM.put lo primero que debo hacer saber que no hay problema, como 10 estaba libre la uso. El problema será la siguiente

EEPROM.put(address, val);

Ahora supongamos otro servo que el dato llamado val1 del mismo tipo o sea uint16_t
entonces

address += sizeof(val1);

como val1 es unsigned int o sea 2 bytes
la funcion sizeof(val1) devuelve 2 y todo esto
+= 2 lo que hace es sumar 2 al valor que tenia address que dijimos era 10
10 + 2 = 12.
Entonces en 12 reservando los 2 bytes para val, se guardará val1 y asi
Si luego viene un float que ocupa 4 bytes address se moverá 4 lugares.

Trabajo con un UNO y La PCA9685, que no dan problemas, me habia expresado mal.
La del codigo

void setPin(uint8_t num, uint16_t val, bool invert) {

es la que uso para los leds, que no da problema, la que me interesaria es la

void slowMove(int n_servo, int delayTime, int to) {

donde entiendo que la variable guardada a leer es n_servo, que es el pin al que esta conectado el servo.

Bien pero tienes que establecer un orden para hacerlo o tendras un caos de datos guardados.
Los pulsadores los tienes en secuencia y me parece bien.
Los servos deberían estar igual desde el 0 (el primero) al último.
La direccion libre comienza en 4 si no me equivoco.
para mi estan mal, tendrian que ser
0 para Led ledState1
2 para Led ledState2
4 para estadoboton1
6 para estadoboton2
8 para primer servo y desde acá de 2 en 2.

Ok! mañana pruebo y ya te digo, Gracias.

El dato a guardar esta en la función

void slowMove(int n_servo, int delayTime, int to) { //
  if (currentPos[n_servo] == to) return;  // Nada que hacer si ya está ahí
  else if (to > currentPos[n_servo])
  {
    for (int i = currentPos[n_servo]; i < to; i++)
    {
      servos.setPWM(n_servo, 0, i);
      delay(delayTime);
    }
  }
  else if (currentPos[n_servo] > to)
  {
    for (int i = currentPos[n_servo]; i > to; i--)
    {
      servos.setPWM(n_servo, 0, i); // (pin PCA9685, delay, grados)
      delay(delayTime);
    }
  }
  currentPos[n_servo] = to; // guarda la posición actual del servo
}

El dato tendria que ser o "to" o "i" que son los grados en los que actualmente esta el servo, pero tanto el uno como el otro, me dice que no estan declarados.
La otra función void, la uso para los leds y no tengo nigun problema.
con lo que se trabaja es con

//Desvio 1 - Pos Módulo PCA9685 0
  estadoboton1 = digitalRead(2);  //lee el estado del boton
  if ((estadoboton1 == HIGH) && (estadoanteriorboton1 == LOW)) { //si estado de boton cambia
    if (antirebote(2)) { //El numero del antirebote debe coincidir con el numero del pin leido digitalread
      salida1 = 1 - salida1;  //cambiamos el estado del boton
    }
  }
  estadoanteriorboton1 = estadoboton1; //guarda el estado del boton
  if (salida1 == 1) {  //cambia el servo para cambiar la aguja
    servos.setPWM(1, 4096, 0); //enciende el led rojo //led bicolor RG 3 pins
    servos.setPWM(2, 0, 4096); //apaga el led verde //led bicolor RG 3 pins
    slowMove(0, 15, 125); // pin placa PCA9586, delay(velocidad rotación), grados
  }
  else {
    servos.setPWM(1, 0, 4096); //apaga el led rojo
    servos.setPWM(2, 4096, 0); //enciende el led verde
    slowMove(0, 15, 160); // pin placa PCA9586, delay(velocidad rotación), grados
  }

En la que como veras la función "slowMove" es la que marca el estado del servo a 125º o a 160º, que es lo que quiero guardar y no se que parametro coger.
Lo dicho gracias por tu tiempo y paciencia, no se si te comente que tengo secuelas de la quimio terapia y he perdido razonamiento, y esto es lo que me ayuda a recuperar cabeza. Por eso te pido un poco de paciencia extra.

El problema es que al valor de to (que lo pasas como parámetro para slowMove()) no lo puedes acceder desde fuera de la función porque se pierde al salir de la misma (se sale de su ámbito).
Como lo pasas como parámetro (de hecho, 125 ó 160 según tu código en #1), al salir se pierde, pero como antes lo guardas en currentPos[ ] (que es global) entonces lo puedes recuperar del array usando como índice el número de motor.

El caso de i sería aún peor porque su ámbito es la función for(), entonces se pierde al terminar el mismo. Ni siquiera podrías leerlo dentro de la función slowMove() salvo que lo hicieras dentro del for(). ¿Me explico?

Saludos

gatul, gracias! Si, eso lo tengo entendido, pero apartir de ahi, voy perdido. Si quiero usar currentPos, primero lo tengo que guardarcon un EEPROM.PUT? o con un EEPROM.update, basta? Los digitalwrite que tengo, estan bien?, me sobran? ahi es donde me lio y me pierdo. De nuevo Gracias, por tu tiempo.

Me parece que con update() está bien, pruébalo y sino lo cambias.

Me parece que haces pasos redundantes en checkLedState() pero lo miro bien y te digo.

Saludos

El checkledState(), es de los leds, lo he usado para intentar guiarme y ver si tanto los leds, como los servos funcionaban bien, no es relevante ya que en el scketch real y final no estaran. Gracias!

Las variables que quieres guardar hazlas globales asi te independizas de las funciones y rutinas utilizadas.

El scketch, con el que trabajo, es este, esta limpio del tema leds, para probar la EEPROM, los leds que tiene, que usan la función void setPin(uint8_t num, uint16_t val, bool invert) { seran para un cuadro de visualización y control. con lo cual da lo mismo si lo guardo o no. La función que es principal es void slowMove(int n_servo, int delayTime, int to) { que es la que me da la posición del servo que es la que quiero guardar. El scketch entero es el siguente.

#include <Adafruit_PWMServoDriver.h>  //libreria modulo PCA9685
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <EEPROM.h>
Adafruit_PWMServoDriver servos = Adafruit_PWMServoDriver(0x40);

unsigned int pos0 = 172; // ancho de pulso en cuentas para pocicion 0° (configuracion de la libreria servos)
unsigned int pos180 = 565; // ancho de pulso en cuentas para la pocicion 180° (configuracion de la libreria servos

const int buttonPin1 = 2;
const int buttonPin2 = 3; 

int estadoboton1 = 0;           //guarda el estado del boton
int estadoanteriorboton1  = 0;  //guarda el estado anterior del boton
int estadoboton2 = 0;           //guarda el estado del boton
int estadoanteriorboton2  = 0;  //guarda el estado anterior del boton
int estadoboton3 = 0;           //guarda el estado del boton

int salida1 = 0;     //estado inicial del rele 0=apagado, 1= encendido
int salida2 = 0;

int currentPos[16];  

const int tiempoantirebote = 80; //funcion para el antirebote del boton
boolean antirebote(int pin) {
  int contador = 0;
  boolean estado;
  boolean estadoanterior;

  do {
    estado = digitalRead(pin);
    if (estado != estadoanterior)
    {
      contador = 0;
      estadoanterior = estado;
    }
    else {
      contador = contador + 1;
    }
    delay(1);//Retardo al apretar pulsador
  } while (contador < tiempoantirebote);
  return estado;
}


void setup() {
  servos.begin();
  servos.setPWMFreq(60); //Frecuecia PWM de 60Hz o T=16,66ms
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Desvios v3 by Mario");
  lcd.setCursor(0, 1);
  lcd.print(" guardar a EEPROM");
  lcd.setCursor(0, 2);
  lcd.print("  posiscio");
  lcd.setCursor(0, 3);
  lcd.print("   servos"); 
  
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
  pinMode(buttonPin1,  INPUT);
  pinMode(buttonPin2,  INPUT);

  EEPROM.get(0, currentPos[0]);
  EEPROM.get(2, currentPos[3]);

}
// Velocidad de rotación +- lenta
void slowMove(int n_servo, int delayTime, int to) { //
  if (currentPos[n_servo] == to) return;  // Nada que hacer si ya está ahí
  else if (to > currentPos[n_servo])
  {
    for (int i = currentPos[n_servo]; i < to; i++)
    {
      servos.setPWM(n_servo, 0, i);
      delay(delayTime);
    }
  }
  else if (currentPos[n_servo] > to)
  {
    for (int i = currentPos[n_servo]; i > to; i--)
    {
      servos.setPWM(n_servo, 0, i); // (pin PCA9685, delay, grados)
      delay(delayTime);
    }
  }
  currentPos[n_servo] = to; // guarda la posición actual del servo
}
// Encender/Apagar led 3 pins RG (pin PCA9685, 4096, 0)(encendido), (pin PCA9685, 0, 4096)(Apagado)
void setPin(uint8_t num, uint16_t val, bool invert) {
  // Clamp value between 0 and 4095 inclusive.
  val = min(val, (uint16_t)4095);
  if (invert) {
    if (val == 0) {
      // Special value for signal fully on.
      servos.setPWM(num, 4096, 0);
    } else if (val == 4095) {
      // Special value for signal fully off.
      servos.setPWM(num, 0, 4096);
    } else {
      servos.setPWM(num, 0, 4095 - val);
    }
  } else {
    if (val == 4095) {
      // Special value for signal fully on.
      servos.setPWM(num, 4096, 0);
    } else if (val == 0) {
      // Special value for signal fully off.
      servos.setPWM(num, 0, 4096);
    } else {
      servos.setPWM(num, 0, val);
    }
  }
}
  
void loop() {
  //Desvio 1 - Pos Módulo PCA9685 0
  estadoboton1 = digitalRead(2);  //lee el estado del boton
  if ((estadoboton1 == HIGH) && (estadoanteriorboton1 == LOW)) { //si estado de boton cambia
    if (antirebote(2)) { //El numero del antirebote debe coincidir con el numero del pin leido digitalread
      salida1 = 1 - salida1;  //cambiamos el estado del boton
    }
  }
  estadoanteriorboton1 = estadoboton1; //guarda el estado del boton
  if (salida1 == 1) {  //cambia el servo para cambiar la aguja
    servos.setPWM(1, 4096, 0); //enciende el led rojo //led bicolor RG 3 pins
    servos.setPWM(2, 0, 4096); //apaga el led verde //led bicolor RG 3 pins
    slowMove(0, 15, 125); // pin placa PCA9586, delay(velocidad rotación), grados
  }
  else {
    servos.setPWM(1, 0, 4096); //apaga el led rojo
    servos.setPWM(2, 4096, 0); //enciende el led verde
    slowMove(0, 15, 160); // pin placa PCA9586, delay(velocidad rotación), grados
  }
  //Desvio 2 - Pos Módulo PCA9685 3
  estadoboton2 = digitalRead(3);  //lee el estado del boton
  if ((estadoboton2 == HIGH) && (estadoanteriorboton2 == LOW)) { //si estado de boton cambia
    if (antirebote(3)) {  //El numero del antirebote debe coincidir con el numero del pin leido digitalread
      salida2 = 1 - salida2; //cambiamos el estado del boton
    }
  }
  estadoanteriorboton2 = estadoboton2; //guarda el estado del boton
  if (salida2 == 1) { //cambia el servo para cambiar la aguja
    servos.setPWM(4, 4096, 0); //enciende el led
    servos.setPWM(5, 0, 4096);  //apaga el led
    slowMove(3, 15, 125); // pin placa PCA9586, delay(velocidad rotación), grados
  }
  else {
    servos.setPWM(4, 0, 4096);  //apaga el led
    servos.setPWM(5, 4096, 0);  //enciende el led
    slowMove(3, 15, 160); // pin placa PCA9586, delay(velocidad rotación), grados
  }
  EEPROM.update(0, currentPos[0]);
  EEPROM.update(2, currentPos[3]);
}

Son varios servos en distintas posiciones, he puesto EEPROM.get en el "void setup", para guardar la posición del servo (currentPos[n_servo] ) en el cual n_servo, es el pin al que esta conectado en la PCA9685, y en el "void loop" he probado con EEPROM.update y EEPROM.put y no me guarda la posición. Don de esta mi fallo, donde me he perdido?

Este código sin pulsadores y con un par de automatizaciones muestra que SI funciona.
Solo presenta datos cuando hay grabaciones según tu propio código.

#include <Arduino.h>

#include <Adafruit_PWMServoDriver.h> //libreria modulo PCA9685
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <EEPROM.h>
Adafruit_PWMServoDriver servos = Adafruit_PWMServoDriver(0x40);

unsigned int pos0 = 172;   // ancho de pulso en cuentas para pocicion 0° (configuracion de la libreria servos)
unsigned int pos180 = 565; // ancho de pulso en cuentas para la pocicion 180° (configuracion de la libreria servos

const int buttonPin1 = 2;
const int buttonPin2 = 3;

int estadoboton1 = 0;         //guarda el estado del boton
int estadoanteriorboton1 = 0; //guarda el estado anterior del boton
int estadoboton2 = 0;         //guarda el estado del boton
int estadoanteriorboton2 = 0; //guarda el estado anterior del boton
int estadoboton3 = 0;         //guarda el estado del boton

int salida1 = 0; //estado inicial del rele 0=apagado, 1= encendido
int salida2 = 0;

int currentPos[16];
unsigned long startTime, startTime2;
bool flag = false;
const int tiempoantirebote = 80; //funcion para el antirebote del boton

boolean antirebote(int pin)
{
    int contador = 0;
    boolean estado;
    boolean estadoanterior;

    do
    {
        estado = digitalRead(pin);
        if (estado != estadoanterior)
        {
            contador = 0;
            estadoanterior = estado;
        }
        else
        {
            contador = contador + 1;
        }
        delay(1); //Retardo al apretar pulsador
    } while (contador < tiempoantirebote);
    return estado;
}

void setup()
{
    servos.begin();
    servos.setPWMFreq(60); //Frecuecia PWM de 60Hz o T=16,66ms
    lcd.begin(20, 4);
    lcd.init();
    lcd.backlight();
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Desvios v3 by Mario");
    lcd.setCursor(0, 1);
    lcd.print(" guardar a EEPROM");
    lcd.setCursor(0, 2);
    lcd.print("  posiscio");
    lcd.setCursor(0, 3);
    lcd.print("   servos");

    pinMode(A4, INPUT);
    pinMode(A5, INPUT);
    pinMode(buttonPin1, INPUT);
    pinMode(buttonPin2, INPUT);

    EEPROM.get(0, currentPos[0]);
    EEPROM.get(2, currentPos[3]);
    Serial.begin(115200);
    Serial.println("Comienzo a visualizar el comportamiento.");
}
// Velocidad de rotación +- lenta
void slowMove(int n_servo, int delayTime, int to)
{ //
    //Serial.println("n_servo = "+String(n_servo)+" to = "+String(to));
    if (currentPos[n_servo] == to)
        return; // Nada que hacer si ya está ahí
    else if (to > currentPos[n_servo])
    {
        for (int i = currentPos[n_servo]; i < to; i++)
        {
            //servos.setPWM(n_servo, 0, i);
            delay(delayTime);
        }
    }
    else if (currentPos[n_servo] > to)
    {
        for (int i = currentPos[n_servo]; i > to; i--)
        {
            //servos.setPWM(n_servo, 0, i); // (pin PCA9685, delay, grados)
            delay(delayTime);
        }
    }
    currentPos[n_servo] = to; // guarda la posición actual del servo
    flag = true;
}
// Encender/Apagar led 3 pins RG (pin PCA9685, 4096, 0)(encendido), (pin PCA9685, 0, 4096)(Apagado)
void setPin(uint8_t num, uint16_t val, bool invert)
{
    // Clamp value between 0 and 4095 inclusive.
    val = min(val, (uint16_t)4095);
    if (invert)
    {
        if (val == 0)
        {
            // Special value for signal fully on.
            //servos.setPWM(num, 4096, 0);
        }
        else if (val == 4095)
        {
            // Special value for signal fully off.
            //servos.setPWM(num, 0, 4096);
        }
        else
        {
            //servos.setPWM(num, 0, 4095 - val);
        }
    }
    else
    {
        if (val == 4095)
        {
            // Special value for signal fully on.
            //servos.setPWM(num, 4096, 0);
        }
        else if (val == 0)
        {
            // Special value for signal fully off.
            //servos.setPWM(num, 0, 4096);
        }
        else
        {
            //servos.setPWM(num, 0, val);
        }
    }
}

void loop()
{
    //Desvio 1 - Pos Módulo PCA9685 0
    estadoboton1 = digitalRead(2); //lee el estado del boton
    if (millis() - startTime > 500UL) {
        estadoboton1 = 1 - estadoboton1;
        Serial.println(estadoboton1?"Boton1 :  ON":"Boton1 : OFF");
        startTime = millis();
    }
        

    if ((estadoboton1 == HIGH) && (estadoanteriorboton1 == LOW))
    { //si estado de boton cambia
        // if (antirebote(2))
        // {                          //El numero del antirebote debe coincidir con el numero del pin leido digitalread
             salida1 = 1 - salida1; //cambiamos el estado del boton
        // }
    }
    estadoanteriorboton1 = estadoboton1; //guarda el estado del boton

    if (salida1 == 1)   {           //cambia el servo para cambiar la aguja
        //Serial.println("Entrando en salida1");
        //servos.setPWM(1, 4096, 0); //enciende el led rojo //led bicolor RG 3 pins
        //servos.setPWM(2, 0, 4096); //apaga el led verde //led bicolor RG 3 pins
        //Serial.println("Entrando en slowMove");
        slowMove(0, 15, 125);      // pin placa PCA9586, delay(velocidad rotación), grados
    }
    else    {
        //Serial.println("Entrando en salida1 por lado else");
        //servos.setPWM(1, 0, 4096); //apaga el led rojo
        //servos.setPWM(2, 4096, 0); //enciende el led verde
        //Serial.println("Entrando en slowMove");
        slowMove(0, 15, 160);      // pin placa PCA9586, delay(velocidad rotación), grados
    }
    //Desvio 2 - Pos Módulo PCA9685 3
    estadoboton2 = digitalRead(3); //lee el estado del boton
    if (millis() - startTime2 > 750UL) {
        estadoboton1 = 1 - estadoboton1;
        Serial.println(estadoboton2?"Boton2 :  ON":"Boton2 : OFF");
        startTime2 = millis();
    }    

    if ((estadoboton2 == HIGH) && (estadoanteriorboton2 == LOW))     {
         //si estado de boton cambia
        // if (antirebote(3))
        // {                          //El numero del antirebote debe coincidir con el numero del pin leido digitalread
           salida2 = 1 - salida2; //cambiamos el estado del boton
        // }
    }
    estadoanteriorboton2 = estadoboton2; //guarda el estado del boton
    
    if (salida2 == 1)    {                              
        //cambia el servo para cambiar la aguja
        //Serial.println("Entrando en salida2");
        //servos.setPWM(4, 4096, 0); //enciende el led
        //servos.setPWM(5, 0, 4096); //apaga el led
        slowMove(3, 15, 125);      // pin placa PCA9586, delay(velocidad rotación), grados
    }
    else     {
        //Serial.println("Entrando en salida2 por lado else");
        //servos.setPWM(4, 0, 4096); //apaga el led
        //servos.setPWM(5, 4096, 0); //enciende el led
        slowMove(3, 15, 160);      // pin placa PCA9586, delay(velocidad rotación), grados
    }
    if (flag) {
            EEPROM.update(0, currentPos[0]);
            EEPROM.update(2, currentPos[3]);
            Serial.println("0 = "+String(currentPos[0]));
            Serial.println("2 = "+String(currentPos[3]));
            flag = false;
    }
}

Tuve que comentar los servos porque se quedaba en un loop infinito.

Si lo que pretendes es que al reiniciar los motores vuelvan a su última posición te está faltando hacer justamente eso.
Te falta mover los motores a las posiciones indicadas por currentPos[ ] .

Ten presente que slowMove() no te va a funcionar para este primer movimiento porque el valor de to va a coincidir irremediablemente con currentPos[ ] y como has puesto en los comentarios del código: "Nada que hacer si ya está ahí."

Saludos

Surbyte, he probado el scketch, y en el monitor serie queda en bucle infinito, ademas los pulsadores son necesarios, si no no puedo actuar sobre los servos. Lo dicho Gracias por tu tiempo.

gatul, si te fijas al final del void slowMove, pone que "currentPos[n_servo] = to; // guarda la posición actual del servo" yo entiendo que si el servo ha cambiado, guarda la ultima posisción.

Si, está perfecto, pero lo que te estoy diciendo es que al reiniciar el arduino no mueves los motores a su última posición antes del apagado o reset, porque supongo que para eso guardas los datos de las posiciones en la eeprom, ¿no?

La ultima posicion, tendria que ser, si lo he movido a la derecha, que al arrancar se onga en esa posicion, a la posicion programada con la que inicia ahora. Y perdona si no contesto, pero puede que salga de urgencia familiar a Cuellar , desde Girona y no tendre a mano el arduino, Gracias por tu atencion. Mario