Arduino - Sensor de Corrente ACS712

Neste tutorial, vamos aprender:

Arduino Sensor de Corrente ACS712

Um sensor de tensão nos diz quantos volts um circuito tem (veja Arduino - Medir Tensão). O ACS712 responde a uma pergunta diferente: quantos amperes passam pelo fio. Com ele, o Arduino pode ver se um motor está trabalhando forte, se uma lâmpada está ligada ou se um carregador ainda puxa corrente.

Hardware Necessário

1×Arduino Uno R3
1×Cabo USB 2.0 tipo A/B (para PC com USB-A)
1×Cabo USB 2.0 tipo C/B (para PC com USB-C)
1×ACS712 30A Current Sensor Module
1×12V DC Device (e.g. 12V DC Motor)
1×(Opcional) 12V DC Device (e.g. 12V LED Strip)
1×Fonte de Alimentação 12V
1×Conector de Alimentação DC
1×Fios Jumper
1×(Recomendado) Shield com Bornes de Parafuso para Arduino Uno
1×(Recomendado) Sensors/Servo Expansion Shield for Arduino Uno
1×(Recomendado) Shield de Protoboard para Arduino Uno
1×(Recomendado) Case para Arduino Uno
1×(Recomendado) Placa Base de Prototipagem e Kit de Protoboard para Arduino Uno

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

Qualquer dispositivo DC de 12V serve como nossa carga de teste, por exemplo um motor DC de 12V ou uma fita LED. Você só precisa de um deles.

Sobre o Sensor de Corrente ACS712

O ACS712 é um chip sensor de corrente fabricado pela Allegro. Ele usa o efeito Hall. A corrente passa por um caminho grosso de cobre dentro do chip. Essa corrente cria um pequeno campo magnético, e um sensor Hall ao lado do cobre transforma esse campo em uma tensão. O caminho de cobre tem uma resistência muito baixa (cerca de 1.2 mΩ), então quase não altera o circuito que medimos. Além disso, o lado da carga é isolado do lado do Arduino (2.1 kV RMS), então os fios de alta corrente nunca tocam os pinos do Arduino.

Pinagem do Sensor de Corrente ACS712

O ACS712 vem em três versões. Elas parecem iguais, mas a sensibilidade é diferente:

Versão Faixa Sensibilidade
ACS712 5A -5A a +5A 185 mV por ampere
ACS712 20A -20A a +20A 100 mV por ampere
ACS712 30A -30A a +30A 66 mV por ampere

Este tutorial usa a versão de 30A. Suas principais especificações são:

ACS712 30A
Tensão de Alimentação 5V (4.5V a 5.5V)
Faixa de Corrente -30A a +30A (DC e AC)
Sensibilidade 66 mV por ampere
Saída em 0A cerca de 2.5V (metade do VCC)
Saída em +30A / -30A cerca de 4.48V / 0.52V
Largura de Banda 80 kHz
Erro Total de Saída cerca de ±1.5% a 25°C
Isolamento 2.1 kV RMS

O módulo ACS712 tem um conector de 3 pinos e um borne de parafuso de 2 pinos:

  • Pino VCC: precisa ser conectado ao 5V. O módulo não funciona bem com 3.3V
  • Pino GND: precisa ser conectado ao GND (0V)
  • Pino OUT: a saída analógica. Ele precisa ser conectado a um pino de entrada analógica do Arduino
  • IP+ e IP- (o borne de parafuso): a corrente a ser medida passa por aqui. Ele precisa ser conectado em série com a carga. Em alguns módulos, esses dois parafusos não têm rótulo

O módulo também tem um LED de energia que acende quando o VCC está conectado.

Quando a corrente flui de IP+ para IP-, a tensão de saída sobe acima de 2.5V e a leitura é positiva. Quando ela flui no outro sentido, a tensão fica abaixo de 2.5V e a leitura é negativa. A saída é ratiométrica: ela acompanha a alimentação real de 5V. Se o pino 5V do Arduino fornecer 4.92V, o ponto zero será cerca de 2.46V, não 2.50V.

Como a Tensão Vira Corrente

A regra é simples: cada 66 mV de distância do ponto zero significa 1 ampere. Então a fórmula é:

corrente (A) = (Vout - Vzero) / 0.066

Por exemplo, se o ponto zero é 2.506V e o OUT agora mostra 2.572V, a corrente é (2.572 - 2.506) / 0.066 = 1.0A.

※ Nota:

  • A versão de 30A não é para correntes pequenas. O Arduino Uno tem um ADC de 10 bits com referência de 5V, então um passo do ADC é cerca de 4.9 mV, ou cerca de 74 mA. Ela é boa para cargas de cerca de 0.5A para cima: motores, lâmpadas, fitas LED, aquecedores e carregadores.
  • Mesmo sem nada conectado, você pode ver uma pequena corrente como ±0.05A a ±0.1A. Isso é ruído normal. Ler muitas vezes e tirar a média deixa esse valor menor.
  • Não confie em 2.5V como o ponto zero exato. Meça-o quando nenhuma corrente fluir. Nosso código faz isso quando o Arduino inicia.

Diagrama de Ligação

O ACS712 é alimentado pelo pino 5V do Arduino e seu pino OUT vai direto ao A0. O Arduino Uno funciona a 5V, então não precisamos de um divisor de tensão. No lado da carga, corte o fio positivo entre o adaptador de 12V e o dispositivo DC de 12V (como um motor DC, fita LED ou lâmpada) e coloque o borne de parafuso no meio.

Diagrama de ligação do Arduino com o sensor de corrente ACS712

This image is created using Fritzing. Click to enlarge image

Tabela de ligação do Módulo ACS712 e do Arduino Uno

Módulo ACS712 Arduino Uno
VCC → 5V
GND → GND
OUT → A0

Ligação do lado da carga

De Para
Adaptador de 12V (+) pelo conector de alimentação DC → IP+ do ACS712
IP- do ACS712 → Dispositivo DC (+)
Dispositivo DC (-) → Adaptador de 12V (-) pelo conector de alimentação DC

※ Nota:

Segurança em primeiro lugar: A rede elétrica AC (110V/220V) é perigosa e pode matar. Por favor, pratique com uma carga DC de baixa tensão, como o dispositivo DC de 12V deste tutorial. O borne de parafuso e seus fios carregam a tensão total da carga, então nunca toque neles enquanto um circuito da rede elétrica estiver ligado.

Como Programar o Sensor de Corrente ACS712

  • Defina o pino analógico e a sensibilidade da versão de 30A:
#define SENSOR_PIN A0 #define SENSITIVITY 0.066 // 66 mV per amp
  • Leia o pino muitas vezes e tire a média da tensão. Isso remove muito ruído:
long sum = 0; for (int i = 0; i < 200; i++) { sum += analogRead(SENSOR_PIN); } float voltage = (sum / 200.0) * 5.0 / 1024.0;
  • Meça o ponto zero uma vez no setup(), quando a carga está DESLIGADA:
zeroVoltage = readSensorVoltage(1000);
  • Converta a tensão em corrente:
float current = (voltage - zeroVoltage) / SENSITIVITY;

Código Arduino - Medir Corrente DC

O código abaixo encontra o ponto zero quando o Arduino inicia. Depois disso, ele imprime a tensão do sensor e a corrente a cada 500 ms.

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-acs712-current-sensor */ // ACS712 30A current sensor: the OUT pin is connected to Arduino Uno pin A0 #define SENSOR_PIN A0 #define REF_VOLTAGE 5.0 // the analog reference of Arduino Uno is 5V #define ADC_RESOLUTION 1024.0 // Arduino Uno has a 10-bit ADC (0 to 1023) #define SENSITIVITY 0.066 // 30A version: 66 mV (0.066 V) per amp #define NUM_SAMPLES 200 // number of readings to average for one result float zeroVoltage = 2.5; // the sensor output at 0A, measured again in setup() // read the sensor many times and return the average voltage on the OUT pin float readSensorVoltage(int samples) { long sum = 0; for (int i = 0; i < samples; i++) { sum += analogRead(SENSOR_PIN); } float adcAverage = (float)sum / samples; return adcAverage * REF_VOLTAGE / ADC_RESOLUTION; } // the setup function runs once when you press reset or power the board void setup() { Serial.begin(9600); // calibrate the zero point: the load MUST be OFF now (no current flows) Serial.println("Calibrating... keep the load OFF"); zeroVoltage = readSensorVoltage(1000); Serial.print("Zero voltage = "); Serial.print(zeroVoltage, 3); Serial.println(" V"); Serial.println("Done. You can turn the load ON now."); } // the loop function runs over and over again forever void loop() { float voltage = readSensorVoltage(NUM_SAMPLES); // convert the voltage to current: every 0.066V away from the zero point = 1A float current = (voltage - zeroVoltage) / SENSITIVITY; Serial.print("Sensor voltage: "); Serial.print(voltage, 3); Serial.print(" V | Current: "); Serial.print(current, 2); Serial.println(" A"); delay(500); }

Passos Rápidos

  • Faça a ligação como mostrado no diagrama acima
  • Desligue a carga (desconecte o adaptador de 12V) antes de ligar a placa
  • Conecte o Arduino ao PC por cabo USB
  • Abra a Arduino IDE, selecione a placa e a porta corretas
  • Copie o código acima e abra-o com a Arduino IDE
  • Clique no botão Upload na Arduino IDE para fazer o upload do código para o Arduino
  • Abra o Serial Monitor e espere a mensagem "Done"
  • Conecte o adaptador de 12V para ligar o dispositivo DC
  • Veja o resultado no Serial Monitor
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Calibrating... keep the load OFF Zero voltage = 2.506 V Done. You can turn the load ON now. Sensor voltage: 2.510 V | Current: 0.06 A Sensor voltage: 2.503 V | Current: -0.05 A Sensor voltage: 2.507 V | Current: 0.02 A Sensor voltage: 2.598 V | Current: 1.39 A Sensor voltage: 2.567 V | Current: 0.92 A Sensor voltage: 2.561 V | Current: 0.83 A Sensor voltage: 2.564 V | Current: 0.88 A Sensor voltage: 2.589 V | Current: 1.24 A
Ln 11, Col 1
Arduino Uno on COM15
2

As três primeiras linhas são o ruído quando nenhuma corrente flui. Aqui, um motor DC de 12V é usado como o dispositivo DC. Quando o motor parte, ele puxa um pico curto (1.39A) e depois funciona com cerca de 0.85A. Se segurarmos o eixo do motor com um dedo, a corrente sobe (1.24A), porque o motor precisa trabalhar mais forte.

Se a corrente mostrar um sinal de menos, a corrente vai de IP- para IP+. Troque os dois fios no borne de parafuso, ou simplesmente ignore o sinal.

Medindo Corrente AC

A corrente AC muda de sentido muitas vezes por segundo (50 ou 60 vezes). Se lermos o OUT apenas uma vez, podemos pegar qualquer ponto da onda, então o resultado fica pulando. Em vez disso, coletamos muitas amostras durante 200 ms, o que cobre 10 ciclos a 50Hz ou 12 ciclos a 60Hz. Depois calculamos o valor RMS, que é o número que um multímetro mostra para AC:

corrente RMS = sqrt(média de (Vout - Vzero)²) / 0.066

※ Nota:

Para medir AC da rede elétrica, o fio da carga passa pelo borne de parafuso, e esse borne carrega 110V/220V. Só faça isso se você souber trabalhar com a rede elétrica com segurança. Nunca toque no módulo enquanto o circuito estiver ligado.

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-acs712-current-sensor */ // ACS712 30A current sensor: the OUT pin is connected to Arduino Uno pin A0 #define SENSOR_PIN A0 #define REF_VOLTAGE 5.0 // the analog reference of Arduino Uno is 5V #define ADC_RESOLUTION 1024.0 // Arduino Uno has a 10-bit ADC (0 to 1023) #define SENSITIVITY 0.066 // 30A version: 66 mV (0.066 V) per amp #define WINDOW_MS 200 // 200 ms = 10 cycles at 50Hz, 12 cycles at 60Hz float zeroVoltage = 2.5; // the sensor output at 0A, measured again in setup() // convert one ADC reading to a voltage float toVoltage(int adcValue) { return adcValue * REF_VOLTAGE / ADC_RESOLUTION; } // the setup function runs once when you press reset or power the board void setup() { Serial.begin(9600); // calibrate the zero point: the load MUST be OFF now (no current flows) Serial.println("Calibrating... keep the load OFF"); long sum = 0; for (int i = 0; i < 1000; i++) { sum += analogRead(SENSOR_PIN); } zeroVoltage = toVoltage(sum / 1000.0); Serial.print("Zero voltage = "); Serial.print(zeroVoltage, 3); Serial.println(" V"); } // the loop function runs over and over again forever void loop() { // sample the signal during the whole time window and sum the squares float sumOfSquares = 0; long count = 0; unsigned long startTime = millis(); while (millis() - startTime < WINDOW_MS) { float diff = toVoltage(analogRead(SENSOR_PIN)) - zeroVoltage; sumOfSquares += diff * diff; count++; } // RMS voltage around the zero point, then convert it to RMS current float rmsVoltage = sqrt(sumOfSquares / count); float rmsCurrent = rmsVoltage / SENSITIVITY; Serial.print("AC current (RMS): "); Serial.print(rmsCurrent, 2); Serial.print(" A ("); Serial.print(count); Serial.println(" samples)"); delay(300); }

Passos Rápidos

  • Mantenha a mesma ligação de 3 pinos entre o ACS712 e o Arduino
  • Certifique-se de que a carga AC esteja DESLIGADA quando o Arduino iniciar
  • Copie o código acima e abra-o com a Arduino IDE
  • Clique no botão Upload na Arduino IDE para fazer o upload do código para o Arduino
  • Ligue a carga AC e veja o resultado no Serial Monitor
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Calibrating... keep the load OFF Zero voltage = 2.504 V AC current (RMS): 0.09 A (1293 samples) AC current (RMS): 0.08 A (1294 samples) AC current (RMS): 2.21 A (1293 samples) AC current (RMS): 2.18 A (1292 samples) AC current (RMS): 2.19 A (1293 samples)
Ln 11, Col 1
Arduino Uno on COM15
2

Aqui, um aquecedor de 500W em 230V é ligado e o sensor mostra cerca de 2.2A. Sem carga, o valor RMS não é exatamente 0, porque o ruído também conta. Para cargas AC pequenas, a versão de 5A do ACS712 dá resultados muito melhores.

Vídeo

Referências de Funções

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!