#include <Servo.h>
// --- Definições de Pinos e Constantes ---
// Pinos dos Servos
const int PINO_SERVO_HORIZONTAL = 3;
const int PINO_SERVO_VERTICAL = 5;
// Pinos dos LDRs
const int PINO_LDR_DIREITA_CIMA = A0;
const int PINO_LDR_DIREITA_BAIXO = A1;
const int PINO_LDR_ESQUERDA_CIMA = A2;
const int PINO_LDR_ESQUERDA_BAIXO = A3;
// Limites de Rotação dos Servos
const int HORIZONTAL_MAX = 180;
const int HORIZONTAL_MIN = 65;
const int VERTICAL_MAX = 120;
const int VERTICAL_MIN = 15;
// Posições Iniciais dos Servos
const int POS_INICIAL_HORIZONTAL = 180; // Ou 90 para começar no meio
const int POS_INICIAL_VERTICAL = 45; // Ou 90 para começar no meio
// Tolerância para o alinhamento
const int TOLERANCIA = 50;
const int DELAY_MOVIMENTO_MS = 100; // Tempo entre leituras e movimentos
// --- Objetos Servo ---
Servo servoHorizontal;
Servo servoVertical;
// --- Variáveis de Posição Atual dos Servos ---
int posicaoServoHorizontal = POS_INICIAL_HORIZONTAL;
int posicaoServoVertical = POS_INICIAL_VERTICAL;
// --- Função setup() ---
void setup() {
servoHorizontal.attach(PINO_SERVO_HORIZONTAL);
servoVertical.attach(PINO_SERVO_VERTICAL);
// Define as posições iniciais dos servos
servoHorizontal.write(posicaoServoHorizontal);
servoVertical.write(posicaoServoVertical);
delay(3000); // Aguarda a estabilização dos servos
}
// --- Função loop() ---
void loop() {
// Leitura Analógica dos LDRs
int leituraLDRDC = analogRead(PINO_LDR_DIREITA_CIMA);
int leituraLDREC = analogRead(PINO_LDR_ESQUERDA_CIMA);
int leituraLDRDB = analogRead(PINO_LDR_DIREITA_BAIXO);
int leituraLEB = analogRead(PINO_LDR_ESQUERDA_BAIXO);
// Cálculo das Médias
int valorSuperior = (leituraLDRDC + leituraLDREC) / 2;
int valorInferior = (leituraLDRDB + leituraLEB) / 2;
int valorDireita = (leituraLDRDC + leituraLDRDB) / 2;
int valorEsquerda = (leituraLDREC + leituraLEB) / 2;
// Cálculo das Diferenças
int diferencaSupInf = valorSuperior - valorInferior;
int diferencaDirEsq = valorDireita - valorEsquerda;
// --- Lógica de Movimento do Servo Vertical ---
if (diferencaSupInf > TOLERANCIA) { // Sol está mais forte na parte superior (precisa descer)
posicaoServoVertical--;
if (posicaoServoVertical < VERTICAL_MIN) {
posicaoServoVertical = VERTICAL_MIN;
}
} else if (diferencaSupInf < -TOLERANCIA) { // Sol está mais forte na parte inferior (precisa subir)
posicaoServoVertical++;
if (posicaoServoVertical > VERTICAL_MAX) {
posicaoServoVertical = VERTICAL_MAX;
}
}
// Se a diferença estiver dentro da tolerância, o servo não se move verticalmente.
servoVertical.write(posicaoServoVertical);
// --- Lógica de Movimento do Servo Horizontal ---
if (diferencaDirEsq > TOLERANCIA) { // Sol está mais forte na direita (precisa mover para a esquerda)
posicaoServoHorizontal--;
if (posicaoServoHorizontal < HORIZONTAL_MIN) {
posicaoServoHorizontal = HORIZONTAL_MIN;
}
} else if (diferencaDirEsq < -TOLERANCIA) { // Sol está mais forte na esquerda (precisa mover para a direita)
posicaoServoHorizontal++;
if (posicaoServoHorizontal > HORIZONTAL_MAX) {
posicaoServoHorizontal = HORIZONTAL_MAX;
}
}
// Se a diferença estiver dentro da tolerância, o servo não se move horizontalmente.
servoHorizontal.write(posicaoServoHorizontal);
delay(DELAY_MOVIMENTO_MS);
}