#include <Arduino.h>
// Definición de pines
const int voltagePin = 1;
const int currentPin = 2;
const int controlPin = 7;
const int statusLedPin = 8;
const int buttonOnOffPin = 4;
const int buttonResetPin = 5;
// Variables de estado de los botones
bool lastButtonState = HIGH;
bool lastResetState = HIGH;
// Límites de seguridad
float minVoltage = 108.5;
float maxVoltage = 110.5;
float maxCurrent = 25.0;
// Variables de medición
float VAC = 0.0, lastVAC = -1;
float AmpAC = 0.0, lastAmpAC = -1;
float Power = 0.0, lastPower = -1;
float Frequency = 50.0;
bool systemEnabled = true, lastSystemState = true;
// Tiempos de actualización
unsigned long lastVoltageReadTime = 0;
unsigned long lastCurrentReadTime = 0;
unsigned long lastControlTime = 0;
// Lectura de voltaje simulada
float readVoltageFromADC() {
int adcValue = analogRead(voltagePin);
return map(adcValue, 0, 4095, 0, 1300) / 10.0;
}
// Lectura de corriente simulada
float readCurrentFromADC() {
int adcValue = analogRead(currentPin);
return map(adcValue, 0, 4095, 0, 250) / 10.0;
}
// Cálculo de potencia
float calculatePower(float voltage, float current) {
return voltage * current;
}
// Control de potencia
void controlPower() {
if (!systemEnabled) {
digitalWrite(controlPin, LOW);
digitalWrite(statusLedPin, LOW);
if (lastSystemState != systemEnabled) Serial.println("🔴 Sistema APAGADO manualmente: Carga desactivada");
lastSystemState = systemEnabled;
return;
}
bool withinLimits = (VAC >= minVoltage && VAC <= maxVoltage && AmpAC <= maxCurrent);
if (withinLimits) {
digitalWrite(controlPin, HIGH);
digitalWrite(statusLedPin, HIGH);
if (lastSystemState != systemEnabled) Serial.println("✅ Carga activada: Condiciones óptimas");
} else {
digitalWrite(controlPin, LOW);
digitalWrite(statusLedPin, LOW);
if (lastSystemState != systemEnabled) {
if (VAC < minVoltage) Serial.println("⚠️ Bajo voltaje: Carga desactivada");
else if (VAC > maxVoltage) Serial.println("⚠️ Sobrevoltaje: Carga desactivada");
else if (AmpAC > maxCurrent) Serial.println("⚠️ Sobrecorriente: Carga desactivada");
}
}
lastSystemState = systemEnabled;
}
// Mostrar datos en Serial solo si cambian
void displayData() {
bool voltageChanged = fabs(VAC - lastVAC) > 0.5;
bool currentChanged = fabs(AmpAC - lastAmpAC) > 0.1;
bool powerChanged = fabs(Power - lastPower) > 1.0;
if (voltageChanged || currentChanged || powerChanged) {
Serial.println("------- DATOS DEL SISTEMA -------");
Serial.print("Voltaje: "); Serial.print(VAC, 2); Serial.println(" V");
Serial.print("Corriente: "); Serial.print(AmpAC, 2); Serial.println(" A");
Serial.print("Potencia: "); Serial.print(Power, 2); Serial.println(" W");
Serial.print("Frecuencia: "); Serial.print(Frequency, 1); Serial.println(" Hz");
Serial.print("Estado del sistema: "); Serial.println(systemEnabled ? "ACTIVO" : "INACTIVO");
Serial.println("--------------------------------");
lastVAC = VAC;
lastAmpAC = AmpAC;
lastPower = Power;
}
}
// Manejo de botones
void handleButtons() {
bool buttonState = digitalRead(buttonOnOffPin);
bool resetState = digitalRead(buttonResetPin);
// Botón ON/OFF
if (buttonState == LOW && lastButtonState == HIGH) {
systemEnabled = !systemEnabled;
Serial.println(systemEnabled ? "🔵 Sistema ENCENDIDO manualmente" : "🔴 Sistema APAGADO manualmente");
}
lastButtonState = buttonState;
// Botón RESET
if (resetState == LOW && lastResetState == HIGH) {
Serial.println("🔄 Reiniciando sistema...");
delay(500);
// Apagar el sistema antes de reiniciar
systemEnabled = false;
digitalWrite(controlPin, LOW);
digitalWrite(statusLedPin, LOW);
Serial.println("⚠️ Sistema APAGADO durante reinicio");
// Encender el sistema nuevamente
delay(5000); // Un pequeño retraso para simular apagado/encendido
systemEnabled = true;
digitalWrite(controlPin, HIGH);
digitalWrite(statusLedPin, HIGH);
Serial.println("🔵 Sistema ENCENDIDO después del reinicio");
// Verificar si los datos de los sensores son válidos
float tempVAC = readVoltageFromADC();
float tempAmpAC = readCurrentFromADC();
if (tempVAC > 0 && tempAmpAC >= 0) {
VAC = tempVAC;
AmpAC = tempAmpAC;
Power = calculatePower(VAC, AmpAC);
Serial.println("✅ Datos válidos. Sistema listo para operar");
} else {
Serial.println("❌ Error en medición. Verifique sensores");
systemEnabled = false;
digitalWrite(controlPin, LOW);
digitalWrite(statusLedPin, LOW);
}
}
lastResetState = resetState;
}
void setup() {
Serial.begin(115200);
Serial.println("Inicializando sistema...");
analogReadResolution(12);
pinMode(controlPin, OUTPUT);
pinMode(statusLedPin, OUTPUT);
pinMode(buttonOnOffPin, INPUT_PULLUP);
pinMode(buttonResetPin, INPUT_PULLUP);
digitalWrite(controlPin, LOW);
digitalWrite(statusLedPin, LOW);
Serial.println("Sistema listo");
}
void loop() {
unsigned long currentMillis = millis();
handleButtons();
if (currentMillis - lastVoltageReadTime >= 100) {
VAC = readVoltageFromADC();
lastVoltageReadTime = currentMillis;
}
if (currentMillis - lastCurrentReadTime >= 100) {
AmpAC = readCurrentFromADC();
lastCurrentReadTime = currentMillis;
}
Power = calculatePower(VAC, AmpAC);
if (currentMillis - lastControlTime >= 200) {
controlPower();
lastControlTime = currentMillis;
}
displayData();
delay(5);
}
Voltage Sensor
Current Sensor
SSR Out
POWER ON/OFF
RESET