blog-eletrogate-logo-desktop blog-eletrogate-logo-mobile
  • Categorias
    • Voltar
    • INICIANTES
    • INTERMEDIÁRIOS
    • AVANÇADOS
    • divide
    • Automação Residencial
    • Componentes Eletrônicos
    • Impressão 3D
    • IoT
    • Modelagem 3D
    • Módulos Wifi
    • Por trás da tecnologia
    • Projetos
    • Raspberry Pi
    • Robótica
    • Sensores
    • Shields
    • Sistemas Operacionais
    • Tipos de Arduino
    • Tutoriais
  • Apostilas
  • Quem Somos
  • Seja um redator
  • Trabalhe Conosco
    • Categorias
      • Voltar
      • INICIANTES
      • INTERMEDIÁRIOS
      • AVANÇADOS
      • divide
      • Automação Residencial
      • Componentes Eletrônicos
      • Impressão 3D
      • IoT
      • Modelagem 3D
      • Módulos Wifi
      • Por trás da tecnologia
      • Projetos
      • Raspberry Pi
      • Robótica
      • Sensores
      • Shields
      • Sistemas Operacionais
      • Tipos de Arduino
      • Tutoriais
    • Apostilas
    • Quem Somos
    • Seja um redator
    • Trabalhe Conosco
Loja Eletrogate
voltar
  • Introdução
  • Materiais Necessários para o Projeto Amperímetro Prático com LCD
  • Diagrama
  • Código
  • Botando pra Rodar!
  • Considerações Finais
  • Referência
  • Sobre o Autor
Projetos

Amperímetro Prático com LCD

Eletrogate 26 de fevereiro de 2021Atualizado em: 19 set 2022

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:


Materiais Necessários para o Projeto Amperímetro Prático com LCD

Os materiais necessários para esta prática são os seguintes:

  • 1x Uno R3 + Cabo Usb para Arduino
  • 1x Potenciômetro Trimpot 10K Horizontal
  • 1x Display LCD 16×2 com Backlight Azul
  • 1x Resistor 0R10 5% 5W (1 unidade)
  • 1x Resistor 100K 1/4W (10 Unidades)
  • 1x Resistor 100R 1/4W (10 Unidades)
  • 1x Resistor 1K 1/4W (10 Unidades)
  • 1x Resistor 10K 1/4W (10 Unidades)
  • 1x Módulo Amplificador Operacional LM358 – Ganho de 100 vezes
  • 1x Protoboard 830 Pontos
  • 1x Jumpers – Macho/Macho – 40 Unidades de 20cm

cta_cart


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:

  • Guia Completo do Display LCD – Arduino;
  • Jogo em LCD no Arduino;
  • Display LCD + Módulo RF para detecção de presença;

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!


Referência

  • AMPERÍMETRO PRÁTICO COM LCD | Curso de Arduino #278 – WR Kits;

Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!


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 Atualizado em: 19 set 2022

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!

Projetos

Jogo da Velha na TV!

Eletrogate19 de setembro de 2023

Este é um jogo de quebra-cabeça para dois jogadores, identificados como “X” e “O”, que se revezam marcando os espaços em uma área 3 × 3.
Alguma vez na vida você já deve ter jogado este clássico jogo conhecido como Jogo-da-Velha ou Tic-Tac-Toe.

Neste post, você vai aprender a montar e programar uma versão digital deste jogo, com saída de imagem para TV, utilizando apenas alguns componentes eletrônicos básicos, uma placa Arduino UNO e um Teclado Matricial de 16 teclas.

Projetos

Jogo da Velha na TV!

Eletrogate19 de setembro de 2023

Este é um jogo de quebra-cabeça para dois jogadores, identificados como “X” e “O”, que se revezam marcando os espaços em uma área 3 × 3.
Alguma vez na vida você já deve ter jogado este clássico jogo conhecido como Jogo-da-Velha ou Tic-Tac-Toe.

Neste post, você vai aprender a montar e programar uma versão digital deste jogo, com saída de imagem para TV, utilizando apenas alguns componentes eletrônicos básicos, uma placa Arduino UNO e um Teclado Matricial de 16 teclas.

IoT

LittleFS: Alto Desempenho para RP Pico, ESP32 e ESP8266

Eletrogate12 de setembro de 2023

Aprenda neste post, a usar o sistema de arquivos LittleFS, que possui mais desempenho do que o sistema SPIFFS, nas placas Raspberry Pi Pico, ESP32 e ESP8266.

IoT

LittleFS: Alto Desempenho para RP Pico, ESP32 e ESP8266

Eletrogate12 de setembro de 2023

Aprenda neste post, a usar o sistema de arquivos LittleFS, que possui mais desempenho do que o sistema SPIFFS, nas placas Raspberry Pi Pico, ESP32 e ESP8266.

Sensores

Como Utilizar o Módulo Sensor de Cor RGB TCS34725

Eletrogate5 de setembro de 2023

Você já precisou de algum sensor para detectar as cores de objetos? Venha conferir o post de hoje! Nós vamos utilizar o sensor RGB TCS34725.

Sensores

Como Utilizar o Módulo Sensor de Cor RGB TCS34725

Eletrogate5 de setembro de 2023

Você já precisou de algum sensor para detectar as cores de objetos? Venha conferir o post de hoje! Nós vamos utilizar o sensor RGB TCS34725.

Projetos

Controlando o Braço Robótico em MDF via Bluetooth

Eletrogate29 de agosto de 2023 Atualizado em: 01 set 2023

Que tal montar um braço robótico e controlá-lo pelo celular? Entre para dicas de montagem e aprender a controlar servos e conectar sua placa.

Projetos

Controlando o Braço Robótico em MDF via Bluetooth

Eletrogate29 de agosto de 2023 Atualizado em: 01 set 2023

Que tal montar um braço robótico e controlá-lo pelo celular? Entre para dicas de montagem e aprender a controlar servos e conectar sua placa.

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!

blog-eletrogate-logo-footer

Rua Rio de Janeiro, 441 - Sala 1301
Centro - Belo Horizonte/MG
CEP 30160-041
*Não temos atendimento físico

ANWAR SLEIMAN HACHOUCHE - ME
CNPJ: 18.917.521/0001-73

Atendimento

(31) 3142-3800

[email protected]


Seg a Sex - das 8h às 17h

Institucional

  • Apostilas
  • Quem Somos
  • Privacidade
  • Seja um Redator
  • Trabalhe Conosco

Nos acompanhe

Facebook Instagram Youtube

© ELETROGATE 2023 - Todos os direitos reservados. Termos de uso e Política de privacidade.