#include <ESP32Servo.h>
/* -------- Pin Definitions -------- */
#define LDR_TL 32
#define LDR_TR 33
#define LDR_BL 34
#define LDR_BR 35
#define SERVO_AZ 25
#define SERVO_EL 26
/* -------- Objects -------- */
Servo servoAz, servoEl;
/* -------- Variables -------- */
int azAngle = 90;
int elAngle = 45;
int tolerance = 50;
/* -------- Simulated Solar Parameters -------- */
const float panelVoltageSim = 12.0; // Volts
const float panelCurrentSim = 0.45; // Amps
const float panelArea = 0.50; // m²
const float efficiency = 0.15; // 15%
/* -------- Energy Tracking -------- */
float power = 0.0;
float irradiance = 0.0;
float energyWh = 0.0;
unsigned long lastMillis = 0;
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("ESP32 SOLAR TRACKER STARTED (WOKWI MODE)");
servoAz.attach(SERVO_AZ);
servoEl.attach(SERVO_EL);
servoAz.write(azAngle);
servoEl.write(elAngle);
lastMillis = millis();
}
void loop() {
/* -------- LDR Readings -------- */
int tl = analogRead(LDR_TL);
int tr = analogRead(LDR_TR);
int bl = analogRead(LDR_BL);
int br = analogRead(LDR_BR);
int left = (tl + bl) / 2;
int right = (tr + br) / 2;
int top = (tl + tr) / 2;
int bottom = (bl + br) / 2;
/* -------- Dual Axis Tracking -------- */
if (left - right > tolerance && azAngle < 180) azAngle++;
if (right - left > tolerance && azAngle > 0) azAngle--;
if (top - bottom > tolerance && elAngle < 90) elAngle++;
if (bottom - top > tolerance && elAngle > 0) elAngle--;
servoAz.write(azAngle);
servoEl.write(elAngle);
/* -------- SIMULATED BH1750 (Lux) -------- */
float lux = map(top, 0, 4095, 50, 900);
/* -------- SIMULATED INA219 -------- */
float voltage = panelVoltageSim;
float current = panelCurrentSim;
power = voltage * current;
/* -------- Irradiance -------- */
irradiance = power / (efficiency * panelArea);
/* -------- Energy (Wh) -------- */
unsigned long now = millis();
float hours = (now - lastMillis) / 3600000.0;
energyWh += power * hours;
lastMillis = now;
/* -------- Serial Output -------- */
Serial.print("AZ=");
Serial.print(azAngle);
Serial.print(" EL=");
Serial.print(elAngle);
Serial.print(" | Lux=");
Serial.print(lux);
Serial.print(" lx");
Serial.print(" | V=");
Serial.print(voltage);
Serial.print(" V");
Serial.print(" I=");
Serial.print(current);
Serial.print(" A");
Serial.print(" P=");
Serial.print(power);
Serial.print(" W");
Serial.print(" | G=");
Serial.print(irradiance);
Serial.print(" W/m2");
Serial.print(" | E=");
Serial.print(energyWh);
Serial.println(" Wh");
delay(500);
}