ESP32 - Sensor de Corrente ACS712

Este tutorial ensina você a usar o ESP32 para ler a corrente que passa por uma carga com o módulo sensor de corrente ACS712 de 30A e imprimi-la em amperes no Serial Monitor. Começamos com um dispositivo DC de 12V, como um motor DC, uma fita LED ou uma lâmpada, e no final do tutorial mudamos o código para medir corrente AC como um valor RMS.

ESP32 Sensor de corrente ACS712

Saber a corrente diz muito sobre um dispositivo. Um motor que de repente puxa o dobro da corrente normal provavelmente está travado, um carregador de bateria que cai para quase zero terminou, e um aquecedor que não puxa nada tem a resistência quebrada. O ESP32 pode vigiar esse número para você e, mais tarde, enviá-lo para o seu celular por WiFi.

Sobre o Sensor de Corrente ACS712

O ACS712 da Allegro mede a corrente usando o efeito Hall. Dentro do chip, a corrente passa por um caminho grosso de cobre. Essa corrente cria um campo magnético, e um sensor Hall colocado bem ao lado do caminho transforma esse campo em uma tensão. Como não há nenhuma ligação elétrica entre o caminho de cobre e o lado do sensor, o circuito que você mede fica isolado eletricamente do ESP32. O caminho de cobre também é muito curto, cerca de 1.2 mΩ, então colocar o sensor em um circuito quase não o altera.

O chip vem em três faixas de corrente. Elas parecem iguais, mas cada uma dá uma tensão diferente por ampere. Este tutorial usa a versão de 30A.

ACS712 5A ACS712 20A ACS712 30A
A faixa de corrente -5A a +5A -20A a +20A -30A a +30A
A sensibilidade 185 mV por ampere 100 mV por ampere 66 mV por ampere
ACS712 30A (ACS712ELCTR-30A-T)
A tensão de alimentação 5V (4.5V a 5.5V)
A corrente medida DC e AC, -30A a +30A
A saída em 0A cerca de 2.5V (metade da alimentação)
A saída em +30A / -30A cerca de 4.48V / cerca de 0.52V
A largura de banda 80 kHz
O erro total de saída cerca de ±1.5% a 25°C
A tensão de isolamento 2.1 kV RMS
A resistência do caminho da corrente cerca de 1.2 mΩ

A saída é ratiométrica. Isso significa que a saída acompanha a tensão de alimentação real: se a linha de 5V na verdade está em 4.9V, o ponto zero se move para cerca de 2.45V. É por isso que o código mede o ponto zero na inicialização em vez de confiar no número 2.5V.

Pinagem do ACS712

Pinagem do sensor de corrente ACS712
image source: diyables.io

O módulo tem dois lados. Um conector de 3 pinos em um dos lados vai para o ESP32:

  • Pino VCC: conecte este pino ao 5V. Na placa ESP32, use o pino VIN (ele fornece cerca de 5V quando a placa é alimentada por USB). Não use o pino 3.3V, o sensor precisa de 5V.
  • Pino GND: conecte este pino ao GND (0V) do ESP32
  • Pino OUT: a tensão de saída analógica. Conecte este pino a um pino analógico do ESP32 por meio de um divisor de tensão (veja a ligação abaixo)

Um borne de parafuso de 2 pinos no outro lado transporta a corrente que você quer medir. Algumas placas imprimem IP+ e IP- ao lado dele, outras não imprimem nada. Este borne deve ficar 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 módulo. Quando a corrente flui de IP+ para IP-, a leitura é positiva. Se a sua leitura for negativa, é só trocar os dois fios. Um pequeno LED na placa mostra que o módulo está alimentado.

A Versão de 30A É Boa para Correntes Pequenas?

Na verdade não. A versão de 30A muda apenas 66mV para cada ampere. Com o ADC de 12 bits do ESP32 e o nosso divisor, um passo do ADC é cerca de 17mA na teoria, mas o ADC do ESP32 tem ruído, então a leitura varia ±50 a ±100mA mesmo quando nada está passando. Isso é normal. O sensor combina bem com cargas de cerca de 0.5A ou mais, como motores, lâmpadas, fitas LED, aquecedores e carregadores. O código faz a média de várias amostras para deixar o valor mais calmo. Para cargas pequenas, como um único LED, escolha a versão de 5A.

※ Nota:

A rede elétrica AC (110V/220V) é perigosa e pode matar. Enquanto você aprende, use uma carga DC de baixa tensão, como o dispositivo DC de 12V deste tutorial. O lado de cobre e o borne de parafuso do módulo carregam a tensão total da carga, então nunca toque neles nem nos fios enquanto um circuito da rede elétrica estiver ligado.

Como o ESP32 Transforma a Tensão em Amperes

Em 0A o pino OUT fica na tensão zero (cerca de 2.5V). A corrente em um sentido o empurra para cima, a corrente no outro sentido o puxa para baixo, em 0.066V para cada ampere. Então a fórmula é:

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

Por exemplo, se a tensão zero é 2.47V e o pino OUT agora mostra 2.53V, a corrente é (2.53 - 2.47) / 0.066 = 0.91A.

Há mais um passo para o ESP32. O pino OUT pode chegar a cerca de 4.5V, mas um pino analógico do ESP32 só aceita até 3.3V. Um resistor de 10kΩ e um de 20kΩ dividem a tensão para dois terços antes de ela chegar ao pino, então 4.5V vira 3.0V. No código, multiplicamos a tensão do pino por 1.5 para recuperar a tensão real do OUT.

Diagrama de Ligação entre o ACS712 e o ESP32

Alimente o ACS712 pelo pino VIN do ESP32 (5V do USB). O pino OUT passa pelo resistor de 10kΩ até o GPIO36, e um resistor de 20kΩ vai do GPIO36 ao GND. Usamos o GPIO36 porque ele pertence ao ADC1. Os pinos ADC2 do ESP32 param de funcionar quando o WiFi está ligado, então os pinos ADC1 (GPIO32 a GPIO39) são a escolha segura se você adicionar WiFi mais tarde. O GPIO34 também funciona.

No lado da carga, o adaptador de 12V alimenta o dispositivo DC pelo conector de alimentação DC, e o fio positivo do dispositivo DC passa pelo borne de parafuso do ACS712. Os 12V nunca tocam em nenhum pino do ESP32.

  • Como conectar o ESP32 e o sensor de corrente ACS712 usando um protoboard
Diagrama de ligação do ESP32 com o sensor de corrente ACS712

This image is created using Fritzing. Click to enlarge image

Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.

Como conectar o ESP32 e o sensor de corrente ACS712
De Para
ACS712 VCC ESP32 VIN (5V)
ACS712 GND ESP32 GND
ACS712 OUT resistor de 10kΩ, outra ponta no GPIO36
GPIO36 resistor de 20kΩ, outra ponta no GND do ESP32
adaptador de 12V + (via conector de alimentação DC) borne IP+ do ACS712
borne IP- do ACS712 fio + do dispositivo DC
fio - do dispositivo DC adaptador de 12V - (via conector de alimentação DC)

Como Programar o Sensor de Corrente ACS712

Nenhuma biblioteca é necessária. O core do ESP32 já tem tudo.

  • Leia o pino analógico em milivolts. A função analogReadMilliVolts() usa os dados de calibração guardados no ESP32, então é mais precisa que analogRead() com uma fórmula simples:
uint32_t mv = analogReadMilliVolts(SENSOR_PIN);
  • Desfaça o divisor de tensão para obter a tensão OUT do sensor:
float sensorVoltage = mv / 1000.0 * 1.5;
  • Na inicialização, com a carga DESLIGADA, faça a média de 1000 leituras e guarde o resultado como a tensão zero:
zeroVoltage = readSensorVoltage(1000);
  • Faça a média de algumas centenas de leituras e depois transforme a tensão em amperes:
float current = (sensorVoltage - zeroVoltage) / 0.066;

Código ESP32 - Corrente DC do ACS712

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-acs712-current-sensor */ // ESP32 measures DC current with the ACS712 30A current sensor and prints it to the Serial Monitor // Wiring: ACS712 VCC -> ESP32 VIN (5V), ACS712 GND -> ESP32 GND // ACS712 OUT -> 10k resistor -> GPIO36 -> 20k resistor -> GND (voltage divider) // Keep the load OFF when the ESP32 starts, so the zero point can be measured. #define SENSOR_PIN 36 // ESP32 pin GPIO36 (ADC1) connected to the divider output #define DIVIDER_RATIO 1.5 // (10k + 20k) / 20k: turns the pin voltage back into the sensor OUT voltage #define SENSITIVITY 0.066 // 30A version: 66mV (0.066V) per amp #define SAMPLES 200 // number of readings to average for each result float zeroVoltage = 2.5; // sensor output at 0A, measured again in setup() // read the sensor OUT voltage (in volts), averaged over many samples float readSensorVoltage(int count) { uint32_t sum = 0; for (int i = 0; i < count; i++) { sum += analogReadMilliVolts(SENSOR_PIN); // calibrated reading in millivolts delayMicroseconds(100); } float pinVoltage = (sum / (float)count) / 1000.0; // millivolts -> volts return pinVoltage * DIVIDER_RATIO; // undo the voltage divider } void setup() { Serial.begin(9600); analogSetAttenuation(ADC_11db); // allow up to about 3.1V on the ADC pin // measure the real zero point while NO current flows Serial.println("Calibrating... keep the load OFF"); delay(1000); zeroVoltage = readSensorVoltage(1000); Serial.print("Zero voltage: "); Serial.print(zeroVoltage, 3); Serial.println(" V"); } void loop() { float sensorVoltage = readSensorVoltage(SAMPLES); float current = (sensorVoltage - zeroVoltage) / SENSITIVITY; // amps Serial.print("Voltage: "); Serial.print(sensorVoltage, 3); Serial.print(" V | Current: "); Serial.print(current, 2); Serial.println(" A"); delay(500); }

Passos Rápidos

  • Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para ESP32 no Arduino IDE.
  • Faça a ligação como na imagem acima. Confira duas vezes os dois resistores: 10kΩ entre OUT e GPIO36, 20kΩ entre GPIO36 e GND.
  • Desligue a carga (deixe o adaptador de 12V desconectado) antes de alimentar o ESP32.
  • Conecte a placa ESP32 ao seu PC por um cabo USB Type-C.
  • Abra o Arduino IDE no seu PC.
  • Selecione a placa ESP32 correta (por exemplo, ESP32 Dev Module) e a porta COM.
  • Copie o código acima e abra com o Arduino IDE.
  • Clique no botão Upload no Arduino IDE para fazer o upload do código para o ESP32.
  • Abra o Serial Monitor e espere a linha "Zero voltage".
  • Agora conecte o adaptador de 12V para ligar o dispositivo DC e observe a corrente.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
Calibrating... keep the load OFF Zero voltage: 2.468 V Voltage: 2.471 V | Current: 0.05 A Voltage: 2.465 V | Current: -0.05 A Voltage: 2.469 V | Current: 0.02 A Voltage: 2.533 V | Current: 0.98 A Voltage: 2.537 V | Current: 1.05 A Voltage: 2.529 V | Current: 0.92 A Voltage: 2.541 V | Current: 1.11 A Voltage: 2.468 V | Current: 0.00 A
Ln 11, Col 1
ESP32 Dev Module on COM15
2

As primeiras linhas são o ruído em repouso: o valor pula alguns centésimos de ampere em torno de zero. Com um motor DC de 12V como dispositivo DC, a corrente sobe até cerca de 1A quando o motor parte. Segure o eixo do motor suavemente com os dedos e a corrente sobe, porque um motor sob carga puxa mais corrente. Desconecte o adaptador e ela volta para cerca de zero.

※ Nota:

Se o valor ficar longe de zero com a carga DESLIGADA, o ESP32 foi iniciado enquanto havia corrente passando. Desligue a carga e pressione o botão EN (reset) do ESP32 para calibrar de novo.

Medindo Corrente AC com ESP32 e ACS712

Com AC, a corrente muda de direção 50 ou 60 vezes por segundo, então a tensão OUT oscila para cima e para baixo em torno da tensão zero. A média dessas amostras ficaria perto de zero e não nos diria nada. Em vez disso, medimos o valor RMS, que é o número que um multímetro mostra para AC:

  • Leia o sensor várias vezes durante 200ms. Isso cobre 10 ciclos a 50Hz ou 12 ciclos a 60Hz.
  • Para cada amostra, calcule a diferença em relação à tensão zero e eleve ao quadrado.
  • Corrente RMS = raiz quadrada da (média de todos os quadrados) / 0.066

A ligação continua a mesma. Só a carga muda, por exemplo uma lâmpada ou um ventilador ligado na rede elétrica.

※ Nota:

De novo: a rede elétrica AC é perigosa. Só meça uma carga da rede elétrica se você souber trabalhar com ela com segurança, mantenha o borne de parafuso e os fios cobertos, e nunca toque neles enquanto o circuito estiver ligado na tomada.

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-acs712-current-sensor */ // ESP32 measures AC current (RMS) with the ACS712 30A current sensor and prints it to the Serial Monitor // Wiring: ACS712 VCC -> ESP32 VIN (5V), ACS712 GND -> ESP32 GND // ACS712 OUT -> 10k resistor -> GPIO36 -> 20k resistor -> GND (voltage divider) // Keep the load OFF when the ESP32 starts, so the zero point can be measured. #define SENSOR_PIN 36 // ESP32 pin GPIO36 (ADC1) connected to the divider output #define DIVIDER_RATIO 1.5 // (10k + 20k) / 20k #define SENSITIVITY 0.066 // 30A version: 66mV (0.066V) per amp #define WINDOW_MS 200 // 200ms covers 10 cycles at 50Hz or 12 cycles at 60Hz float zeroVoltage = 2.5; // sensor output at 0A, measured again in setup() // read the sensor OUT voltage (in volts) one time float readSensorVoltage() { return analogReadMilliVolts(SENSOR_PIN) / 1000.0 * DIVIDER_RATIO; } void setup() { Serial.begin(9600); analogSetAttenuation(ADC_11db); // allow up to about 3.1V on the ADC pin // measure the real zero point while NO current flows Serial.println("Calibrating... keep the load OFF"); delay(1000); float sum = 0; for (int i = 0; i < 1000; i++) { sum += readSensorVoltage(); delayMicroseconds(100); } zeroVoltage = sum / 1000; Serial.print("Zero voltage: "); Serial.print(zeroVoltage, 3); Serial.println(" V"); } void loop() { double sumOfSquares = 0; long count = 0; // sample for the whole time window and add up the squared differences from zero unsigned long startTime = millis(); while (millis() - startTime < WINDOW_MS) { float diff = readSensorVoltage() - zeroVoltage; sumOfSquares += diff * diff; count++; } // RMS voltage around the zero point, then convert it to amps float rmsVoltage = sqrt(sumOfSquares / count); float rmsCurrent = rmsVoltage / SENSITIVITY; Serial.print("AC current (RMS): "); Serial.print(rmsCurrent, 2); Serial.println(" A"); delay(300); }

Passos Rápidos

  • Desligue a carga AC antes de alimentar o ESP32, para que o ponto zero fique correto.
  • Copie o código acima e abra com o Arduino IDE.
  • Clique no botão Upload no Arduino IDE para fazer o upload do código para o ESP32.
  • Ligue a carga AC e veja o resultado no Serial Monitor:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
Calibrating... keep the load OFF Zero voltage: 2.472 V AC current (RMS): 0.07 A AC current (RMS): 0.06 A AC current (RMS): 0.47 A AC current (RMS): 0.45 A AC current (RMS): 0.48 A AC current (RMS): 0.46 A
Ln 11, Col 1
ESP32 Dev Module on COM15
2

Sem carga, o ruído ainda dá um pequeno valor RMS de alguns centésimos de ampere, porque o RMS transforma cada pedacinho de ruído em um número positivo. Tenha isso em mente quando ler correntes AC pequenas.

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!