Arduino Nano ESP32 - Sensor de Corrente ACS712

Quanta corrente o seu motor realmente puxa? A sua fita LED de 12V está consumindo o que diz o rótulo? Neste guia, vamos aprender a usar o sensor de corrente ACS712 com o Arduino Nano ESP32 para descobrir. O sensor funciona com 5V, mas os pinos analógicos do Nano ESP32 aceitam apenas 3.3V, então também vamos adicionar um pequeno divisor com dois resistores. Em detalhes, vamos aprender:

Arduino Nano ESP32 and ACS712 current sensor

Sobre o Sensor de Corrente ACS712

O ACS712 é um pequeno chip da Allegro que mede corrente, tanto DC quanto AC. Dentro dele, a corrente passa por um caminho grosso de cobre. Essa corrente cria um campo magnético, e um sensor Hall bem ao lado do caminho transforma esse campo em uma tensão. O caminho de cobre não está ligado ao lado do Nano ESP32 de forma alguma (ele é isolado até 2.1 kV RMS), e sua resistência é de apenas cerca de 1.2 mΩ, então quase não altera o circuito que você mede.

ACS712 current sensor pinout
image source: diyables.io

O módulo tem um conector de 3 pinos de um lado e um borne de parafuso de 2 pinos do outro lado:

  • Pino VCC: conecte a 5V. No Arduino Nano ESP32, use o pino VBUS (5V do USB). O pino de 3.3V não é suficiente para este chip.
  • Pino GND: conecte ao GND (0V).
  • Pino OUT: tensão de saída analógica. Conecte-o ao pino analógico A0 do Arduino Nano ESP32 através do divisor de tensão (veja a parte da ligação).
  • Borne de parafuso (IP+ e IP−, às vezes sem rótulo): ele vai em série com a carga. Corte um fio de alimentação da carga e coloque o borne no vão, para que toda a corrente da carga passe pelo sensor. A corrente que entra em IP+ e sai em IP− dá uma leitura positiva.

Um pequeno LED na placa acende quando o módulo tem alimentação.

A 0 A, o OUT fica na metade da alimentação, cerca de 2.5V. Quando a corrente flui em um sentido, o OUT sobe. Quando flui no outro sentido, o OUT desce. A saída acompanha a alimentação real de 5V (ela é ratiométrica), então se o VBUS for 4.9V, o ponto zero é cerca de 2.45V.

O chip vem em três faixas de corrente. Este guia usa a versão de 30A.

ACS712 5A ACS712 20A ACS712 30A
Faixa de corrente ±5A ±20A ±30A
Sensibilidade 185 mV/A 100 mV/A 66 mV/A
Módulo ACS712 30A
Tensão de alimentação 5V (4.5V a 5.5V)
Saída a 0 A cerca de 2.5V (metade do VCC)
Saída a +30 A cerca de 4.48V
Saída a −30 A cerca de 0.52V
Sensibilidade 66 mV por ampere
Largura de banda 80 kHz
Erro total de saída cerca de ±1.5% a 25°C
Isolamento 2.1 kV RMS
Resistência do caminho de cobre cerca de 1.2 mΩ

A faixa de 30A é grande, então o sensor não é bom para correntes pequenas. O Nano ESP32 lê seu pino analógico com 12 bits, e depois do divisor um passo é de cerca de 18 mA. Com o ruído normal, você verá as leituras variarem cerca de ±50 a 100 mA mesmo sem carga. Então use-o para cargas de cerca de 0.5 A ou mais: motores, lâmpadas, fitas LED, aquecedores e carregadores. O código faz a média de muitas leituras para deixar os números mais calmos.

Como a Saída do Sensor Vira Amperes

Cada ampere move a saída em 66 mV, a partir da tensão zero. Então a fórmula é:

current_A = (Vout - Vzero) / 0.066

Exemplo: se o Vzero é 2.49V e o Vout lê 2.56V, a corrente é (2.56 − 2.49) / 0.066 ≈ 1.06 A.

Não confie cegamente no número de 2.5V. Cada módulo e cada porta USB é um pouco diferente. O código mede o Vzero na inicialização, enquanto nenhuma corrente flui, e usa esse valor.

Diagrama de Ligação

O ACS712 precisa de 5V, então seu VCC vai para o VBUS. Mas então o OUT pode subir até cerca de 4.5V, o que é alto demais para um pino analógico de 3.3V. Dois resistores resolvem isso: OUT → 10kΩ → A0 → 20kΩ → GND. O pino A0 agora vê 2/3 da tensão do sensor (4.5V viram 3.0V), e o código multiplica a leitura por 1.5 para recuperar o valor real.

The wiring diagram between Arduino Nano ESP32 and ACS712 current sensor

This image is created using Fritzing. Click to enlarge image

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

Módulo ACS712 Arduino Nano ESP32
VCC → VBUS (5V)
GND → GND
OUT → resistor de 10kΩ → A0 (e A0 → resistor de 20kΩ → GND)

No lado da carga, o adaptador de 12V é conectado ao DC power jack. Leve o fio + do jack a um parafuso do ACS712, o outro parafuso ao + do dispositivo DC de 12V (por exemplo um motor DC, fita LED ou lâmpada), e o − do dispositivo DC de volta ao fio − do jack. O circuito de 12V e o Nano ESP32 não compartilham nenhum fio.

Usamos o A0 porque ele pertence ao ADC1 do chip ESP32-S3. Os pinos A4 a A7 pertencem ao ADC2, que para de funcionar enquanto o WiFi está ligado. Com o A0, você pode adicionar WiFi a este projeto mais tarde.

※ Nota:

A rede elétrica AC (110V/220V) é perigosa. Aprenda primeiro com uma carga DC de baixa tensão, como o dispositivo DC de 12V deste guia. Se você algum dia medir um circuito de rede elétrica, nunca toque no borne de parafuso nem nos fios dele enquanto a energia estiver ligada. Esse lado do módulo carrega toda a tensão da carga.

Como Programar o Sensor de Corrente ACS712

Nenhuma biblioteca é necessária.

  • Defina o pino analógico e os números do divisor e do sensor:
#define SENSOR_PIN A0 #define DIVIDER_RATIO 1.5 #define SENSITIVITY 0.066
  • Deixe o pino analógico ler até cerca de 3.1V:
analogSetAttenuation(ADC_11db);
  • Leia a tensão do pino em milivolts e transforme-a de volta na tensão real do sensor. A função analogReadMilliVolts() usa a calibração do próprio chip, então é mais precisa do que analogRead():
float voltage = analogReadMilliVolts(SENSOR_PIN) / 1000.0 * DIVIDER_RATIO;
  • Encontre o ponto zero no setup(), com a carga DESLIGADA, fazendo a média de 1000 leituras.
  • Transforme a tensão em amperes:
float current = (voltage - zeroVoltage) / SENSITIVITY;

Código Arduino Nano ESP32 - Corrente DC do ACS712

O código abaixo encontra a tensão zero na inicialização. Depois, a cada 0.5 segundo, ele faz a média de 300 leituras e imprime a tensão do sensor e a corrente.

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-acs712-current-sensor */ #define SENSOR_PIN A0 // The Arduino Nano ESP32 pin connected to the divider middle point #define DIVIDER_RATIO 1.5 // 10k + 20k divider: sensor voltage = pin voltage x 1.5 #define SENSITIVITY 0.066 // ACS712 30A version: 66 mV per amp (0.066 V/A) #define SAMPLES 300 // number of readings averaged for each result float zeroVoltage = 2.5; // sensor output at 0 A, measured again in setup() // read the sensor output voltage (in volts), averaged over many samples float readSensorVoltage(int count) { long sum_mv = 0; for (int i = 0; i < count; i++) { sum_mv += analogReadMilliVolts(SENSOR_PIN); // voltage on the pin, in millivolts } float pin_voltage = (sum_mv / (float)count) / 1000.0; return pin_voltage * DIVIDER_RATIO; // undo the divider to get the real sensor voltage } void setup() { Serial.begin(9600); analogSetAttenuation(ADC_11db); // allow the analog pin to read up to about 3.1V // the load must be OFF now, so the sensor output is the real zero point Serial.println("Calibrating... keep the load OFF"); zeroVoltage = readSensorVoltage(1000); Serial.print("Zero voltage: "); Serial.print(zeroVoltage, 3); Serial.println(" V"); } void loop() { float voltage = readSensorVoltage(SAMPLES); float current = (voltage - zeroVoltage) / SENSITIVITY; // amps Serial.print("Sensor output: "); Serial.print(voltage, 3); Serial.print(" V | Current: "); Serial.print(current, 2); Serial.println(" A"); delay(500); }

Passos Rápidos

Siga estas instruções passo a passo:

  • Se esta é a primeira vez que você usa o Arduino Nano ESP32, veja como configurar o ambiente para o Arduino Nano ESP32 na Arduino IDE.
  • Ligue os componentes de acordo com o diagrama fornecido. Deixe o adaptador de 12V desconectado por enquanto.
  • Conecte o Arduino Nano ESP32 ao seu computador usando um cabo USB Type-C.
  • Abra a Arduino IDE no seu computador.
  • Selecione a placa Arduino Nano ESP32 apropriada (por exemplo, Arduino Nano ESP32) e a porta COM.
  • Copie o código acima e cole-o na Arduino IDE.
  • Abra o Serial Monitor e defina o baud rate como 9600.
  • Clique no botão Upload para enviar o código ao Arduino Nano ESP32. A carga deve estar DESLIGADA enquanto a placa inicia, porque é nesse momento que o ponto zero é medido.
  • Espere até que o Serial Monitor mostre a tensão zero. Depois conecte o adaptador de 12V para ligar o dispositivo DC.
  • Observe a corrente subir. Se o seu dispositivo DC for um motor, segure o eixo dele de leve com os dedos e a corrente sobe mais.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
Calibrating... keep the load OFF Zero voltage: 2.487 V Sensor output: 2.490 V | Current: 0.05 A Sensor output: 2.485 V | Current: -0.03 A Sensor output: 2.489 V | Current: 0.03 A Sensor output: 2.546 V | Current: 0.89 A Sensor output: 2.541 V | Current: 0.82 A Sensor output: 2.544 V | Current: 0.86 A Sensor output: 2.567 V | Current: 1.21 A Sensor output: 2.571 V | Current: 1.27 A Sensor output: 2.543 V | Current: 0.85 A
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2

As primeiras linhas mostram algumas dezenas de mA sem carga. Isso é um ruído normal para a versão de 30A. Se os números saírem negativos quando o dispositivo DC está ligado, troque os dois fios no borne de parafuso.

※ Nota:

Se a leitura estiver muito errada, verifique se o VCC está no VBUS e não no 3.3V, e se o resistor de 10kΩ está entre o OUT e o A0 enquanto o resistor de 20kΩ está entre o A0 e o GND. Se os dois resistores estiverem trocados, o pino só vê 1/3 da tensão.

Medindo Corrente AC

Com AC, a corrente muda de sentido muitas vezes por segundo (50 ou 60 vezes, dependendo do seu país). A saída do sensor oscila acima e abaixo da tensão zero, então uma média simples dá quase 0 A. Usamos o valor RMS no lugar. O código amostra o sinal por 200 ms, o que cobre 10 ciclos a 50 Hz e 12 ciclos a 60 Hz. Para cada amostra ele pega a distância até a tensão zero e eleva ao quadrado. Depois:

current_RMS = sqrt(average of (Vout - Vzero)²) / 0.066

Segurança de novo: um circuito de rede elétrica pode matar. Não tente isso em 110V/220V a menos que você saiba trabalhar com a rede elétrica com segurança, e mantenha as mãos longe do borne de parafuso enquanto a energia estiver ligada. A ligação com o Nano ESP32 e a calibração do zero são as mesmas de acima.

Código Arduino Nano ESP32 - Corrente AC do ACS712

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-acs712-current-sensor */ #define SENSOR_PIN A0 // The Arduino Nano ESP32 pin connected to the divider middle point #define DIVIDER_RATIO 1.5 // 10k + 20k divider: sensor voltage = pin voltage x 1.5 #define SENSITIVITY 0.066 // ACS712 30A version: 66 mV per amp (0.066 V/A) #define WINDOW_MS 200 // 200 ms = 10 cycles at 50 Hz, 12 cycles at 60 Hz float zeroVoltage = 2.5; // sensor output at 0 A, measured again in setup() // read the real sensor output voltage (in volts) once float readSensorVoltage() { return analogReadMilliVolts(SENSOR_PIN) / 1000.0 * DIVIDER_RATIO; } void setup() { Serial.begin(9600); analogSetAttenuation(ADC_11db); // allow the analog pin to read up to about 3.1V // the load must be OFF now, so the sensor output is the real zero point Serial.println("Calibrating... keep the load OFF"); float sum = 0; for (int i = 0; i < 1000; i++) { sum += readSensorVoltage(); } zeroVoltage = sum / 1000; Serial.print("Zero voltage: "); Serial.print(zeroVoltage, 3); Serial.println(" V"); } void loop() { float sumSquares = 0; long count = 0; unsigned long startTime = millis(); // sample for a fixed time window that covers several AC cycles while (millis() - startTime < WINDOW_MS) { float diff = readSensorVoltage() - zeroVoltage; // distance from the zero point sumSquares += diff * diff; count++; } float rmsVoltage = sqrt(sumSquares / count); // RMS of the AC part of the signal float rmsCurrent = rmsVoltage / SENSITIVITY; // amps (RMS) Serial.print("AC current (RMS): "); Serial.print(rmsCurrent, 2); Serial.println(" A"); delay(500); }

Faça o upload da mesma forma, com a carga desligada na inicialização. Exemplo de saída com um pequeno aparelho AC ligado depois da calibração:

∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
Calibrating... keep the load OFF Zero voltage: 2.492 V AC current (RMS): 0.07 A AC current (RMS): 0.06 A AC current (RMS): 0.58 A AC current (RMS): 0.61 A AC current (RMS): 0.59 A
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2

O ruído também soma um pequeno valor RMS quando nada está ligado, então uma leitura abaixo de cerca de 0.1 A significa "cerca de zero".

Vídeo

※ 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!