// Projeto Estabilizador com Histerese (Proteção de Relé)
// Nível de protótipo
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EmonLib.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
EnergyMonitor emon1;
const int pinoBaixo = 2;
const int pinoAlto = 4;
unsigned long tempoAnterior = 0;
const long intervaloLCD = 500;
// Definição das margens de tolerância (Histerese)
const float LIMITE_ALTO_LIGA = 231.0;
const float LIMITE_ALTO_DESLIGA = 228.0; // Margem de 3V para desligar
const float LIMITE_BAIXO_LIGA = 210.0;
const float LIMITE_BAIXO_DESLIGA = 213.0; // Margem de 3V para desligar
// Variáveis para guardar o estado atual de cada relé
bool statusAlto = LOW;
bool statusBaixo = LOW;
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
emon1.voltage(A0, 234.26, 1.7); // Voltage: input pin, calibration, phase_shift
emon1.current(A1, 111.1); // Current: input pin, calibration.
pinMode(pinoBaixo, OUTPUT);
pinMode(pinoAlto, OUTPUT);
lcd.setCursor(6, 0); lcd.print("JPS");
lcd.setCursor(1, 1); lcd.print("Com Histerese");
delay(1500);
lcd.clear();
}
void loop() {
emon1.calcVI(20, 2000);
float tensao_rms = emon1.Vrms;
float realPower = emon1.realPower; //extract Real Power into variable
float apparentPower = emon1.apparentPower; //extract Apparent Power into variable
float powerFActor = emon1.powerFactor; //extract Power Factor into Variable
float Irms = emon1.Irms; //extract Irms into Variable
// --- LÓGICA COM HISTERESE PARA TENSÃO ALTA ---
if (tensao_rms >= LIMITE_ALTO_LIGA) {
statusAlto = HIGH; // Liga a correção de alta
}
else if (tensao_rms < LIMITE_ALTO_DESLIGA) {
statusAlto = LOW; // Só desliga quando cair bem abaixo do limite
}
// --- LÓGICA COM HISTERESE PARA TENSÃO BAIXA ---
if (tensao_rms <= LIMITE_BAIXO_LIGA) {
statusBaixo = HIGH; // Liga a correção de baixa
}
else if (tensao_rms > LIMITE_BAIXO_DESLIGA) {
statusBaixo = LOW; // Só desliga quando subir bem acima do limite
}
// Medida de segurança: Garante que os dois relés NUNCA liguem juntos (evita curto)
if (statusAlto == HIGH && statusBaixo == HIGH) {
statusAlto = LOW;
statusBaixo = LOW;
}
// Aplica os estados protegidos nos pinos físicos
digitalWrite(pinoAlto, statusAlto);
digitalWrite(pinoBaixo, statusBaixo);
// --- ATUALIZAÇÃO DO DISPLAY ---
unsigned long tempoAtual = millis();
if (tempoAtual - tempoAnterior >= intervaloLCD) {
tempoAnterior = tempoAtual;
lcd.setCursor(6, 0);
lcd.print("JPS");
lcd.setCursor(2, 1);
lcd.print("IN: ");
lcd.print(tensao_rms, 1);
lcd.print("V ");
emon1.serialprint(); // Print out all variables (realpower, apparent power, Vrms, Irms, power factor)
}
}