El ACS712 es un sensor de corriente de efecto Hall que entrega una tensión proporcional a la corriente que pasa por él, sea continua o alterna. Se conecta a una entrada analógica de Arduino o ESP32, y con unas pocas líneas de código lees amperes. El ESP32 no acepta directamente los 5 V del sensor, así que necesita un divisor de tensión, y el cero de la medición se calibra con el circuito sin corriente.
Qué es el ACS712 y cómo mide la corriente
Según la hoja de datos de Allegro, el ACS712 combina un sensor Hall lineal con un camino de cobre por donde circula la corriente que quieres medir. Esa corriente genera un campo magnético, el sensor Hall lo convierte en tensión y la salida queda proporcional a la corriente, positiva o negativa. Mide tanto corriente alterna como continua. El camino de cobre tiene una resistencia interna de 1,2 mΩ típicos, así que casi no pierde potencia. En el módulo que vende Zamper, la línea que mides entra por una bornera y tienes tres pines: alimentación, tierra y salida analógica.
Versiones de 5 A, 20 A y 30 A: sensibilidad en mV/A
Allegro fabrica tres versiones, que se distinguen por el rango de corriente y por la sensibilidad, es decir, cuántos milivolts cambia la salida por cada ampere. La tabla muestra la sensibilidad típica de la hoja de datos, con su mínimo y su máximo. La de 5 A (ACS712ELCTR-05B-T, versión 05B) tiene ±5 A, la de 20 A tiene ±20 A y la de 30 A tiene ±30 A. Cuanto menor es el rango, mayor es la sensibilidad y más fino lo que distingues. Elige la versión cuyo rango cubra la corriente máxima de tu circuito, con algo de margen. Zamper publica la versión de 5 A. Si necesitas la de 20 A o la de 30 A, cotiza.
Versión Rango mV/A (mín-máx)
5 A ±5 A 185 (180-190)
20 A ±20 A 100 (96-104)
30 A ±30 A 66 (63-69)Cómo es la salida: el cero está en la mitad de la alimentación
La alimentación del ACS712 es de 5 V, con un rango de 4,5 a 5,5 V según la ficha. Con corriente cero, la salida queda en VCC/2, o sea cerca de 2,5 V. Si la corriente circula en el sentido que indica la hoja de datos (de los pines IP+ hacia IP−), la salida sube sobre ese valor, y si va al revés, baja. Por eso se llama salida bidireccional. La salida además es ratiométrica: tanto el cero como la sensibilidad cambian en proporción a la alimentación. Si tu alimentación de 5 V varía un poco, el cero se mueve con ella, y eso explica por qué conviene calibrar el cero con la misma alimentación con que vas a medir.
Conexión a Arduino
Alimenta el módulo con el pin de 5 V del Arduino, une las tierras y lleva la salida a una entrada analógica, por ejemplo A0. La carga que quieres medir va en serie con la bornera del módulo. La corriente entra por un borne, pasa por el sensor y sale por el otro hacia la carga. El ADC de las placas Uno, Nano y Mega es de 10 bits y convierte 0 a 5 V en valores de 0 a 1023, según la referencia de Arduino, o sea unos 4,9 mV por unidad. La salida del sensor, que ronda 2,5 V en reposo, cabe sin problema en ese rango.
Conexión a ESP32: la salida de 5 V no entra directa
El ESP32 trabaja con 3,3 V y su ADC no mide cualquier tensión. La documentación de Espressif para el ESP32 original (ESP-IDF 4.4) recomienda, con la atenuación más alta (11 dB), medir entre 150 y 2450 mV si buscas la máxima exactitud. La documentación de Arduino-ESP32 indica un máximo medible de 3100 mV con esa atenuación. La salida del ACS712 de 5 A va de unos 1,6 V a unos 3,4 V a plena escala con una alimentación de 5 V, y llega a unos 3,8 V si la alimentación sube a 5,5 V, el máximo de la ficha. Con las versiones de 20 A y de 30 A el recorrido llega a unos 4,5 V con 5 V y a unos 4,9 V con 5,5 V. En todos los casos el extremo superior pasa de lo recomendado. Alimentar el sensor con 3,3 V para evitarlo lo saca de su rango de 4,5 a 5,5 V. La solución es un divisor de tensión entre la salida del sensor y el pin del ESP32. El 5 V sale del pin VIN o 5V de la placa, con la masa en común entre la placa y el sensor.
El divisor de tensión para el ESP32
Los divisores siguientes dejan el máximo bajo los 2450 mV recomendados con una alimentación de hasta 5,5 V. Para la versión de 5 A sirve un par de 12 kΩ (de la salida hacia el pin) y 20 kΩ (del pin a tierra), que entrega 20 / (12 + 20) = 0,625 de la tensión. Con 5 V de alimentación, el recorrido de 1,575 a 3,425 V baja a 0,98 a 2,14 V, con el cero en 1,56 V. Con 5,5 V el máximo llega a unos 2,36 V. Para las versiones de 20 A y de 30 A sirve un par de 12 kΩ y 10 kΩ, que entrega 10 / (12 + 10) = 0,4545. Con 5,5 V el máximo baja a unos 2,25 V, y con 5 V el mínimo queda en unos 0,23 V, sobre los 150 mV. La ficha de Allegro pide una carga de al menos 4,7 kΩ en la salida, y estos divisores presentan 32 kΩ y 22 kΩ. El divisor reduce también la sensibilidad. La versión de 5 A pasa de 185 a unos 116 mV/A en el pin. Otra opción es medir la alimentación real con otra entrada y ajustar el cálculo. Usa un pin del ADC1, porque el ADC2 lo comparte el Wi-Fi, según la documentación de Espressif.
Código para corriente continua en Arduino
El programa mide el cero al arrancar, con el circuito sin corriente, y después resta ese valor a cada lectura. Promediar 100 lecturas baja el ruido. La constante SENS corresponde a la versión de 5 A, y para las otras cambia por 0,100 o 0,066.
const int PIN_ACS = A0;
// V por ampere, versión de 5 A
const float SENS = 0.185;
// tensión de salida con 0 A
float v0;
float leerVoltios() {
long suma = 0;
for (int i = 0; i < 100; i++)
suma += analogRead(PIN_ACS);
// ADC de 10 bits, referencia 5 V
return (suma / 100.0) * 5.0 / 1024.0;
}
void setup() {
Serial.begin(115200);
delay(500);
// calibra el cero SIN corriente
v0 = leerVoltios();
}
void loop() {
float a = (leerVoltios() - v0) / SENS;
Serial.println(a, 3);
delay(500);
}Calibrar el cero y la ganancia
Calibra el cero cada vez que arranca el programa, con la carga desconectada y con la misma alimentación que usarás para medir, porque el cero es VCC/2 y sigue a la alimentación. El cero también deriva con la temperatura. En la versión de 5 A la ficha informa pendientes de −0,26 mV/°C entre −40 y 25 °C y de −0,08 mV/°C entre 25 y 150 °C, de modo que un cambio grande de temperatura mueve el cero. Para ajustar la ganancia, conecta una carga resistiva estable, mide su corriente con un multímetro en serie y compara con la lectura del sensor. La sensibilidad de la versión de 5 A varía entre 180 y 190 mV/A de una unidad a otra, y con la proporción entre la corriente de referencia y la lectura corriges SENS. En el ESP32 este ajuste importa más, porque su ADC mide contra una referencia absoluta, mientras que el sensor es ratiométrico y su salida sigue a la alimentación, así que cualquier diferencia de la alimentación respecto de 5 V cambia la sensibilidad. La ficha declara un error total de ±1,5 % a plena escala y 25 °C.
Código para corriente alterna con valor RMS
En alterna la salida oscila alrededor del cero. Si promedias, el resultado da cero. Lo útil es el valor RMS. Se resta el cero a cada muestra, se eleva al cuadrado, se promedia y se saca la raíz. La ventana de medición debe cubrir ciclos completos de la red. La referencia de Arduino indica que una lectura analógica toma unos 100 microsegundos, o sea unas 10 000 por segundo, suficiente para muestrear una onda de 50 Hz. El código usa una ventana de 200 ms, que son 10 ciclos a 50 Hz y 12 ciclos a 60 Hz. Con la carga apagada el RMS no marca cero exacto por el ruido del sensor, que en la versión de 5 A ronda los 0,1 A, así que descarta lecturas bajo ese umbral.
const int PIN_ACS = A0;
// V/A, versión de 5 A
const float SENS = 0.185;
// 10 ciclos a 50 Hz
const unsigned long VENTANA_MS = 200;
float v0;
void setup() {
Serial.begin(115200);
delay(500);
long s = 0;
for (int i = 0; i < 500; i++)
s += analogRead(PIN_ACS);
// cero SIN corriente
v0 = (s / 500.0) * 5.0 / 1024.0;
}
void loop() {
double suma2 = 0;
unsigned long n = 0;
unsigned long t0 = millis();
while (millis() - t0 < VENTANA_MS) {
float v = analogRead(PIN_ACS)
* 5.0 / 1024.0 - v0;
suma2 += (double)v * v;
n++;
}
float irms = sqrt(suma2 / n) / SENS;
Serial.println(irms, 3);
}Código para ESP32
En el ESP32 cambian tres cosas: el ADC es de 12 bits, hay que fijar la atenuación del pin y la lectura se corrige por el divisor. La función analogReadMilliVolts entrega la lectura calibrada en milivolts, según la documentación de Arduino-ESP32. El ejemplo usa el GPIO34, que pertenece al ADC1 en el ESP32 clásico. En las variantes S3 y C3 los pines del ADC y los rangos son otros, así que revisa la documentación de tu placa. El sketch de alterna con RMS también sirve en el ESP32. Reemplaza la lectura por analogReadMilliVolts(PIN_ACS) / 1000.0 / FACTOR_DIVISOR. Para las versiones de 20 A y de 30 A usa un FACTOR_DIVISOR de 10.0 / 22.0, con el par de 12 kΩ y 10 kΩ.
// ADC1, ESP32 clásico
const int PIN_ACS = 34;
// V/A, versión de 5 A
const float SENS = 0.185;
// 20 k / (12 k + 20 k)
const float FACTOR_DIVISOR = 20.0 / 32.0;
float v0;
float leerVoltiosSensor() {
long suma = 0;
for (int i = 0; i < 100; i++)
suma += analogReadMilliVolts(PIN_ACS);
float mv = suma / 100.0;
// tensión en la salida del ACS712
return (mv / 1000.0) / FACTOR_DIVISOR;
}
void setup() {
Serial.begin(115200);
analogReadResolution(12);
// 11 dB, rango recomendado 150-2450 mV
analogSetPinAttenuation(PIN_ACS, ADC_11db);
delay(500);
// cero SIN corriente
v0 = leerVoltiosSensor();
}
void loop() {
float a = (leerVoltiosSensor() - v0) / SENS;
Serial.println(a, 3);
delay(500);
}Resolución y ruido: qué corriente mínima distingues
Con el ADC de 10 bits de Arduino, un paso son unos 4,9 mV. En la versión de 5 A eso equivale a 4,9 / 185 = 0,026 A, unos 26 mA por paso. En la de 20 A son unos 49 mA, y en la de 30 A unos 74 mA. A eso se suma el ruido: la ficha da 21 mV pico a pico para la versión de 5 A con un filtro de 47 nF y 2 kHz de ancho de banda, lo que equivale a unos 0,11 A. Una ampolleta de 60 W a 220 V consume unos 0,27 A, así que se detecta, con una variación de lectura de cerca de 0,1 A. El sensor sirve para detectar si hay carga, medir motores, bombas y consumos de varios cientos de miliamperes hacia arriba. Para consumos de pocos miliamperes necesitas otro método.
Aislamiento y seguridad en 220 V
La hoja de datos de Allegro, en su revisión de febrero de 2024, especifica una tensión de aislamiento de 2400 VRMS durante 60 segundos entre el lado de la corriente y el lado de la señal, y un voltaje de trabajo máximo de 420 VPK para aislamiento básico (297 VRMS). Una red de 220 V RMS tiene un valor pico de unos 311 V (220 × 1,41), así que queda dentro de lo que la ficha declara como aislamiento básico, y la ficha no declara aislamiento reforzado. Una red trifásica de 380 V entre fases llega a unos 537 V de pico (380 × 1,41), por encima de esos 420 VPK, de modo que el ACS712 no está especificado para medir conductores a esa tensión. Todo esto se refiere al chip. La placa del módulo, sus separaciones y el montaje dependen del fabricante del módulo, y la ficha de Zamper no las especifica. Conectar un circuito de 220 V a un módulo suelto de bornera, sin caja y a la vista, expone a quien lo toca. Haz las pruebas con una carga de baja tensión o con un transformador de aislamiento, aloja el módulo en una caja cerrada y deja que un instalador eléctrico autorizado por la SEC haga cualquier conexión en un tablero. No dejes el montaje energizado y desatendido.
Errores comunes
Los más repetidos: conectar la salida de 5 V directo a un pin del ESP32; calibrar el cero con carga conectada; calibrar con una alimentación y medir con otra; promediar una señal alterna y obtener cero en vez de calcular el RMS; usar una ventana que no cubre ciclos completos; usar un pin del ADC2 del ESP32 con el Wi-Fi activo; poner el sensor en paralelo con la carga, en vez de en serie, lo que provoca un cortocircuito; y pedirle a la versión de 20 A que distinga unos pocos miliamperes. El máximo absoluto de la ficha de Allegro es de 100 A durante un pulso único de 100 ms, y no conviene acercarse a él.
Cuándo conviene un transformador de corriente (CT)
El ACS712 obliga a cortar el cable y pasar la corriente por el sensor. Un transformador de corriente de núcleo partido se abre y se cierra alrededor del cable sin desconectar nada, no tiene contacto eléctrico con el conductor y llega a rangos mayores, aunque mide solo corriente alterna. Por ejemplo, la pinza SCT-013G-D-100 acepta hasta 100 A según su ficha, con una salida de 0 a 50 mA. Esa salida en corriente debe convertirse a tensión con un circuito de acondicionamiento antes de entrar a un ADC. Si trabajas con corrientes de decenas de amperes, con instalaciones fijas o con tableros, un CT suele ser la opción más adecuada. La guía de medidores de corriente LoRaWAN y transformadores explica cómo elegir el rango y cómo instalarlo.
Cuándo conviene un medidor de corriente LoRaWAN
Si quieres medir un tablero o una máquina de forma permanente, enviar el dato por radio y no mantener tu propio código, un medidor LoRaWAN con CT integrado ahorra el trabajo de calibración, de acondicionamiento y de comunicación. Con el ACS712 y un ESP32 construyes una solución propia para un prototipo, una prueba o un proyecto educativo. Para una instalación permanente que reporte sola, el medidor LoRaWAN es la vía más directa.
Qué producto de Zamper te sirve según el caso
Para aprender y para prototipos de hasta 5 A, el sensor ACS712 de 5 A. Para medir alterna en un cable sin cortarlo, el transformador de corriente SCT-013G-D-100, de hasta 100 A. Para un circuito impreso propio, el micro transformador HMCT103C de 5 A a 5 mA. Para vigilar un circuito de forma permanente con radio, los medidores LoRaWAN con pinza integrada de Milesight, como el CT310 para conductores gruesos. Para varios circuitos desde un solo punto de radio, el CS01-LB de Dragino, de cuatro canales. La disponibilidad cambia, así que confírmala en la ficha de cada producto o desde Cotiza o consulta disponibilidad.
¿El ACS712 sirve para corriente continua y alterna?
Sí. Según la hoja de datos de Allegro, entrega una tensión proporcional a corrientes alterna o continua. En alterna debes calcular el RMS.
¿Por qué mi ACS712 marca una corriente con la carga apagada?
Porque el cero no está calibrado. La salida en reposo es VCC/2, y varía con tu alimentación. Mide el cero al arrancar, con el circuito sin corriente, y réstalo.
¿Puedo conectar la salida del ACS712 directo al ESP32?
No. Con 5 V de alimentación la salida de la versión de 5 A llega a unos 3,4 V, por encima de los 2450 mV que Espressif recomienda como máximo con la atenuación más alta. Usa un divisor de tensión, como el de 12 kΩ y 20 kΩ de esta guía.
¿Qué versión elijo, de 5 A, de 20 A o de 30 A?
La de menor rango que cubra tu corriente máxima con margen, porque tiene mayor sensibilidad. Zamper publica la de 5 A.
¿Sirve para medir el consumo de la casa?
Para eso conviene un transformador de corriente de núcleo partido o un medidor de energía, que no obligan a cortar el cable y aíslan mejor el circuito. El ACS712 está pensado para prototipos y cargas de baja corriente.
Fuentes técnicas
- Allegro MicroSystems: hoja de datos del ACS712 (Rev. 22, febrero de 2024) (abre en otra pestaña)
- Arduino: referencia de analogRead() (ADC de 10 bits, 4,9 mV por unidad, 100 µs por lectura) (abre en otra pestaña)
- Espressif: API ADC de Arduino-ESP32 (atenuación, rangos en mV, analogReadMilliVolts) (abre en otra pestaña)
- Espressif: ADC en ESP-IDF (resolución de 12 bits y calibración) (abre en otra pestaña)
- Espressif: ADC en ESP-IDF 4.4 para el ESP32 (rango sugerido de 150 a 2450 mV a 11 dB) (abre en otra pestaña)
- Espressif: ADC en modo oneshot (el ADC2 lo comparte el Wi-Fi) (abre en otra pestaña)