Projetos

Amperímetro Prático com LCD

Eletrogate 26 de fevereiro de 2021

Introdução

O Amperímetro é o medidor utilizado para mensurar um fluxo de elétrons, ou seja, uma corrente, cuja unidade de medida é o ampere. Tendo isto em vista, será desenvolvido neste post um amperímetro usando o Arduino e alguns componentes. Este projeto foi desenvolvido por um dos parceiros da Eletrogate, o Wagner do canal WR Kits. Acesse seu canal no Youtube e confira também abaixo o vídeo em que este post será baseado:


Diagrama

O diagrama projeto desenvolvido aqui é o seguinte:

É importante salientar algumas coisas. O LM358 disponível em nossa loja é um pouco diferente do apresentado aqui no post, e, apesar de sua funcionalidade ser exatamente a mesma, é necessário prestar atenção nas novas portas de entrada do módulo LM358 e suas conexões, e também que sua amplificação é variável, portanto será preciso fazer algumas alterações no código, que será explicado abaixo. Outro aspecto do diagrama que precisa de atenção é o Resistor Shunt, que, por conta da falta de um desenho seu no fritzing, ele foi substituído pelo resistor azul no esquemático, porém, em seu lugar, deve ser utilizado o resistor shunt. Por fim, é importante frisar que a corrente que está sendo medida é a do resistor de 100 Ω, portanto se o leitor quiser descobrir o fluxo de corrente em outros componentes ou dispositivos, basta substituir o resistor mencionado pelo que deseja ser medido.


Código

O código que será utilizado nesta prática está detalhado abaixo:

/* =====================================================================================

   Curso de Arduino e AVR WR Kits Channel
   
   Aula 277: Amperímetro com Display LCD 16x2 sem biblioteca
   
   Autor: Eng. Wagner Rambo  
   Data: Janeiro de 2021


===================================================================================== */
 

// =====================================================================================
// --- Mapeamento de Hardware ---
#define  db7  7
#define  db6  6
#define  db5  5
#define  db4  4
#define  db3  11
#define  db2  10
#define  db1  9
#define  db0  8

#define  rs   13
#define  en   12


// =====================================================================================
// --- Constantes do Projeto ---
#define   rshunt   100   //resistor de shunt para mA (0,10 Ohms x 1000)


// =====================================================================================
// --- Protótipo das Funções ---
void char_pos(char row, char col);
void set_col(char address);
void send_char(char character, char row, char col);
void lcd_init();
void lcd_clear();
void ammeter();
float average_volt();
void serial_debug();


// =====================================================================================
// --- Variáveis Globais ---
float content;
unsigned m_amps;

char  mil, cen, dez, uni;
 

// =====================================================================================
// --- Configurações Iniciais ---
void setup()
{
   Serial.begin(9600);
   //configura saídas
   pinMode(db0, OUTPUT);
   pinMode(db1, OUTPUT);
   pinMode(db2, OUTPUT);
   pinMode(db3, OUTPUT);
   pinMode(db4, OUTPUT);
   pinMode(db5, OUTPUT);
   pinMode(db6, OUTPUT);
   pinMode(db7, OUTPUT);
   pinMode(rs,  OUTPUT);
   pinMode(en,  OUTPUT);

   //inicializa saídas
   digitalWrite(db0,  LOW);
   digitalWrite(db1,  LOW);
   digitalWrite(db2,  LOW);
   digitalWrite(db3,  LOW);
   digitalWrite(db4,  LOW);
   digitalWrite(db5,  LOW);
   digitalWrite(db6,  LOW);
   digitalWrite(db7,  LOW);
   digitalWrite(en,   LOW);
   digitalWrite(rs,   LOW);
   delay(2);

   lcd_init();

   send_char('A',1,4);
   send_char('M',1,5);
   send_char('P',1,6);
   send_char('S',1,7);
   send_char(':',1,8);
 
    
} //end setup

 
// =====================================================================================
// --- Loop Infinito ---
void loop()
{
  
  ammeter();

  serial_debug();

  delay(741);
     
} //end loop


// =====================================================================================
// --- Desenvolvimento das Funções ---


void ammeter()
{
  //content = analogRead(A0)*5000.0/1023.0;
  content = (average_volt()/11.0)*(5000.0/1023.0);
  
  content *=1000.0;

  m_amps = (unsigned)(content/rshunt);
  cen = (char)(m_amps/100);
  dez = (char)((m_amps%100)/10);
  uni = (char)(m_amps%10);
  
  send_char(cen+48,2,5);
  send_char(dez+48,2,6);
  send_char(uni+48,2,7);
  send_char('m'   ,2,8);
  send_char('A'   ,2,9); 
  
  
} //end ammeter


void char_pos(char row, char col)
{
   col -= 1;

   switch(row)
   {
      case 1: set_col(col);      break; 
      case 2: set_col(col+0x40); break;
    
   } //end switch
  
} //end char_pos


// =====================================================================================
// --- Função para Envio de Caracteres ---
void set_col(char address)
{
   digitalWrite(rs,   LOW);
   digitalWrite(db7, (address >> 7) | 0x01);
   digitalWrite(db6, (address >> 6) & 0x01);
   digitalWrite(db5, (address >> 5) & 0x01);
   digitalWrite(db4, (address >> 4) & 0x01);
   digitalWrite(db3, (address >> 3) & 0x01);
   digitalWrite(db2, (address >> 2) & 0x01);
   digitalWrite(db1, (address >> 1) & 0x01);
   digitalWrite(db0, (address >> 0) & 0x01);
   digitalWrite(en,   LOW);
   delay(2);
   digitalWrite(en,  HIGH);
   delay(2);
   digitalWrite(en,   LOW);
   delay(2);
   
} //end set_col


void send_char(char character, char row, char col)
{

   char_pos(row, col);
   digitalWrite(db7, (character >> 7) & 0x01);
   digitalWrite(db6, (character >> 6) & 0x01);
   digitalWrite(db5, (character >> 5) & 0x01);
   digitalWrite(db4, (character >> 4) & 0x01);
   digitalWrite(db3, (character >> 3) & 0x01);
   digitalWrite(db2, (character >> 2) & 0x01);
   digitalWrite(db1, (character >> 1) & 0x01);
   digitalWrite(db0, (character >> 0) & 0x01);
 
   digitalWrite(rs,  HIGH);delay(2);
   digitalWrite(en,  HIGH);
   delay(2);
   digitalWrite(en,   LOW);
   
   delay(2);   
  
} //end send_char


// =====================================================================================
// --- Função para Inicializar LCD ---
void lcd_init()
{
   // LIMPA LCD
   digitalWrite(db0, HIGH);
   digitalWrite(db1,  LOW);
   digitalWrite(db2,  LOW);
   digitalWrite(db3,  LOW);
   digitalWrite(db4,  LOW);
   digitalWrite(db5,  LOW);
   digitalWrite(db6,  LOW);
   digitalWrite(db7,  LOW);
   digitalWrite(en,   LOW);
   delay(2);
   digitalWrite(en,  HIGH);
   delay(2);
   digitalWrite(en,   LOW);
   delay(2);

   // MODO DE 8 BITS
   digitalWrite(db0,  LOW);
   digitalWrite(db1,  LOW);
   digitalWrite(db2,  LOW);
   digitalWrite(db3, HIGH);
   digitalWrite(db4, HIGH);
   digitalWrite(db5, HIGH);
   digitalWrite(db6,  LOW);
   digitalWrite(db7,  LOW);
   digitalWrite(en,   LOW);
   delay(2);
   digitalWrite(en,  HIGH);
   delay(2);
   digitalWrite(en,   LOW);
   delay(2);

   // LIGA LCD, LIGA CURSOR, DESLIGA BLINK
   digitalWrite(db0,  LOW);
   digitalWrite(db1, HIGH);
   digitalWrite(db2, HIGH);
   digitalWrite(db3, HIGH);
   digitalWrite(db4,  LOW);
   digitalWrite(db5,  LOW);
   digitalWrite(db6,  LOW);
   digitalWrite(db7,  LOW);
   digitalWrite(en,   LOW);
   delay(2);
   digitalWrite(en,  HIGH);
   delay(2);
   digitalWrite(en,   LOW);
   delay(2);

   // HABILITA INCREMENTO, DESLIGA SCROLL
   digitalWrite(db0,  LOW);
   digitalWrite(db1, HIGH);
   digitalWrite(db2, HIGH);
   digitalWrite(db3,  LOW);
   digitalWrite(db4,  LOW);
   digitalWrite(db5,  LOW);
   digitalWrite(db6,  LOW);
   digitalWrite(db7,  LOW);
   digitalWrite(en,   LOW);
   delay(2);
   digitalWrite(en,  HIGH);
   delay(2);
   digitalWrite(en,   LOW);
   delay(2);
  
} //end lcd_init



void lcd_clear()
{

   // LIMPA LCD
   digitalWrite(rs,   LOW);
   digitalWrite(db0, HIGH);
   digitalWrite(db1,  LOW);
   digitalWrite(db2,  LOW);
   digitalWrite(db3,  LOW);
   digitalWrite(db4,  LOW);
   digitalWrite(db5,  LOW);
   digitalWrite(db6,  LOW);
   digitalWrite(db7,  LOW);
   digitalWrite(en,   LOW);
   delay(2);
   digitalWrite(en,  HIGH);
   delay(2);
   digitalWrite(en,   LOW);
   delay(2);

} //end lcd_clear




float average_volt()                            //Função que calcula a média de 100 leituras de tensão
{                                              //Garante maior precisão na medida
     unsigned char i;                          //Variável de iterações
     float volt_store = 0;                      //Variável local para armazenar o valor da tensão

     for(i=0; i<100; i++)                      //Somatório de 100 leituras
     {
              volt_store += analogRead(A0);       //faz o somatório das 100 iterações
     }

     return(volt_store/100.0);                   //retorna a média das iterações

} //end average_temp


void serial_debug()
{
  Serial.print("analogRead(0)= ");
  Serial.print(analogRead(A0));
  Serial.print("  |  ");
  Serial.print("average_volt= ");
  Serial.print(average_volt());
  Serial.print("  |  ");
  Serial.print("content= ");
  Serial.print(content);
  Serial.print("  |  ");
  Serial.print("mAmps= ");
  Serial.print(m_amps);
  Serial.print(" mA");
  Serial.println("  |  ");
  
  
  
} //end serial_debug

// =====================================================================================
// --- Final do Programa ---

O projeto aqui desenvolvido utiliza um LM358 simples, porém nossa loja disponibiliza um Módulo Amplificador Operacional LM358, com ganho variável de até 100 vezes, portanto é necessário fazer um pequeno ajuste no nosso código para que ele funcione com este módulo. Basta modificar um valor dentro da função ammeter. Na conta ‘content = (average_volt()/11.0)*(5000.0/1023.0)’, substitua o valor 11.0 por 100.0. Pronto, agora basta manter o módulo sempre no máximo da amplificação e o projeto funcionará perfeitamente.

void ammeter()
{
  //content = analogRead(A0)*5000.0/1023.0;
  content = (average_volt()/11.0)*(5000.0/1023.0);
  
  content *=1000.0;

  m_amps = (unsigned)(content/rshunt);
  cen = (char)(m_amps/100);
  dez = (char)((m_amps%100)/10);
  uni = (char)(m_amps%10);
  
  send_char(cen+48,2,5);
  send_char(dez+48,2,6);
  send_char(uni+48,2,7);
  send_char('m'   ,2,8);
  send_char('A'   ,2,9); 
  
  
} //end ammeter

É importante lembrar que o projeto desenvolvido aqui não utiliza nenhuma biblioteca referente ao display LCD. Para compreender como isto pode ser possível, basta acessar o vídeo abaixo ou conferir a playlist do WR Kits no Youtube.


Botando pra Rodar!

Tendo montado e rodado o projeto, pode-se chegar no seguinte resultado:

O gif acima mostra a comparação entre a leitura do amperímetro desenvolvido aqui e a real corrente que ele está medindo. É possível perceber que a leitura não é perfeita e possui alguns erros, principalmente quando o valor da corrente sobe acima de determinados valores. Isso ocorre devido a alguns erros dos próprios componentes que estão sendo utilizados nesta prática. Porém, o amperímetro desenvolvido aqui é bem simples e serve mais como experimento prático, portanto seus valores de saída ainda são satisfatórios.


Considerações Finais

Ao final deste post, é esperado que o leitor tenha compreendido como montar seu próprio amperímetro utilizando apenas o Arduino e seus componentes. O objetivo aqui é incentivar a implementação prática de experimentos interessantes com o Arduino. Se se interessou pelo conhecimento aqui aprendido, acesse também os posts relacionados abaixo:

Curtiu o post? Avalie e deixe um comentário!

Siga-nos também no Instagram e nos marque quando fizer algum projeto nosso: @eletrogate.

Até mais!


Sobre o Autor


Ricardo Lousada
@ricardo_lousada

Graduando em Engenharia de Controle e Automação pela UFMG. Ocupo meu tempo aprendendo cada vez mais sobre eletrônica e programação, áreas que mais gosto. Meus hobbies são cinema e livros.


Eletrogate

26 de fevereiro de 2021

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!