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.