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?