sábado, 18 de fevereiro de 2017

Voltímetro com Arduino

Voltímetro com Arduino

Com o intuito de disponibilizar ao usuário valores de medição de tensões o voltímetro é ma importante ferramenta de trabalho para que se arrisca no universo da eletrônica como hobista ou profissional. 
Por definição, o voltímetro é um aparelho que realiza medições de tensão elétrica em um circuito. Ele exibe essas medições, geralmente, por meio de um ponteiro móvel ou um mostrador digital, de cristal líquido (LCD) por exemplo. A unidade apresentada geralmente é o Volt (V).
Atendendo ao pedido de Miguel Angel Ramos, um seguidor do blog, estaremos realizando o projeto de um voltímetro com digital com leitura em tela LCD.
Para isso vamos começar conhecendo um pouco mais do projeto.

O projeto

Para esse projeto, vai ser elaborado um circuito que pode medir tensões de no máximo 50V em corrente contínua.
Como o conversor ADC do Arduino trabalha com tensão máxima de +5V, faz-se necessário realizar um circuito para medir tensões superiores a esse valor, então vai ser elaborado um divisor de tensão (clique no texto se quiser conhecer mais sobre esse assunto).
Com funcionamento e entendimento fácil de realizar o divisor de tensão faz-se por meio de lei de Ohm, onde a tensão de entrada é definida pela fonte, e os resistores responsáveis pela divisão da tensão determinam o valor que vai para a tensão de saída.

Analisando:
Se tiver um valor de entrada (saída da fonte) com valor de +5V, os resistores do divisor com valores de 10 Kohm cada, o valor de saída vai ficar em +2,5V.
Vsaída = Ventrada x Rdebaixo/Rdecima + Rdebaixo, calculando tem-se 2,5V.


fonte: www.feiradeciencias.com.br



fonte: próprio autor

Montagem

Para o funcionamento do circuito vai ser necessário:
1 Arduino Uno/ Mega (ou similar)
1 protoboard 
1 LCD 16 x 2
1 modulo I2C
1 resistor de 10 k
1 resistor de 100k
cabos jumpers

Todos os componente pode ser adquiridos por esse LINK!

Na proposta do nosso projeto, deve ser montado um circuito que pode medir tensões de até 50Vcc, fazendo um divisor de tensão com resistores .


fonte: próprio autor


Para outros valores que estejam acima de 50Vcc, deve ser calculado outros valores para o divisor de tensão!

O circuito

Para o correto funcionamento deve ser feito todas as ligações conforme o esquema abaixo.

fonte: próprio autor

Para o Arduino Mega, é necessário que ao invés de conectar os pinos SDA e SCL do modulo I2C nos pinos A1 e A0 conecte-se aos pinos 20 e 21 respectivamente.


fonte: próprio autor

Ao contrário dos voltímetros/ multímetros não deve-se NUNCA inverter a polaridade das pontas de prova!

Modulo I2C

Esse modulo é utilizado em projetos com Arduino para reduzir o numero de conexões junto ao LCD 16 x 2 ou 20 x 4, pois somente fazendo uso dos pinos SDA  e SCL (analógicos), formam a interface de comunicação I2C.
em sua estrutura simples, existem 4 pinos onde dois são para alimentação, dois para conectar as portas analógicas e um potênciometro ao qual pode ser controlado o ajuste de contraste do display, o jumper na extremidade oposta a dos pinos seleciona o funcionamento ou não da backlight do display.




O modulo I2C vem configurado de fábrica com endereço 0x27, em alguns casos podem vir com faixas  de endereços diferente, para descobrir utilize o programa I2CScanner e substitua no programa a linha de endereço de acordo com o resultado obtido. O resultado deve ser demonstrado no monitor serial do Arduino.

fonte: próprio autor


No meu caso está com o endereço em 0x3F.

  1. LiquidCrystal_I2C lcd(<<<0x27>>>,2,1,0,4,5,6,7,3, POSITIVE);
  1. LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE);

I2CScanner

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.

#include <Wire.h>

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);           // wait 5 seconds for next scan
}

O código fonte

Insira o código abaixo na IDE do Arduino e execute o programa, o modulo I2C utiliza a biblioteca LiquidCrystal_I2C, que pode ser baixada junto com todos os arquivos ao final da postage.

 /** Código **/
/** Baseado no original de Jhonatan Caldeira **/
// Elaborado por Tony Emerson Marim em 08/07/2016.
/** mecatronizando@gmail.com **/
/** Voltimetro **/

#include <LiquidCrystal_I2C.h>
#include "Wire.h"
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE);

//Sensor de tensão//
int analogInput = A0;
float Vo = 0.0, Vi = 0.0;
float value_aux = 0, value = 0;

//Valores dos Resistores//
float R1 = 100000.0; //Resistência R1 (100K) 
float R2 = 10000.0; //Resistência R2 (10K) 

void setup(){
  pinMode(analogInput, INPUT);
  lcd.begin(16, 2);
  lcd.setBacklight(HIGH);
  lcd.setCursor(2,0);
  lcd.print("Voltimetro DC");
  lcd.setCursor(14,1);
  lcd.print("V");
  }

void loop(){
  
  for(int i=60;i>0;i--){
  value_aux = analogRead(analogInput);
  value += pow(value_aux,2);
}

  value = sqrt(value/60);
  Vo = (value * 5.0) / 1023.0;
  Vi = Vo / (R2/(R1+R2));
  if (Vi<0.09) {Vi=0.0;} //Filtrando medições errôneas!
  lcd.setCursor(5,1);
  lcd.print(" ");
  lcd.setCursor(5,1);
  lcd.print(Vi);
  delay(500);
}

Na eletrônica, dependendo da necessidade de precisão de medidas alguns ajustes podem ser feitos para melhorar a leitura do voltímetro, meça seus resistores que normalmente trabalham com porcentagens de até 10% de tolerância e reescreva o valor obtido no programa.


fonte: próprio autor

fonte: próprio autor

É importante ressaltar também que a fórmula citada acima está presente no programa para que o cálculo da leitura seja executada.


fonte: próprio autor

Depois de todos os ajustes e com o programa carregado fica possível obter as leituras de tensão desejadas.

No vídeo abaixo é possível ver o funcionamento do voltímetro.




Todos os arquivos do projeto se encontram nesse LINK, caso seja necessário é só baixar.

Gostou? 
Todos os componentes com ótima qualidade podem ser encontrados AQUI!



2 comentários:

  1. Ola colega, gostaria de saber por qual motivo utilizou power e sqrt.

    Nao consegui identificar nenhuma utilidade em elevar ao quadrado para depois tirar a raiz.

    Outra coisa, nao deveria zerar "value" antes de iniciar o for() com o somatorio?

    ResponderExcluir