El ACS712 es un sensor de corriente de bajo coste basado en el efecto Hall. Su funcionamiento consiste en detectar el campo magnético generado por la corriente que circula a través de un conductor, lo que permite realizar la medida de forma indirecta y con aislamiento eléctrico. El sensor entrega una señal de salida en forma de voltaje analógico proporcional a la corriente medida. Existen distintas versiones según el rango de trabajo, siendo las más habituales ±5 A, ±20 A y ±30 A, lo que permite adaptarlo a diferentes aplicaciones. Normalmente, el ACS712 se encuentra integrado
Normalmente, el ACS712 se encuentra integrado en módulos que facilitan su uso. Estos incluyen una bornera para conectar la línea de corriente que se desea medir y tres pines principales: alimentación (VCC), tierra (GND) y salida analógica (OUT).
El ACS712 no es único, sino que existen varias versiones optimizadas para distintos rangos de medida. La elección influye directamente en la precisión:
| Modelo | Rango de corriente | Sensibilidad |
|---|---|---|
| ACS712-05B | ±5 A | 185 mV/A |
| ACS712-20A | ±20 A | 100 mV/A |
| ACS712-30A | ±30 A | 66 mV/A |
El ACS712 es un componente económico y ampliamente disponible. A continuación se muestra una comparativa entre distintos fabricantes y distribuidores.
El sensor nos entrega un valor de 2.5 voltios para una corriente de 0A y a partir de allí incrementa proporcionalmente de acuerdo a la sensibilidad, teniendo una relación lineal entre la salida de voltaje del sensor y la corriente.
Dicha relación es una línea recta en una gráfica Voltaje vs Corriente donde la pendiente es la sensibilidad y la intersección en el eje Y es 2.5 voltios. La ecuación de la recta sería la siguiente:
Donde la pendiente es la Sensibilidad. Despejando, tendremos la ecuación para hallar la corriente a partir de la lectura del sensor:
La conexión del módulo ACS712 es directa, pero debes tener cuidado con el voltaje de tu microcontrolador. Selecciona tu placa a continuación para ver el esquema y las precauciones necesarias:
A continuación, tienes varios ejemplos para integrar el ACS712 en tus proyectos con Arduino. Selecciona el que mejor se adapte a lo que necesitas medir:
En nuestro caso estamos trabajando con un sensor de 5A por eso usamos el valor de sensibilidad de 0.185V/A que es el equivalente 185mV/A que nos da el fabricante, si están trabajando con el sensor de 20A, reemplazar el valor de la sensibilidad por 0.100 V/A.
Se puede notar que existe ruido en la lectura, si para su aplicación el ruido presente no tiene mucha importancia, podrían trabajar con el programa de este ejercicio, sino se tendrá que aplicar un filtro, que se muestra a continuación.
1// 1. LECTURA BÁSICA DIRECTA
2const int sensorPin = A0;
3float sensibilidad = 0.185; // 0.185 para 5A, 0.100 para 20A
4
5void setup() {
6 Serial.begin(9600);
7}
8
9void loop() {
10 // Leemos el valor analógico y lo pasamos a voltaje
11 float voltajeSensor = analogRead(sensorPin) * (5.0 / 1023.0);
12
13 // Aplicamos la fórmula matemática
14 float corriente = (voltajeSensor - 2.5) / sensibilidad;
15
16 Serial.print("Corriente: ");
17 Serial.print(corriente);
18 Serial.println(" A");
19
20 delay(500);
21}
1// 2. LECTURA CON FILTRO DE PROMEDIO PARA REDUCIR RUIDO
2const int sensorPin = A0;
3float sensibilidad = 0.185;
4
5void setup() {
6 Serial.begin(9600);
7}
8
9void loop() {
10 float sumaVoltaje = 0;
11
12 // Tomamos 100 muestras consecutivas
13 for(int i = 0; i < 100; i++) {
14 sumaVoltaje += analogRead(sensorPin) * (5.0 / 1023.0);
15 delay(2);
16 }
17
18 // Calculamos el promedio
19 float voltajePromedio = sumaVoltaje / 100.0;
20 float corriente = (voltajePromedio - 2.5) / sensibilidad;
21
22 Serial.print("Corriente Filtrada: ");
23 Serial.println(corriente);
24}
1// Programa para calibrar y obtener el voltaje del sensor
2void setup() {
3 Serial.begin(9600);
4}
5
6void loop() {
7 // Obtenemos voltaje del sensor (10000 muestras para máxima precisión)
8 float voltajeSensor = get_voltage(10000);
9
10 Serial.print("Voltaje del sensor: ");
11 Serial.println(voltajeSensor, 3);
12}
13
14float get_voltage(int n_muestras) {
15 float voltage = 0;
16
17 for(int i = 0; i < n_muestras; i++) {
18 voltage = voltage + analogRead(A0) * (5.0 / 1023.0);
19 }
20
21 voltage = voltage / n_muestras;
22 return voltage;
23}
1float sensibilidad = 0.139; // Sensibilidad calibrada en V/A
2float offset = 0.100; // Equivale a la amplitud del ruido en 0A
3
4void setup() {
5 Serial.begin(9600);
6}
7
8void loop() {
9 float Ip = get_corriente(); // Obtenemos la corriente pico
10 float Irms = Ip * 0.707; // Intensidad RMS = Ipico / √2
11 float P = Irms * 220.0; // Potencia = I*V (Asumiendo red de 220V)
12
13 Serial.print("Ip: ");
14 Serial.print(Ip, 3);
15 Serial.print("A, Irms: ");
16 Serial.print(Irms, 3);
17 Serial.print("A, Potencia: ");
18 Serial.print(P, 3);
19 Serial.println("W");
20
21 delay(500);
22}
23
24float get_corriente() {
25 float voltajeSensor;
26 float corriente = 0;
27 long tiempo = millis();
28 float Imax = 0;
29 float Imin = 0;
30
31 // Realizamos mediciones durante 0.5 segundos
32 while(millis() - tiempo < 500) {
33 voltajeSensor = analogRead(A0) * (5.0 / 1023.0);
34
35 // Filtro pasa bajos y cálculo con valor de calibración (2.527)
36 corriente = 0.9 * corriente + 0.1 * ((voltajeSensor - 2.527) / sensibilidad);
37
38 if(corriente > Imax) Imax = corriente;
39 if(corriente < Imin) Imin = corriente;
40 }
41
42 return (((Imax - Imin) / 2) - offset);
43}