ESP8266 - Sensor de Corrente ACS712

Este tutorial ensina você a usar o ESP8266 para descobrir quantos amperes um dispositivo consome, com o sensor de corrente de efeito Hall ACS712 de 30A. O NodeMCU tem apenas um pino analógico, o A0, e ele não aceita diretamente o sinal de 5V do sensor, então também vamos adicionar dois resistores. Em detalhes, vamos aprender:

Sugerimos:

ESP8266 NodeMCU ACS712 current sensor

Sobre o Sensor de Corrente ACS712

O ACS712 informa ao ESP8266 quanta corrente flui por um fio. Dentro do chip, a corrente passa por um caminho grosso de cobre. Essa corrente cria um pequeno campo magnético, e um sensor Hall colocado ao lado do cobre transforma esse campo em uma tensão. O lado da carga e o lado do ESP8266 nunca se tocam eletricamente (o chip é isolado até 2.1 kV RMS), e o caminho de cobre tem apenas cerca de 1.2 mΩ, então colocar o sensor em um fio quase não altera o seu circuito. Ele funciona tanto para corrente DC quanto AC.

O módulo vem em três versões. Elas têm a mesma aparência, então leia o texto no chip. Este tutorial usa a versão de 30A.

Versão 5A Versão 20A Versão 30A
Marcação do chip ACS712ELCTR-05B ACS712ELCTR-20A ACS712ELCTR-30A
Faixa de corrente -5A a +5A -20A a +20A -30A a +30A
Sensibilidade 185 mV/A 100 mV/A 66 mV/A
ACS712 30A
Tensão de alimentação 5V (4.5V a 5.5V), não 3.3V
Saída a 0A cerca de metade da alimentação (cerca de 2.5V a 5V)
Saída a +30A / -30A cerca de 4.48V / cerca de 0.52V
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 saída é "ratiométrica". Isso significa que a saída se move junto com a tensão de alimentação real do módulo. Se o VCC for um pouco menor que 5V, o ponto zero também é um pouco menor que 2.5V. É por isso que o nosso código mede o ponto zero por conta própria, em vez de assumir 2.5V.

ACS712 current sensor pinout

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

  • Pino VCC: deve ser conectado a 5V. No NodeMCU, este é o pino VIN (algumas placas imprimem VU).
  • Pino GND: deve ser conectado ao GND (0V) do ESP8266.
  • Pino OUT: a saída analógica. Ele deve ir para o A0 através de um divisor de tensão, nunca diretamente.
  • Bornes de parafuso IP+ e IP-: devem ser colocados em série com a carga. Corte um fio de alimentação da carga e coloque o borne no vão. A corrente que flui de IP+ para IP- dá um valor positivo. Em alguns módulos, esses dois parafusos não têm rótulo.

O módulo também tem um LED vermelho de alimentação que acende quando o VCC está conectado.

※ Nota:

A ordem dos pinos do conector de 3 pinos não é a mesma em todos os módulos. Sempre leia os rótulos impressos na sua própria placa antes de ligar.

Como a Saída do ACS712 Vira Amperes

Sem corrente, o OUT fica na tensão zero (perto de 2.5V). A corrente em um sentido empurra o OUT para cima, e a corrente no outro sentido o puxa para baixo, em 66 mV para cada ampere. Então a fórmula é:

current_A = (Vout - Vzero) / 0.066

Por exemplo, se o Vzero é 2.40V e o Vout é 2.47V, a corrente é 0.07 / 0.066 ≈ 1.06A.

Por Que o ESP8266 Precisa de um Divisor de Tensão e de Média

O pino A0 da placa NodeMCU aceita de 0V a 3.3V e dá um valor de 10 bits de 0 a 1023. O pino OUT do ACS712 pode subir até cerca de 4.5V, o que é alto demais. Dois resistores resolvem isso: OUT → 10kΩ → A0 → 20kΩ → GND. O pino A0 então vê apenas 2/3 da tensão do OUT (4.5V viram 3.0V), e o código multiplica o valor de volta por 1.5.

Um passo do A0 é de cerca de 3.2 mV. Depois do divisor, são cerca de 4.8 mV no OUT, o que equivale a cerca de 73 mA. Então o sensor de 30A é uma ferramenta grosseira. Ele é bom para cargas de cerca de 0.5A ou mais, como motores, lâmpadas, fitas LED, aquecedores e carregadores, mas não para um único LED pequeno. Além disso, o ADC do ESP8266 é bastante ruidoso, e o rádio WiFi adiciona mais ruído. Uma variação de ±50 a ±100 mA em 0A é normal. É por isso que o código lê o A0 centenas de vezes e usa a média. No ESP8266, fazer a média não é opcional, é o principal truque que torna as leituras utilizáveis.

※ Nota:

A rede elétrica AC (110V/220V) é perigosa. Iniciantes devem praticar com uma carga DC de baixa tensão, como o dispositivo DC de 12V deste tutorial. O borne de parafuso e o lado de cobre do módulo carregam toda a tensão da carga. Nunca toque neles enquanto um circuito de rede elétrica estiver energizado.

Diagrama de Ligação

O ACS712 recebe 5V do pino VIN do NodeMCU, e seu pino OUT chega ao A0 através do divisor de 10kΩ/20kΩ. O dispositivo DC de 12V (como um motor DC, fita LED ou lâmpada), o adaptador de 12V e o borne de parafuso do ACS712 formam um laço separado.

The wiring diagram between ESP8266 NodeMCU and ACS712 current sensor

This image is created using Fritzing. Click to enlarge image

Para mais informações, veja Pinagem do ESP8266 e como alimentar o ESP8266 e outros componentes.

Módulo ACS712 ESP8266 NodeMCU
VCC VIN (5V)
GND GND
OUT resistor de 10kΩ até o A0, depois resistor de 20kΩ do A0 até o GND
Circuito da carga Conexão
Adaptador de 12V (+) DC power jack (+), depois IP+ do ACS712
IP- do ACS712 fio (+) do dispositivo DC
Fio (-) do dispositivo DC DC power jack (-), de volta ao adaptador (-)

※ Nota:

O VIN recebe seus 5V do cabo USB. Não conecte o adaptador de 12V ao VIN. A alimentação de 12V só alimenta o dispositivo DC através do borne de parafuso.

Como Programar o Sensor de Corrente ACS712

  • O primeiro passo é definir o pino A0 e os números necessários para a conversão:
#define SENSOR_PIN A0 #define REF_VOLTAGE 3.3 // NodeMCU A0 range: 0 to 3.3V #define ADC_RESOLUTION 1024.0 // 10-bit ADC #define DIVIDER_FACTOR 1.5 // 10k + 20k divider #define SENSITIVITY 0.066 // 66 mV per amp (30A version)
  • Leia o A0 muitas vezes, faça a média do resultado e converta-o para a tensão no pino OUT:
long sum = 0; for (int i = 0; i < samples; i++) { sum += analogRead(SENSOR_PIN); delayMicroseconds(200); } float pinVoltage = (float)sum / samples * REF_VOLTAGE / ADC_RESOLUTION; float sensorVoltage = pinVoltage * DIVIDER_FACTOR;
  • No setup(), enquanto a carga ainda está DESLIGADA, salve a tensão média como o ponto zero (1000 leituras).
  • No loop(), aplique a fórmula:
float current = (sensorVoltage - zeroVoltage) / SENSITIVITY;

Código ESP8266 para o ACS712 - Medir Corrente DC

O código abaixo encontra o ponto zero na inicialização e depois imprime a tensão OUT e a corrente a cada 500 ms. Cada valor impresso é a média de 300 leituras.

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-acs712-current-sensor */ /* * ESP8266 NodeMCU - measure DC current with the ACS712 30A current sensor * * Wiring: * ACS712 VCC -> VIN (5V from USB; some boards label it VU) * ACS712 GND -> GND * ACS712 OUT -> 10k resistor -> A0 -> 20k resistor -> GND (voltage divider) * Screw terminal IP+ / IP- -> in series with the load (e.g. a 12V DC motor) * * IMPORTANT: switch the load OFF while the ESP8266 starts, so the zero point * is measured with no current flowing. */ #define SENSOR_PIN A0 // The only analog pin of the ESP8266 NodeMCU #define REF_VOLTAGE 3.3 // NodeMCU A0 range: 0 to 3.3V #define ADC_RESOLUTION 1024.0 // 10-bit ADC: 0 to 1023 #define DIVIDER_FACTOR 1.5 // 10k + 20k divider: OUT voltage = A0 voltage x 1.5 #define SENSITIVITY 0.066 // ACS712 30A version: 66 mV per amp #define ZERO_SAMPLES 1000 // readings used to find the zero point #define AVG_SAMPLES 300 // readings averaged for each printed value float zeroVoltage = 0; // sensor output voltage when no current flows // Read A0 many times and return the average voltage at the ACS712 OUT pin float readSensorVoltage(int samples) { long sum = 0; for (int i = 0; i < samples; i++) { sum += analogRead(SENSOR_PIN); delayMicroseconds(200); } float adcAverage = (float)sum / samples; float pinVoltage = adcAverage * REF_VOLTAGE / ADC_RESOLUTION; // voltage on A0 return pinVoltage * DIVIDER_FACTOR; // voltage on OUT } void setup() { Serial.begin(9600); delay(500); Serial.println("Calibrating zero point, keep the load OFF..."); zeroVoltage = readSensorVoltage(ZERO_SAMPLES); Serial.print("Zero voltage: "); Serial.print(zeroVoltage, 3); Serial.println(" V"); } void loop() { float sensorVoltage = readSensorVoltage(AVG_SAMPLES); // current (A) = (output voltage - zero voltage) / sensitivity float current = (sensorVoltage - zeroVoltage) / SENSITIVITY; Serial.print("Sensor output: "); Serial.print(sensorVoltage, 3); Serial.print(" V | Current: "); Serial.print(current, 2); Serial.println(" A"); delay(500); }

Passos Rápidos

Para começar com o ESP8266 na Arduino IDE, siga estes passos:

  • Confira o tutorial como configurar o ambiente para o ESP8266 na Arduino IDE se esta é a sua primeira vez usando o ESP8266.
  • Ligue os componentes como mostrado no diagrama. Deixe o adaptador de 12V desconectado por enquanto.
  • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Escolha a placa ESP8266 correta, como (por exemplo, NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
  • Copie o código acima e abra-o com a Arduino IDE. Nenhuma biblioteca é necessária.
  • Clique no botão Upload na Arduino IDE para compilar e fazer o upload do código para o ESP8266.
  • Abra o Serial Monitor. Espere até que a tensão zero seja impressa. A carga deve estar DESLIGADA durante esse tempo.
  • Agora conecte o adaptador de 12V para que o dispositivo DC ligue e observe a corrente.
  • Se o dispositivo DC for um motor, segure o eixo dele de leve com os dedos. O motor trabalha mais forte e a corrente sobe.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
Calibrating zero point, keep the load OFF... Zero voltage: 2.364 V Sensor output: 2.367 V | Current: 0.05 A Sensor output: 2.361 V | Current: -0.05 A Sensor output: 2.366 V | Current: 0.03 A Sensor output: 2.421 V | Current: 0.86 A Sensor output: 2.418 V | Current: 0.82 A Sensor output: 2.424 V | Current: 0.91 A Sensor output: 2.446 V | Current: 1.24 A Sensor output: 2.451 V | Current: 1.32 A Sensor output: 2.420 V | Current: 0.85 A
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

Esta execução usa um motor DC de 12V como o dispositivo DC. As primeiras linhas mostram a carga DESLIGADA. Os valores pequenos em torno de 0.05A são ruído, não corrente real. As linhas do meio são o motor funcionando livremente. As linhas mais altas aparecem quando o eixo é segurado.

※ Nota:

Se a corrente for negativa enquanto o dispositivo DC funciona, a corrente flui de IP- para IP+. Troque os dois fios no borne de parafuso ou simplesmente ignore o sinal de menos.

Medindo Corrente AC

A corrente AC muda de sentido muitas vezes por segundo (50 ou 60 vezes, dependendo do seu país). Então o pino OUT oscila acima e abaixo do ponto zero, e uma média simples daria quase 0A. Em vez disso, medimos o valor RMS, que é o número que um multímetro mostra para AC.

O código amostra o A0 o mais rápido que pode durante uma janela de 200 ms. Isso cobre 10 ciclos completos a 50 Hz, ou 12 ciclos a 60 Hz. Para cada amostra, ele pega a diferença em relação à tensão zero e eleva ao quadrado. Depois:

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

※ Nota:

De novo: a rede elétrica AC pode matar. Se você não tem treinamento para trabalhar com a fiação da rede elétrica, não conecte o ACS712 a um circuito de rede elétrica. Nunca toque no borne de parafuso enquanto o circuito estiver energizado.

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-acs712-current-sensor */ /* * ESP8266 NodeMCU - measure AC current (RMS) with the ACS712 30A current sensor * * Wiring: same as the DC example * ACS712 VCC -> VIN (5V), GND -> GND * ACS712 OUT -> 10k resistor -> A0 -> 20k resistor -> GND * * WARNING: mains voltage (110V/220V) can kill. Only an experienced person * should wire the screw terminal into a mains circuit. Never touch it while live. * Keep the load OFF while the ESP8266 starts (zero calibration). */ #define SENSOR_PIN A0 #define REF_VOLTAGE 3.3 // NodeMCU A0 range: 0 to 3.3V #define ADC_RESOLUTION 1024.0 // 10-bit ADC #define DIVIDER_FACTOR 1.5 // 10k + 20k divider #define SENSITIVITY 0.066 // 66 mV per amp (30A version) #define WINDOW_MS 200 // 200 ms = 10 cycles at 50 Hz, 12 cycles at 60 Hz float zeroVoltage = 0; // Convert one ADC reading to the voltage at the ACS712 OUT pin float toSensorVoltage(float adcValue) { return adcValue * REF_VOLTAGE / ADC_RESOLUTION * DIVIDER_FACTOR; } void setup() { Serial.begin(9600); delay(500); // Find the zero point (no current flowing) long sum = 0; for (int i = 0; i < 1000; i++) { sum += analogRead(SENSOR_PIN); delayMicroseconds(200); } zeroVoltage = toSensorVoltage((float)sum / 1000); Serial.print("Zero voltage: "); Serial.print(zeroVoltage, 3); Serial.println(" V"); } void loop() { float sumOfSquares = 0; long count = 0; unsigned long startTime = millis(); // Sample the wave during the whole time window while (millis() - startTime < WINDOW_MS) { float diff = toSensorVoltage(analogRead(SENSOR_PIN)) - zeroVoltage; sumOfSquares += diff * diff; count++; } // RMS voltage -> 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(500); }

Faça o upload da mesma forma, com a carga DESLIGADA na inicialização. Depois ligue um dispositivo AC, por exemplo um pequeno aquecedor:

∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
Zero voltage: 2.358 V AC current (RMS): 0.08 A (1871 samples) AC current (RMS): 0.09 A (1866 samples) AC current (RMS): 3.62 A (1869 samples) AC current (RMS): 3.58 A (1870 samples) AC current (RMS): 3.65 A (1868 samples)
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

Sem carga, o valor RMS não é exatamente 0A. Isso é o ruído do ADC de novo. Valores abaixo de cerca de 0.1A devem ser tratados como 0A.

Vídeo

Conhecimento Adicional

Algumas coisas afetam a precisão da montagem ESP8266 + ACS712:

  • O VIN não é exatamente 5V. Quando o NodeMCU funciona pelo USB, o VIN costuma ler um pouco menos (por exemplo, em torno de 4.7V), por causa de um diodo de proteção na placa. A calibração do zero corrige o deslocamento. A sensibilidade também cai um pouco, para cerca de 0.066 × (VIN / 5). Se você medir o VIN com um multímetro, pode colocar esse valor em SENSITIVITY.
  • A placa NodeMCU tem seu próprio divisor de resistores no A0 (é assim que o A0 aceita 3.3V). Ele carrega um pouco o nosso resistor de 20kΩ, então as leituras podem ficar cerca de 2% baixas. Se você comparar com um multímetro, pode aumentar o DIVIDER_FACTOR um pouco, por exemplo para 1.53.
  • Para correntes pequenas (abaixo de 5A), uma versão de 5A do ACS712 dá cerca de 3 vezes mais sinal por ampere.

Vamos comparar o ACS712 com o sensor de tensão usado no tutorial ESP8266 - Medir Tensão.

ACS712 30A Sensor de Tensão
O que mede corrente (A) tensão (V)
Como é conectado em série com a carga em paralelo com a fonte
AC ou DC ambos somente DC
Isolado do ESP8266 sim (efeito Hall) não (divisor de resistores)
Alimentação necessária 5V nenhuma

É evidente que os dois módulos funcionam como um par: o sensor de tensão informa a tensão, o ACS712 informa a corrente e, multiplicando os dois, você pode calcular a potência de uma carga DC em watts.

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