#include "Servo.h" // Inclui a biblioteca para os servomotores
#include <EEPROM.h>
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
const int PinPot1 = A1;
const int PinPot2 = A2;
const int PinPot3 = A3;
const int PinPot4 = A4;
const int PinServo1 = 7;
const int PinServo2 = 8;
const int PinServo3 = 9;
const int PinServo4 = 10;
const int buttonPin = 2; // Pino do botão para todas as funções
int valPot1;
int valPot2;
int valPot3;
int valPot4;
int positionIndex = 0;
const int maxPositions = 10; // Número máximo de posições que podem ser salvas
unsigned long lastButtonPressTime = 0;
int buttonPressCount = 0;
const int clickInterval = 500; // Intervalo de tempo para considerar múltiplos cliques (em milissegundos)
void setup() {
// Associa os objetos servo aos pinos correspondentes
servo1.attach(PinServo1);
servo2.attach(PinServo2);
servo3.attach(PinServo3);
servo4.attach(PinServo4);
// Configura o pino do botão como entrada com pull-up interno
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
// Carrega o índice de posição salvo na EEPROM
EEPROM.get(0, positionIndex);
if (positionIndex >= maxPositions || positionIndex < 0) {
positionIndex = 0; // Resetar índice se estiver fora do limite
}
}
void loop() {
// Lê e mapeia os valores dos potenciômetros para a faixa de 0 a 180 graus
valPot1 = analogRead(PinPot1);
valPot1 = map(valPot1, 0, 1023, 0, 180);
servo1.write(valPot1);
valPot2 = analogRead(PinPot2);
valPot2 = map(valPot2, 0, 1023, 0, 180);
servo2.write(valPot2);
valPot3 = analogRead(PinPot3);
valPot3 = map(valPot3, 0, 1023, 0, 180);
servo3.write(valPot3);
valPot4 = analogRead(PinPot4);
valPot4 = map(valPot4, 0, 1023, 0, 180);
servo4.write(valPot4);
// Verifica se o botão foi pressionado
if (digitalRead(buttonPin) == LOW) {
if (millis() - lastButtonPressTime > clickInterval) {
buttonPressCount = 0; // Reinicia a contagem se o intervalo entre os cliques for muito longo
}
lastButtonPressTime = millis();
buttonPressCount++;
delay(100); // Debounce
// Espera um intervalo para diferenciar os cliques
while (digitalRead(buttonPin) == LOW) {
delay(10); // Aguarda até o botão ser solto
}
}
// Verifica se o intervalo de clique passou
if (millis() - lastButtonPressTime > clickInterval && buttonPressCount > 0) {
if (buttonPressCount == 1) {
resetMemory();
} else if (buttonPressCount == 2) {
savePosition();
} else if (buttonPressCount == 3) {
playPositions();
}
buttonPressCount = 0; // Reinicia a contagem de cliques
}
}
void savePosition() {
if (positionIndex < maxPositions) {
int addr = (positionIndex + 1) * 4 * sizeof(int);
EEPROM.put(addr, valPot1);
EEPROM.put(addr + sizeof(int), valPot2);
EEPROM.put(addr + 2 * sizeof(int), valPot3);
EEPROM.put(addr + 3 * sizeof(int), valPot4);
Serial.print("Posição salva no índice: ");
Serial.println(positionIndex);
positionIndex++;
EEPROM.put(0, positionIndex); // Salva o novo índice de posição na EEPROM
} else {
Serial.println("Memória cheia!");
}
}
void resetMemory() {
for (int i = 0; i < (maxPositions + 1) * 4 * sizeof(int); i++) {
EEPROM.write(i, 0);
}
positionIndex = 0;
EEPROM.put(0, positionIndex); // Resetar o índice na EEPROM
Serial.println("Memória resetada.");
}
void playPositions() {
for (int i = 0; i < positionIndex; i++) {
int addr = (i + 1) * 4 * sizeof(int);
EEPROM.get(addr, valPot1);
EEPROM.get(addr + sizeof(int), valPot2);
EEPROM.get(addr + 2 * sizeof(int), valPot3);
EEPROM.get(addr + 3 * sizeof(int), valPot4);
servo1.write(valPot1);
servo2.write(valPot2);
servo3.write(valPot3);
servo4.write(valPot4);
delay(1000); // Atraso entre os movimentos para visualização
Serial.print("Reproduzindo posição do índice: ");
Serial.println(i);
}
}