#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;
}
NOCOMNCVCCGNDINLED1PWRRelay Module