Medindo corrente e tensão com o módulo INA219 26

Durante o desenvolvimento de algum dos seus projetos você já deve ter tido a necessidade de medir a tensão ou a corrente consumida pelo seu projeto ou parte dele. Normalmente utilizamos um multímetro e medimos uma grandeza por vez (algo não muito prático). Neste artigo veremos como montar um simples e prático medidor de tensão e corrente DC utilizando como componente principal o current monitor módulo INA219 da Texas Instruments.

Medidor de corrente e tensão com INA219

Para apresentar as leituras utilizaremos um Display de LCD 16×2 com um adaptador i2c, o que irá minimizar bastante a quantidade de pinos necessários, se comparado a tradicional utilização com interface paralela, seja de 4 bits ou 8 bits.

PRINCIPAIS MATERIAIS UTILIZADOS

O SENSOR DE CORRENTE DC MODULO INA219

O INA219 é um componente extremamente versátil para o monitoramento de grandezas elétricas DC. Permite o monitoramento de linhas com alimentação de 0 a 26 Vdc, corrente com limite máximo dependente do resistor shunt utilizado, conversor ADC interno de 12 bit e interface i2c para comunicação. O método de medição de corrente utilizado é o high-side, onde o resistor shunt é colocado entre a fonte de alimentação e a carga. Este método permite que o dispositivo meça tanto a corrente circulante, como a tensão na carga. O datasheet do componente pode ser encontrado neste LINK.

Medição de corrente com Current Monitor
Medição em High-Side e Low-Side

Como mencionado anteriormente, a medição da corrente é realizada através de um resistor shunt, ou seja, nossa boa e velha Lei de Ohm. Lembre-se que quando uma corrente elétrica atravessa um resistor surge em seus terminais uma diferença de potencial, ou seja, surge uma tensão que é proporcional a corrente circulando através do resistor.

 U = R x I

Ao medirmos a tensão sobre um resistor qualquer, de posse da resistência do mesmo podemos substituir os valores na equação e com isso obter a corrente elétrica.

A placa Sensor de Corrente DC INA219 I2C facilita muito os projetos envolvendo este componente pois já engloba o circuito integrado, os componentes passivos necessários para seu funcionamento, um resistor shunt de 0.100R (100 miliOhm) que permite medição de correntes máximas de +- 3,2 A (tensão máxima de +-320 mV no resistor shunt) e também terminais para conexão com o microcontrolador e com a fonte que irá alimentar a carga a ser monitorada. A placa possui também dois conjuntos de pads/jumpers que permitem modificar o endereço i2c do dispositivo, ou seja, podemos utilizar até 4 dispositivos ao mesmo tempo em uma mesma linha i2c.

Placa com o INA219
Placa INA219 DC Current Sensor

A alimentação do módulo INA219 é realizada através dos terminais Vcc e Gnd, podendo variar de 3 V a 5,5 Vdc, ou seja, dentro dos limites da maiorias das placas disponíveis atualmente, incluindo a placa Nano V3.0 utilizada neste projeto.

Os pinos Sda e Scl são referentes a comunicação i2c, e devem ser conectados respectivamente aos pinos A4 e A5 da placa Nano. Os pinos Vin+ e Vin- presentes tanto na barra de pinos, como no conector parafusável, são utilizados para monitorar a carga. A fonte que alimenta a carga (com tensões de 0 a 26 V) entra no terminal Vin+, atravessa o resistor shunt e sai pelo terminal Vin-, indo para a carga a ser monitorada. Aqui fica uma dica, para cargas que consumam pouca corrente você pode utilizar os terminais na barra de pinos inferior, na dúvida, utilize o terminal parafusável superior.

Uma consideração importante, o Gnd do nosso circuito de medição deverá estar conectado ao Gnd da nossa carga, por exemplo, se você estiver monitorando o consumo de um motor conectado a uma bateria de 9V, o terminal “” da bateria deverá ser conectado ao Gnd geral. Isto garante que os circuitos operem sob mesmo referencial, ao mesmo tempo que assegura que a tensão será medida corretamente.

DISPLAY DE LCD 16X2 E ADAPTADOR I2C

Iremos utilizar um tradicional display LCD 16×2 para apresentar as medições. nativamente este display utiliza uma interface paralela, necessitando de pelo menos 6 pinos na versão 4 bits, conforme pode ser visto neste artigo do blog,  ou até 11 pinos na versão 8 bits.

LCD 16x2

Para minimizar a quantidade de pinos necessários iremos utilizar um Módulo Serial I2C para Display LCD. Este módulo permite comunicar com o LCD através da interface serial I2C, utilizando apenas 2 terminais (SDA e SCL). O módulo pode ser soldado diretamente ao display de LCD ou então pode-se cortar e soldar uma barra de pinos fêmea. permitindo que você altere a interface de acordo com suas necessidades.

Adaptador i2c para LCD

CIRCUITO MODULO INA219 COM ARDUINO

Para montagem básica precisaremos de uma protoboard, uma fonte para alimentar nosso circuito e alguns jumpers. Indico utilizarem jumpers rígidos pois além da estética melhor, eles acabam evitando problemas de mau contato.

Iremos alimentar as linhas superior e inferior do protoboard com 5 V. Essa alimentação será útil para alimentar a placa Nano, o módulo INA219 e também nosso LCD via adaptador i2c.

Os pinos SDA e SCL, tanto da placa INA219 como do adaptador i2c deverão ser conectados respectivamente os pinos A4 e A5, que neste projetos serão utilizados para comunicação i2c.

O circuito a seguir apresenta as conexões básicas necessárias.

Circuito Arduino e Módulo INA219

Veja que é um circuito bastante simples, restando apenas conectar a fonte que irá alimentar a carga ao conector Vin+, conectar Vin- a carga e lembrar de interconectar o Gnd dos circuitos.

BIBLIOTECAS NECESSÁRIAS

Para realização deste projeto será necessário adicionar duas novas bibliotecas, a Adafruit_INA219 e a LiquidCrystal_I2C. Aconselho utilizar o utilitário de gerenciamento de bibliotecas para facilitar o processo. Clique em Sketch >> incluir Biblioteca >> Gerenciar Bibliotecas…. No campo de busca insira o nome das bibliotecas Adafruit INA219 e LiquidCrystal I2C. Na lista que aparecer, selecione a biblioteca indicada e então clique em “Instalar”.

Instalando as bibliotecas

CÓDIGO FONTE

As bibliotecas utilizadas para o INA219 e para o LCD via i2c possuem exemplos de sua utilização que serviram como base para este projeto.

A seguir é apresentado o código que une as funcionalidade do nosso sensor de corrente e tensão e do nosso LCD via serial I2C.

/*
 * DC Current and Voltage Meter - Basic Code
 * - Use one INA219, an i2c current monitor from TI
 * with 12 bit ADC, capable to monitor Voltage and
 * Current
 * 
 * -------------------------------------------------
 * Medidor corrente e tensão DC - Código Básico
 * - Utiliza um modulo INA219, um monitor de corrente i2c
 * com um ADC de 12 bit, capaz de monitorar Tensão
 * e Corrente
 * 
 * developed by: Haroldo Amaral
 * 2017/03/26 - v 1.0
 */

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>      // lcd i2c lib
#include <Adafruit_INA219.h>        // ina219 lib

// Define some constants used in code
const int LED1 =  2;        // the number of the LED pin
const int LED2 =  3;        // the number of the LED pin
const int ON = 1;           // on state
const int OFF = 0;          // off state
const int LCD_addr = 0x3F;  // LCD i2c address
const int LCD_chars = 16;   // number of characters
const int LCD_lines = 2;    // number of lines
const int INA_addr = 0x40;  // INA219 address


// set the LCD address to 0x3F for a 16 chars and 2 line display
// indica o endereço do LCD  - 0x3F, com 16 caracteres e 2 linhas
LiquidCrystal_I2C lcd(LCD_addr, LCD_chars, LCD_lines);

// set the INA219 to address 0x40
// indica o endereço do INA219 - 0x40
Adafruit_INA219 ina219(INA_addr);

// global variables
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;

// Prototype of functions
void Read_INA219_Values(void);
void LCD_Update(void);
void Serial_Send(void);

void setup()
{
  // configure LED pins
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);

  // configure the serial to 9600bps
  Serial.begin(9600);

  Serial.println("Hello!");
  Serial.println("Measuring voltage and current with INA219 ...");
  
  // initialize the INA219
  ina219.begin();

  // initialize the lcd 
  lcd.init();
  lcd.clear();

  // Print a message to the LCD.
  lcd.backlight();

  // set the cursor and write some text
  lcd.setCursor(0,0);
  lcd.print("Tensao Corrente"); 
}

/*
 * MAIN LOOP
 * - change the led state, measure the values and update LCD
 */
void loop()
{
  // read values from INA219
  // lê os valores do INA219
  Read_INA219_Values();

  // update the LCD
  // atualiza o LCD
  LCD_Update();

  // send data over the serial
  // envia os dados pela serial
  Serial_Send();

  // change the value to increase/decrease the update rate
  // mude o valor para alterar a taxa de atualização
  delay(250);
}

/*
 * Functions
 */

// Read the values from INA219
// lê os valores convertidos pelo modulo INA219
void Read_INA219_Values(void)
{
  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  loadvoltage = busvoltage + (shuntvoltage / 1000);
}

// update the LCD with values
// atualiza o LCD com os valores
void LCD_Update(void)
{
  lcd.setCursor(0,1);
  lcd.print(busvoltage);  lcd.print("V   ");

  lcd.setCursor(7,1);
  lcd.print(current_mA); lcd.print("mA   ");
}

// Send data over the serial
// envia os valores pela serial
void Serial_Send(void)
{
  Serial.print("Bus Voltage:   "); Serial.print(busvoltage); Serial.println(" V");
  Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
  Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
  Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");
  Serial.println("");
}

Com o exemplo rodando serão apresentadas no LCD a tensão e corrente da carga. Neste exemplo utilizei 1 LED vermelho como carga teste.

UM SEGUNDO TESTE COM O MODULO INA219

Para fixarmos os conceitos irei demonstrar um exemplo medindo a tensão e a corrente consumida por todo o circuito de medição e mais dois LED’s controlados pela própria sketch.

Como queremos medir o consumo da placa Nano, do Display LCD e de mais dois LED’s, serão necessárias alguma modificações pontuais no circuito. A principal delas é que a alimentação de 5V fornecida pela fonte ajustável, será conectada apenas as linhas de alimentação superiores, na parte interior iremos deixar o jumper da fonte na posição “off”. A alimentação de 5V será aplicada ao pino Vin+ e o pino Vin- será conectado a linha de alimentação inferior, permitindo alimentar a placa Nano e também o Display de LCD.

O circuito de teste é apresentado a seguir.

Circuito de teste com leds

CÓDIGO FONTE

Neste teste o código irá controlar o backlight e os dois leds para demonstrar a medição de tensão e corrente. Inicialmente é mostrada a medição com backlight aceso e com os leds apagados, após um delay o backlight é apagado, o backlight é novamente aceso e um dos LEDs também, o segundo LED é aceso. Entre cada etapa ocorre a leitura dos valores medidos pelo INA219, atualização do display e geração de um delay de 2 segundos.

O código é apresentado a seguir.

/*
 * DC Current and Voltage Meter - LED test
 * - Use one INA219, an i2c current monitor from TI
 * with 12 bit ADC, capable to monitor Voltage and
 * Current
 * - In the test, the LEDs and the backlight are 
 * switched to verify the current consumption
 * 
 * -------------------------------------------------
 * Medidor corrente e tensão DC - LED test
 * - Utiliza um modulo INA219, um monitor de corrente i2c
 * com um ADC de 12 bit, capaz de monitorar Tensão
 * e Corrente
 * - No teste, os led e o backlight são chaveados
 * para verificar a corrente consumida
 * 
 * developed by: Haroldo Amaral
 * 2017/03/26 - v 1.0
 */

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>      // lcd i2c lib
#include <Adafruit_INA219.h>        // ina219 lib

// Define some constants used in code
const int LED1 =  2;        // the number of the LED pin
const int LED2 =  3;        // the number of the LED pin
const int ON = 1;           // on state
const int OFF = 0;          // off state
const int LCD_addr = 0x3F;  // LCD i2c address
const int LCD_chars = 16;   // number of characters
const int LCD_lines = 2;    // number of lines
const int INA_addr = 0x40;  // INA219 address


// set the LCD address to 0x3F for a 16 chars and 2 line display
// indica o endereço do LCD  - 0x3F, com 16 caracteres e 2 linhas
LiquidCrystal_I2C lcd(LCD_addr, LCD_chars, LCD_lines);

// set the INA219 to address 0x40
// indica o endereço do modulo INA219 - 0x40
Adafruit_INA219 ina219(INA_addr);

// global variables
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;

// Prototype of functions
void Read_INA219_Values(void);
void LCD_Update(void);
void Serial_Send(void);

void setup()
{
  // configure LED pins
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);

  // configure the serial to 9600bps
  Serial.begin(9600);

  Serial.println("Hello!");
  Serial.println("Measuring voltage and current with INA219 ...");
  
  // initialize the INA219
  ina219.begin();

  // initialize the lcd 
  lcd.init();
  lcd.clear();

  // Print a message to the LCD.
  lcd.backlight();

  // set the cursor and write some text
  lcd.setCursor(0,0);
  lcd.print("Tensao Corrente"); 
}

/*
 * MAIN LOOP
 * - change the led state, measure the values and update LCD
 */
void loop()
{
  // test 1 - backlight on, leds off
  // teste 1 - backlight aceso, leds apagados
  digitalWrite(LED1, OFF);
  digitalWrite(LED2, OFF);
  Read_INA219_Values();
  LCD_Update();
  Serial_Send();
  delay(2000);

  // test 2 - backlight off, leds off
  // teste 2 - backlight apagado, leds apagados
  lcd.noBacklight();
  Read_INA219_Values();
  LCD_Update();
  Serial_Send();
  delay(2000);

  // test 3 - backlight on, led 1 ON
  // teste 3 - backlight aceso, led 1 aceso
  lcd.backlight();
  digitalWrite(LED1, ON);
  Read_INA219_Values();
  LCD_Update();
  Serial_Send();
  delay(2000);

  // test 4 - backlight on, led 1 and 2 ON
  // teste 4 - backlight aceso, led 1 e 2 aceso
  digitalWrite(LED2, ON);
  Read_INA219_Values();
  LCD_Update();
  Serial_Send();
  delay(2000);
}

/*
 * Functions
 */

// Read the values from INA219
// lê os valores convertidos pelo modulo INA219
void Read_INA219_Values(void)
{
  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  loadvoltage = busvoltage + (shuntvoltage / 1000);
}

// update the LCD with values
// atualiza o LCD com os valores
void LCD_Update(void)
{
  lcd.setCursor(0,1);
  lcd.print(busvoltage);  lcd.print("V   ");

  lcd.setCursor(7,1);
  lcd.print(current_mA); lcd.print("mA   ");
}

// Send data over the serial
// envia os valores pela serial
void Serial_Send(void)
{
  Serial.print("Bus Voltage:   "); Serial.print(busvoltage); Serial.println(" V");
  Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
  Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
  Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");
  Serial.println("");
}

O resultado deste teste você confere na imagem do início do post, e os arquivos deste projeto (sketches e esquemático do Fritzing) podem ser baixados no meu repositório GitHub.

Gostou do Medidor de tensão e corrente DC com módulo INA219? Deixe seu comentário logo abaixo. Em caso de dúvidas, caso queira trocar uma ideia, ou até mesmo dividir seu projeto, acesse nosso Fórum!

Posts Relacionados

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

26 Comentários

  1. Tem algum módulo que meça tensão e corrente AC?

    1. Infelizmente para medição de corrente e tensão AC não existe nenhum módulo pronto, apenas CI’s dedicados a metrologia, mas que dependem de toda uma circuitaria externa.

      Para medição de correntes AC/DC você pode utilizar o “Sensor de Corrente ACS712 -30A a +30A” (https://www.filipeflop.com/pd-304251-sensor-de-corrente-acs712-30a-a-30a.html?ct=&p=1&s=1) disponível na loja. Sua saída é em formado analógico, ai será necessário apenas utilizar o ADC do uC e depois processar o sinal.

      Para medir a tensão AC de uma maneira segura você pode utilizar uma transformador abaixador e condicionar sua saída. após isso também será necessário converter o sinal e processá-lo.

  2. Achei interessante esse modulo INA219. e o artigo está show, bem explicado.

    1. Fico feliz que tenham gostado André, obrigado pelo feedback!

  3. Parabéns pelo trabalho apresentado, bem didático e possibilitando aplicar em outros sensores semelhantes.

    1. Muito obrigado Carlos. A ideia é essa, permitir adaptação para outros usos e até sensores.

  4. Genial, me serviu 100% . OBRIGADO

    1. Que bom que funcionou 100% João.

  5. Posso ligar um sinal de 4-20mA direto nele ? Ex: ligar um sensor de nível com saída analógica

    1. Bruno, este módulo (INA219) não é adequado para este tipo de medição de sensores/trandutores com saída de 4 a 20mA.

  6. Para converter sinal de 4 – 20mA em 0 -10V coloque o mresistor de 250 Ohms em serie e meça a tensao com modulos o Arduino por ex. 5V coloque 2 resistores em paralelo.

  7. Pessoal boa tarde.
    Montei esse projetinho para monitorar outros aduinos e seus respectivos consumos.
    Desculpe minha falta de conhecimento, mas poderiam me explicar exatamente qual a diferença entre BUSVOLTAGE e SHUNT VOLTAGE?
    Técnicamente eu entendi que um é o que está no “barramento” e outro é oq efetivamente está entrando na carga certo?
    Se isso estiver correto, para uma aplicação real isso significa que se por exemplo se eu tenho uma fonte de 5v e meu BUSVoltage está mostrando 1v e meu ShuntVoltage está mostrando 4.5v qual valor devo considerar?
    E no caso se for uma fonte variável eu devo aumentar a tensão até que meu ShuntVoltage mostre precisos 5v ?

    Poderiam me dar uma explicação mais direcionada a iniciante…rs?
    Abss

    1. Boa tarde Raphael.

      – BusVoltage é a tensão de alimentação após o resistor shunt, ou seja, a tensão que vai para a carga/circuito, no seu caso o arduino e outros periféricos.
      – ShuntVoltage é a tensão sobre o resistor que mede a corrente. Sempre a tensão no resistor shunt será baixa, principalmente se comparada com a alimentação do circuito.
      De uma olhada no datasheet do INA219, na figura 13, talvez ajude a entender.
      http://www.ti.com/lit/ds/symlink/ina219.pdf

      Se no seu caso estiver mostrando algo estranho, existem duas possibilidades:
      – a ligação do sensor está invertida
      – a fonte que alimenta o circuito não está com o GND conectado ao Arduino, isso gera erros de medição

  8. Muito interessante e bem detalhado, parabéns ! Pergunto se seria possível com um sensor destes, medir condutividade em diferentes águas, como água do mar, estuários, para se aferir a salinidade ?

    1. Que bom que curtiu o artigo Luis.
      Talvez com várias adaptações no circuito e código seja possível, mas não é o foco deste componente.

  9. Olá.
    Estou pensando em um projeto para controlar um enrolador de tecido pequeno. Quando o tecido esticar ele acusará uma corrente maior do que a corrente nominal, assim iria parar o motor. Ligando o motor novamente para enrolar quando a corrente iria diminuir.
    Será que eu conseguiria ler esses valores de corrente com esse sensor? Ou uma outra solução…

    1. Olá Rogério.
      A ideia pode funcionar sim, mas o circuito com o INA219 funciona apenas para tensão contínua, não sei se seria o caro da sua aplicação. Caso for, será necessário somente adaptar o código.

      Caso for em AC existem outros projetos no blog, como este que escrevi
      https://www.filipeflop.com/blog/medidor-de-corrente-ac-acs712-emonlib/

  10. Olá tudo bem? Montei exatamente como seu tutorial e não está lendo a corrente e a tensão só fica em 32V, mesmo eu variando. Poderia me ajudar?

    1. Um problema possível é que os circuitos não estejam compartilhando o mesmo terra e ficando sem referência. Verifique a conexão dos terras.

      Outro teste possível é conectar Vin+ e Vin- ao Gnd do circuito, ele deverá ler 0V e 0A ou próximo disso.

      1. Fiz o teste, ligando Vin+ e Vin- ao terra e continuou com o mesmo problema:
        Tensão: 32.76 V
        Corrente: -0.10 mA
        Potência: -0.00 W
        Coloquei o mesmo terra e nada.
        Será que o sensor está com problema?

  11. Trocando o resistor shunt é possível ler correntes de até 8A em 15V?

    1. Teoricamente sim, mas você terá que verificar algumas coisas: A tensão sobre o resistor não pode exceder 320mV e você terá que recalcular as constantes internas relacionadas ao calculo da corrente.

      Além disso, a placa não foi preparada para uma corrente tão elevada (trilhas finas entre conector e shunt). O ideal seria você montar sua própria placa.

      1. Na verdade eu preciso medir a corrente de um alternador para uma bateria, mas não no carro é para outra aplicação, as correntes não devem passar de 7A – 8A você teria alguma outra sugestão?

        1. Poucas ferramentas vão realizar isso sem algum trabalho externo. o INA219 funciona bem para isso (em DC), principalmente porque ele calcula tudo sozinho. Mas no seu caso você teria que fazer sua própria placa.

          Outra possibilidade seria utilizar um ACS712-20A. No caso de usar ele você é quem ficará responsável por realizar todos os cálculos. Se procurar na loja encontrará o componente e também exemplos.

  12. Boa tarde!

    Meu nome é Gabriel e estou com uma urgência e preciso de sua ajuda se possível.

    Meu projeto precisa fazer a leitura de 0-36v com corrente de 0-10A
    comprei com vocês o modulo regulador de corrente 30A e gostaria de saber se com o INA219 é possivel realizar a medição de até 36v realizando algum tipo de alteração no resistor shunt.

    Ficarei muito grato caso consiga me responder.

    Obrigado!

    1. o INA219 pode monitorar de 0 a 26Vdc. Modificar o shunt permite manipular apenas o range de corrente, mas não o de tensão.