/*
*
=========================================================
*
COLEGIO GIMNASIO BILINGÜE MARIE CURIE
*
Proyecto de Tecnología y Automatización
*
Sistema: Rastreador de Posición del Sol
*
Desarrollado por: Centro Prisma
*
Versión: 1.0
*
Fecha: 19 de Febrero de 2026
*
=========================================================
*/
#include <ESP32Servo.h>
/*
=========================================================
RASTREADOR DE POSICIÓN DEL SOL
=========================================================
¿QUÉ HACE ESTE PROYECTO?
Este sistema usa:
- 2 sensores de luz
- 1 servo (motor que gira por ángulo)
El programa compara cuánta luz recibe cada
sensor.
Si un lado recibe más luz, el servo gira
hacia ese lado.
El proceso se repite muchas veces por
segundo.
Eso permite que el sistema se ajuste
constantemente.
Eso es un sistema de lazo cerrado con
retroalimentación.
=========================================================
*/
// ================= SENSORES
=================
// Pin donde conectamos el sensor
izquierdo
const int SENSOR_IZQUIERDO = 34; // Lee
valores entre 0 y 4095
// Pin donde conectamos el sensor derecho
const int SENSOR_DERECHO = 35; // También
lee valores entre 0 y 4095
// ================= ACTUADOR
=================
const int PIN_SERVO = 27; // Pin que envía
la señal de control al servo
Servo actuador; // Creamos el objeto que
controla el servo
// ================= AJUSTES DEL SISTEMA
=================
const int SENSIBILIDAD = 50; // Diferencia
mínima entre los sensores de luz para considerar que sí hay cambio real de luz
const int LIMITE_IZQ = 10; // Límite
mínimo permitido para proteger el servo
const int LIMITE_DER = 170; // Límite
máximo permitido para proteger el servo
const int PASO_GIRO = 2; // Cantidad de
grados que gira cada vez que se mueve
int posicion = 90; // Posición actual del
servo (empieza en el centro)
// ================= FUNCIONES
=================
// Devuelve la cantidad de luz que recibe
el sensor izquierdo
int medirIzquierda() {
return analogRead(SENSOR_IZQUIERDO);
}
// Devuelve la cantidad de luz que recibe
el sensor derecho
int medirDerecha() {
return analogRead(SENSOR_DERECHO);
}
// Resta 2 grados a la posición actual
void girarIzquierda() {
posicion = posicion - PASO_GIRO;
}
// Suma 2 grados a la posición actual
void girarDerecha() {
posicion = posicion + PASO_GIRO;
}
// Evita que el servo se pase del límite
izquierdo
void protegerIzquierda() {
//
Si la posición es menor al límite permitido en el servo
if
(posicion < LIMITE_IZQ) {
// Forzamos la posición al límite seguro del servo
posicion = LIMITE_IZQ;
}
}
// Evita que el servo se pase del límite
derecho
void protegerDerecha() {
//
Si la posición es mayor al límite permitido del servo
if
(posicion > LIMITE_DER) {
// Forzamos la posición al límite seguro del servo
posicion = LIMITE_DER;
}
}
// Envía la posición actual al servo
void moverServo() {
actuador.write(posicion); //escribe la nueva posición del servo
}
// ================= INICIO
=================
void setup() {
//
Inicia comunicación con el computador
Serial.begin(115200);
//
Conecta el servo al pin definido
actuador.attach(PIN_SERVO);
//
Lleva el servo a la posición inicial
moverServo();
Serial.println("RASTREADOR DE SOL INICIADO");
}
// ================= CICLO PRINCIPAL
=================
// Esta parte se repite una y otra vez
mientras el programa esté encendido.
// Es como el "ciclo de
pensamiento" del sistema.
void loop() {
//
1️⃣ MEDIR LUZ
//
Le preguntamos a cada sensor cuánta luz está viendo.
//
Guardamos esos números en dos variables.
int luzIzq = medirIzquierda();
// Luz que ve el sensor izquierdo
int luzDer = medirDerecha();
// Luz que ve el sensor derecho
//
2️⃣ CALCULAR DIFERENCIA
//
Restamos izquierda menos derecha para comparar.
// Si el resultado es positivo → hay más luz
a la izquierda.
// Si es negativo → hay más luz a la derecha.
int diferencia = luzIzq - luzDer;
//
3️⃣ DECIDIR MOVIMIENTO
//
Si la diferencia es suficientemente grande hacia la izquierda,
//
el servo gira hacia la izquierda.
if
(diferencia > SENSIBILIDAD) {
girarIzquierda();
}
//
Si la diferencia es suficientemente grande hacia la derecha,
//
el servo gira hacia la derecha.
if
(diferencia < -SENSIBILIDAD) {
girarDerecha();
}
//
4️⃣ PROTEGER EL SERVO
//
Revisamos que el servo no se pase de los límites seguros.
//
Esto evita que el motor se fuerce o se dañe.
protegerIzquierda();
protegerDerecha();
//
5️⃣ MOVER EL SERVO
//
Ahora sí enviamos la nueva posición al motor.
//
Aquí es cuando realmente se mueve.
moverServo();
//
6️⃣ MOSTRAR DATOS EN PANTALLA
//
Esto nos permite ver qué está "pensando" el sistema.
//
No cambia el movimiento, solo muestra información.
Serial.print("Sensor Izq: ");
Serial.print(luzIzq);
Serial.print(" | Sensor Der: ");
Serial.print(luzDer);
Serial.print(" | Diferencia: ");
Serial.print(diferencia);
Serial.print(" | Posicion Servo (grados): ");
Serial.println(posicion);
//
Esperamos un momento antes de repetir todo.
//
Esto hace que el movimiento sea más estable.
delay(20);
}
No hay comentarios:
Publicar un comentario