#include <LiquidCrystal_I2C.h>
const int sensorIn = 34; // Pin donde se conecta el pin OUT del sensor en Arduino
int mVporAmp = 185; // Esta es la versión de 5A del ACS712 - usa 100 para el módulo de 20A y 66 para el módulo de 30A
int Vatio = 0;
double Voltaje = 0;
double VRMS = 0;
double AmperiosRMS = 0;
// Inicializar la biblioteca LCD con dirección I2C y tamaño del LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(9600);
Serial.println("Sensor de corriente ACS712");
// Inicializar la conexión con la LCD
lcd.init();
// Encender el retroiluminado de la LCD
lcd.backlight();
lcd.print("Sensor ACS712");
lcd.setCursor(0, 1);
lcd.print("de corriente");
delay(1000);
lcd.clear();
}
void loop() {
Serial.println("");
Voltaje = obtenerVPP();
VRMS = (Voltaje / 2.0) * 0.707; // La raíz cuadrada de 2 es 0.707
AmperiosRMS = ((VRMS * 1000) / mVporAmp) - 0.3; // 0.3 es el error que obtuve para mi sensor
Serial.print(AmperiosRMS);
Serial.print(" Amperios RMS --- ");
Vatio = (AmperiosRMS * 240 / 1.2);
// Nota: 1.2 es mi propio factor de calibración establecido empíricamente
// ya que el voltaje medido en D34 depende de la longitud del cable de OUT a D34
// 240 es el voltaje principal de la corriente alterna - este parámetro cambia localmente
Serial.print(Vatio);
Serial.println(" Vatios");
lcd.setCursor(0, 0);
lcd.print(AmperiosRMS);
lcd.print(" Amperios ");
lcd.setCursor(0, 1);
lcd.print(Vatio);
lcd.print(" vatios ");
delay(100);
}
// ***** Llamadas a funciones ******
float obtenerVPP() {
float resultado;
int valorLeido; // Valor leído del sensor
int valorMaximo = 0; // Almacena el valor máximo aquí
int valorMinimo = 4096; // Almacena el valor mínimo aquí (resolución ADC del ESP32)
uint32_t tiempoInicio = millis();
while ((millis() - tiempoInicio) < 1000) // Muestreo durante 1 segundo
{
valorLeido = analogRead(sensorIn);
// Verificar si hay un nuevo valor máximo
if (valorLeido > valorMaximo)
{
/*registra el valor máximo del sensor*/
valorMaximo = valorLeido;
}
if (valorLeido < valorMinimo)
{
/*registra el valor mínimo del sensor*/
valorMinimo = valorLeido;
}
}
// Restar el mínimo del máximo
resultado = ((valorMaximo - valorMinimo) * 3.3) / 4096.0; // Resolución ADC del ESP32 4096
return resultado;
}