Como medir corrente com Arduino?

Como medir corrente com Arduino?

Agora você pode medir correntes de -30A à +30A utilizando o seu Arduino ou outro microcontrolador de sua preferência. Com o módulo Sensor de Corrente ACS714 da Pololu você tem um dispositivo alimentado por 5v e que permite medir essa faixa de corrente com uma margem de erro de apenas ±1,5%.

Sensor de Corrente ACS714

Esse sensor utiliza um CI Allegro ACS714 com sensor de efeito hall (datasheet) para medição da corrente, o que garante um perfeito isolamento do circuito. Nesse post vamos trabalhar com baixa tensão e corrente, mas o ACS714 suporte tensões de até 2.1 kV RMS. Confira o tutorial abaixo!

Medindo corrente e tensão

Antes de mostrarmos de mostrar como medir corrente com Arduino, vamos ver de uma maneira resumida a diferença de procedimento entre medir tensão e medir corrente, já que uma ligação incorreta pode danificar o circuito ou até mesmo o aparelho medidor.

Para medir tensão, veja este exemplo usando um multiteste (multímetro), um circuito com uma lâmpada e uma bateria. Devemos colocar o multiteste na escala de tensão (V), e medir dessa maneira, com as pontas de prova em paralelo ao circuito:

Medição Tensão

Já para a medição da corrente, que é o assunto desse post, devemos ligar um multiteste em série com o circuito, na escala de Ampéres:

Medição Corrente

Ligação do Sensor de Corrente com Arduino

Vamos testar o sensor utilizando um motor DC de 5v, ligado em SÉRIE com o Sensor de Corrente ACS714. O sensor irá enviar os dados ao Arduino por meio do pino analógico A3. A alimentação do sensor é feita pelo próprio Arduino (5v), e para a alimentação do motor utilizamos pilhas comuns. Assim, podemos mostrar o isolamento do circuito do motor em relação ao Arduino e o restante dos componentes:

Circuito Sensor de corrente ACS714

No display LCD 20×4, teremos as informações do valor “puro” lido do sensor (entre 0 e 1024) e o valor da amperagem calculada pelo programa abaixo. A cada ampere de variação na entrada do sensor, a tensão de saída varia 66mV. A atualização é feita a cada 1 segundo.

//Programa : Teste sensor ACS714 corrente com Arduino
//Alteracoes e adaptacoes : FILIPEFLOP

//Carrega a biblioteca do LCD
#include <LiquidCrystal.h>

//Inicializa o LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Define o pino analogico usado pelo ACS714
int AnalogInputPin = 3;


void setup()
{  
  //Define o LCD com 20 colunas e 4 linhas
  lcd.begin(20, 4);
  //Informacoes iniciais no display
  lcd.setCursor(1,0);
  lcd.print("--- FILIPEFLOP ---");
  lcd.setCursor(0,1);
  lcd.print("Sensor : ");
  lcd.setCursor(0,2);
  lcd.print("Amp :");

  Serial.begin(9600);
}

void loop()
{
  //Chama rotina que calcula a corrente
  double Current = currentSensor(analogRead(AnalogInputPin));  
  //Imprime as informacoes no display e na serial
  Serial.print(" Amp : "); 
  printDouble(Current, 2);                                     
  Serial.print(" A");
  Serial.println("");
  lcd.setCursor(11,2);
  lcd.print("A");
  delay(1000);
}

void printDouble(double val, byte precision) 
{
  Serial.print (int(val));
  if( precision > 0) 
  {    
    Serial.print(".");
    lcd.setCursor(7,2);
    lcd.print(".");
    unsigned long frac, mult = 1;
    byte padding = precision -1;
    while(precision--) mult *=10;
    if(val >= 0) frac=(val-int(val))*mult;
     else frac=(int(val)-val)*mult;
    unsigned long frac1 = frac;
    while(frac1 /= 10) padding--;
    while(padding--) Serial.print("0");
    lcd.setCursor(6,2);
    lcd.print("0");
    Serial.print(frac,DEC) ;
    lcd.setCursor(8,2);
    lcd.print(frac, DEC);
  }
}

long readInternalVcc() 
{
  long result;
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2);                          // Wait for Vref to settle
  ADCSRA |= _BV(ADSC);               // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result;       // Back-calculate AVcc in mV
  return result;
}


// Calculate current with Allegro ACS714
double currentSensor(int RawADC) 
{
  int    Sensitivity    = 66; // mV/A
  long   InternalVcc    = readInternalVcc();
  double ZeroCurrentVcc = InternalVcc / 2;
  double SensedVoltage  = (RawADC * InternalVcc) / 1024;
  double Difference     = SensedVoltage - ZeroCurrentVcc;
  double SensedCurrent  = Difference / Sensitivity;
  Serial.print("Sen: ");
  Serial.print(RawADC);
  Serial.print("/1024");
  lcd.setCursor(9,1);
  lcd.print(RawADC);
  return SensedCurrent;            
}

Para utilização do programa sem precisar de um LCD, os resultados são impressos também na serial, e você pode checar os valores no serial monitor:

Sensor de corrente - Serial Monitor

Gostou? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo). Já conhece a loja virtual FILIPEFLOP? Não? Então confira um pouco sobre nossa confiável trajetória de vendas e Quem Somos.

5
Como medir corrente com Arduino?
87 votos, 4.79 classificação média (95% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

39 Comentários

  1. Thalik - 8 de maio de 2017

    Qual simulador foi usado ?

  2. Victor - 3 de maio de 2017

    gostaria de saber como faria a programação com corrente alternada

  3. Miguel Gaspar - 28 de abril de 2017

    Boa tarde, a não estou a conseguir mostrar a programação no meu display OSEPP LCD and keypad shield, consigo fazer a simulação através de arduino e está tudo correto.
    Que alternativa de programação posso utilizar?

  4. Victor - 29 de março de 2017

    Qual tensão máxima que o sensor suporta?

  5. Victor - 29 de março de 2017

    Qual a tensão máxima que o sensor suporta?

  6. pedro - 8 de dezembro de 2016

    boa noite , pode me ajudar a visualizar a corrente medida com este codigo num lcd 16*2 ?

  7. Wiliam Amaral Dias - 28 de julho de 2016

    Boa Noite !

    Sou iniciante no assunto.

    Gostaria de saber como faço para incrementar os valores lidos em amperes em uma variável para poder tirar a média da produção de corrente continua por um painel solar. isso a cada 30 min.
    e como transformo os dados lidos em Amperes? uso um sensor de corrente ACS712 30A. O painel solar é de 5V.
    Não sei se deu pra entender direito, mas se puder de alguma forma me ajudar..
    Desde já agradeço !!

  8. Leonardo - 7 de março de 2016

    Uma dúvida: se o sensor queimar por causa de passagem de corrente maior que 30A ou por qualquer outro motivo, ele continua passando corrente entre o IP+ e IP- ou ele vira um contato aberto?
    Att Leonardo”

  9. jefferson borges - 26 de dezembro de 2015

    boa tarde , esse codigo serveria tb se eu estivesse usando em corrente alternada ?

  10. João Pedro - 22 de dezembro de 2015

    bom dia, estou com um projeto para controlar 2 motores DC mas quando chega no final do curso programado eu precisaria saber da corrente. Então eu não sei se uso essa placa ou o shild do 298N, pois n sei qual mede a corrente e me dá o valor da corrente. Obs: tenho q usar arduino.
    se alguém puder me ajuda ficarei imensamente grato.

  11. Gonçalves - 16 de novembro de 2015

    olá,
    Conseguir fazer a leitura da corrento, com uma ótima precisão, mas preciso de ajuda em um detalhe.
    quando o Vout do sensor não estar conectado na porta A1 do Arduíno, no display aparece uns valores flutuantes., quero saber se tem como fazer com quer exiba no display o valor 0 ( zero) no momento em que o Vout do sensor acs712-5a esteja desconectado?

  12. michel ferrari - 11 de setembro de 2015

    Olá Amigos !!! Não consigo fazer essa livraria funcionar. Fui no link cliquei em download zip e extrai para a pasta libraries do arduino, porém a livraria não é reconhecida. O que estou fazendo de errado ? Abraços !!!

  13. Vitoriano Netto - 25 de agosto de 2015

    Boa noite gostaria de saber se esse sensor consegue realizar leituras em milésimos de segundos e manter a precisão da leitura

    Grato

  14. Felipe Plech - 29 de julho de 2015

    Esse sensor mede corrente apenas em RMS?

  15. Giovan - 14 de julho de 2015

    Show de bola teus projetos. Esse Sensor de Corrente ACS714 pode ser usado também para medir tensão? Senão, qual posso usar?

  16. Bruno - 23 de junho de 2015

    Bom dia. Eu preciso medir a corrente de um aparelho “Y” para automaticamente acionar um aparelho “X”. Por Exemplo: O aparelho “X” será ligado a tomada, o aparelho “Y” será ligado no aparelho”X”, então o aparelho “X” ficará em “stand by” aguardando o aparelho “Y” ser acionado para então entrar em funcionamento e trabalhar em conjunto com o aparelho “X”. Estava pensando em desenvolver algum circuito para fazer isso eletronicamente, utilizando algum microcontrolador 8051 ou PIC. Alguém pode me ajudar?

  17. Felipe - 16 de junho de 2015

    Bom dia, estou precisando saber como utilizar o sensor não invasivo de 100A , mas não não consigo encontrar a relação de transformação. Você poderia me ajudar?

  18. Odenir Alves - 8 de junho de 2015

    Preciso fazer monitoramento remoto de grupo gerador, preciso de sensor que mede tensão e outro que mede corrente ambos alternados, tensão 220v e 115A.
    Qual sensor posso utilizar

  19. Lucas Fritoli - 22 de maio de 2015

    Boa tarde meu caro!

    Bem bacana o projeto. Usarei o ACS712.
    Não usarei um display, mas usarei o valor da corrente para outras contas.

    Preciso ler 06 desses simultâneos e cada uma das 06 correntes usar em contas distintas.

    Pode me dar uma dica, por favor, de como replicar isso para as 06 unidades?
    long readInternalVcc()
    {
    long result;
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
    delay(2); // Wait for Vref to settle
    ADCSRA |= _BV(ADSC); // Convert
    while (bit_is_set(ADCSRA,ADSC));
    result = ADCL;
    result |= ADCH<<8;
    result = 1126400L / result; // Back-calculate AVcc in mV
    return result;
    }

    // Calculate current with Allegro ACS714
    double currentSensor(int RawADC)
    {
    int Sensitivity = 66; // mV/A
    long InternalVcc = readInternalVcc();
    double ZeroCurrentVcc = InternalVcc / 2;
    double SensedVoltage = (RawADC * InternalVcc) / 1024;
    double Difference = SensedVoltage – ZeroCurrentVcc;
    double SensedCurrent = Difference / Sensitivity;
    Serial.print("Sen: ");
    Serial.print(RawADC);
    Serial.print("/1024");
    lcd.setCursor(9,1);
    lcd.print(RawADC);
    return SensedCurrent;
    }

    Muito obrigado.

    Abs,
    Lucas

  20. Lincoln - 12 de maio de 2015

    boa tarde caro, estou projetando um circuito que mede corrente contínua no modo não invasivo, e o meu interesse maior seria nas variação de corrente que ocorre a partir do quarto dígito, por exemplo numa leitura de corrente de 2,0034566 A, me interessa o valor 34566, pergunto eu… seria possível configurar esse tipo de leitura? e para a medição qual sensor você recomendaria? pelo que pesquisei só encontrei este sensor “Sensor de Corrente Não Invasivo 20A SCT-013″ e se não me engano é somente da AC.
    Grato
    Lincoln

    • FILIPEFLOP - 22 de maio de 2015

      Boa noite Lincoln,

      Sim, você pode alterar a programação para trabalhar apenas com os dígitos que você precisa. No momento temos apenas o sensor de 20A.

      Grato.

      Adilson – Equipe FILIPEFLOP

    • Guilherme Sousa - 5 de novembro de 2015

      Sim é possivel. Tudo permaneçe o mesmo (na leitura da corrente) porém se você quer, de acordo com exemplo que vc passou, os valores apartir de (10^-2) de 2,0034566, por exemplo, vc poderia multiplicar o valor medido por 10^7 e, apartir desse resultado, usar a operação de resto ‘%’, ou seja: (2,0034566 * 10000000) % 100000). É isso!

  21. Claudio - 20 de março de 2015

    Bacana o projeto. Precisava fazer algo semelhante para medir correntes até 400A, qual sensor utilizo?
    O circuito seria semelhante?

    • FILIPEFLOP - 31 de março de 2015

      Boa noite Claudio,

      Depende do sensor que você vai utilizar. Esse do post gera na saída uma variação de tensão de acordo com a corrente medida, e outros sensores geram uma variação de corrente. Nesse caso haveria alteração no circuito.

      Abraço.

      Adilson – Equipe FILIPEFLOP

      • José Luiz Espindola - 4 de maio de 2015

        Olá parabéns pelo excelente trabalho.
        Estou interessado no sensor de corrente não invasivo da loja, seria muito complicado conseguir que o armazenamento dos valores de corrente sejam “guardados” num Sd card, vinculados a hora real para posterior leitura e analise?

    • Emerson - 15 de maio de 2015

      use primeiro um trasformador de corrente para instrumento tipo 1/20 depois use o sensor da materia.

  22. yvens - 3 de março de 2015

    Eu gostaria de um sensor capaz de medir com boa precisão corrente da ordem de mA, alguma indicação?

  23. Jairo - 13 de fevereiro de 2015

    Boa tarde Felipe,

    Este sensor mede corrente alternada (AC) também? Qual tensão máxima?

    Att;

  24. Luciano - 27 de janeiro de 2015

    Olá
    Como posso fazer para medir a corrente de um chuveiro.
    Obrigado

    • FILIPEFLOP - 3 de fevereiro de 2015

      Boa noite Luciano,

      Lançaremos em breve um post sobre o sensor de corrente 20A para Arduino, talvez te ajude. Acompanhe as nossas publicações, por favor.

      Grato.

      Adilson – Equipe FILIPEFLOP

  25. LUIZ BENEDITO CYPRIANO - 28 de outubro de 2014

    BOM DIA SÓ MEDE CORRENTE CONTINUA

Deixe uma resposta