arduino-intensidad-consumo-electrico-acs712

Medir intensidad y consumo eléctrico con Arduino y ACS712

¿Qué es el ACS712?

El ACS712 es un sensor de corriente tanto alterna como continua, que permite medir la intensidad eléctrica que atraviesa un conductor. Podemos emplear el ACS712 junto con un procesador como Arduino para medir la intensidad o potencia consumida por una carga.

Internamente el ACS712 consiste en un sensor hall de precisión y bajo offset junto con un canal de conducción localizado cerca de la superficie del integrado. Cuando la corriente fluye por el canal de cobre genera un campo magnético que es detectado por el sensor Hall y es convertido en una tensión.

La salida del sensor es una tensión proporcional a la corriente, y altamente independiente de la temperatura. El sensor viene calibrado desde fábrica, aunque para una medición de precisión hará falta un ajuste de la calibración.

El camino conductor está aislado galvánicamente del IC garantizado un mínimo 2.1 kVRMS Su resistencia es muy baja, 1.2 mO, lo que se traduce en pequeñas pérdidas.

Existen modelos para rangos de 5A, 20A, 30A. El sensor soporta corrientes hasta 5x el rango de medición del sensor. Sobrepasar el límite dañara el ACS712.

La mayor desventaja del ACS712 es que es un sensor intrusivo, es decir, es necesario insertarlo en un conductor lo cual puede suponer que tengamos que cortar un cable. Es una gran desventaja frente a sensores no intrusivos como el transformador de intensidad STC-013.

Aplicaciones típicas del ACS712 incluyen control de motores, control de cargas, fuentes de alimentación, y protecciones contra sobretensiones.

Nosotros podemos usarlo en nuestros proyectos de electrónica casera y Arduino, por ejemplo, para medir la intensidad que alimenta una carga, para medir su consumo, o como protección de dispositivos tales como motores.

Precio

El ACS712 es un sensor barato. Podemos encontrar módulos con el ACS712 en sus distintas versiones 5A, 20A y 30A, preparados para conectar de forma sencilla con Arduino, por 1.25€ en vendedores internacionales de eBay o AliExpress.

arduino-sensor-corriente-acs712-componente

Esquema de montaje

Los módulos con el ACS712 son muy sencillos de conectar. Precisamente esta es una de sus grandes ventajas. Al ACS712 proporciona una salida de tensión proporcional a la intensidad que atraviesa el sensor.

Por tanto, simplemente alimentamos el módulo conectando Gnd y Vcc, respectivamente, a Gnd y 5V en Arduino, y conectamos la salida del sensor a una entrada analógica de Arduino.

arduino-sensor-corriente-acs712-esquema

Mientras que la conexión, vista desde Arduino, sería la siguiente.

arduino-sensor-corriente-ACS712-conexion

Ejemplos de código

Como hemos comentado, la tensión en la salida del ACS712 es proporcional a la intensidad que atraviesa sensor. Se incluye un offset de 2.5V de forma que la referencia está centrada, lo que permite medir intensidades positivas y negativas.

El factor de proporcionalidad y la resolución dependen del modelo del sensor, para rango de 5A, 20 y 30.

Max IntensidadSensibilidadTensión salidaResolucion
±5A185 mV/A1,575V a 3,425V26mA
±20A100 mV/A0,5V a 4,5V49mA
±30A66 mV/A0,52V a 4,48V74mA

El siguiente código realiza la medición de la corriente mediante el ACS712. Para reducir el ruido de la medición, se realizan varias mediciones y se calcula el promedio.

// Sensibilidad del sensor en V/A
float SENSIBILITY = 0.185;   // Modelo 5A
//float SENSIBILITY = 0.100; // Modelo 20A
//float SENSIBILITY = 0.066; // Modelo 30A

int SAMPLESNUMBER = 100;

void setup() 
{
  Serial.begin(9600);
}

void printMeasure(String prefix, float value, String postfix)
{
  Serial.print(prefix);
  Serial.print(value, 3);
  Serial.println(postfix);
}

void loop()
{
  float current = getCorriente(SAMPLESNUMBER);
  float currentRMS = 0.707 * current;
  float power = 230.0 * currentRMS;

  printMeasure("Intensidad: ", current, "A ,");
  printMeasure("Irms: ", currentRMS, "A ,");
  printMeasure("Potencia: ", power, "W");
  delay(1000);
}

float getCorriente(int samplesNumber)
{
  float voltage;
  float corrienteSum = 0;
  for (int i = 0; i < samplesNumber; i++)
  {
    voltage = analogRead(A0) * 5.0 / 1023.0;
    corrienteSum += (voltage - 2.5) / SENSIBILITY;
  }
  return(corrienteSum / samplesNumber);
}

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full