Página principal


Arduino
TM1638

Voltímetro y Amperímetro
xsetaseta@gmail.com


En este artículo realizo un voltímetro y un medidor de intensidad.
Para medir la intensidad del circuito se inserta una resistencia de pequeño valor en serie con el circuito a medir.
Para no interferir en la tensión del circuito a medir, se debería utilizar una resistencia de valor mas bajo posible.
Como la caída de tensión en la resistencia es demasiado baja con una resistencia de por ejemplo 3 ohmios para poder ser medida por el arduino sin emplear otro componente adicional, empleamos una de 18 ohmios.
Con una resistencia de 18 ohmios y con una intensidad de 30 mA, producimos una caída de tensión de 0.5V en la tensión que ofrecemos al circuito a medir.
Por ejemplo : si tenemos de alimentación de 5V con un consumo de 30mA, entregaríamos solo 4.5V.
Como vemos debemos sopesar la resistencia a colocar en serie con circuito a mediar, y ajustarla a que la caída de tensión no sea grande.
Si quisiéramos medir en una escala de hasta 5mA ,deberíamos utilizar una resistencia de 100 ohmios para que la caída de tensión fuera como máximo de 0.5V .
Las 3 resistencias de 1K son a modo de protección del arduino, por si metemos un arduino mal programado.
Los 3 condensadores se utilizan para filtrar la alimentación, con unos 100uF 5V servirían.


Esquema teórico.


Esquema eléctrico.
 

Esquema de conexión.



Montaje del circuito y con una carga de 1K.


/*
xsetaseta@gmail.com
Juan Galaz
8/SEP/2017
*/


#include <TM1638.h>

//data(I/O) pin 8, clock(CLK) pin 9 , strobe(STB) pin 7
TM1638 module(8, 9, 7);

#define ENTRADA1 A0
#define ENTRADA2 A1

char cadena[50];
unsigned int vv1,vv2,test3v3;

#define RESISTENCIA 18

void setup()
 {
  //Serial.begin(9600);
  pinMode(ENTRADA1, INPUT);
  pinMode(ENTRADA2, INPUT);
  pinMode(A7, INPUT);
  //intensidad al minimo
  module.setupDisplay(1,0);
  module.setDisplayToString("vol    ",0,0);
  delay(500);
  //toma la referencia de 3.3V
  test3v3=analogRead10(A7);
 }

void loop()
{
 byte keys;
 long voltios1,voltios2;
 unsigned int z1,z2;
 
  vv1=analogRead10(ENTRADA1);
  delay(150);

  vv2=analogRead10(ENTRADA2);
  delay(150);
 
  voltios1=vv1*33; voltios1*=10; voltios1/=test3v3;
  voltios2=vv2*33;  voltios2*=1000; voltios2/=test3v3;
 
  z1=voltios1;    //Voltios
  z2=voltios2/RESISTENCIA; //intensidad
 
  sprintf(cadena,"%03du%03di",z1,z2);
   
  module.setDisplayToString(cadena,0,0);
  module.setDisplayDigit(cadena[0]-48,0,1);
  module.setDisplayDigit(cadena[5]-48,5,1);
/*
  Serial.println(cadena); 
  sprintf(cadena,"vv1=%05d  vv2=%05d  test=%05d  mA*10=%d ",vv1,vv2,test3v3,voltios2/RESISTENCIA);
  Serial.println(cadena);
*/
}

//lectura de 10 medidas y hace la media
int analogRead10(int entrada)

{
 int z,v;
  for(z=0,v=0;z<10;z++)v+=analogRead(entrada);
  v/=10;
  return(v);
}

Nota: Debemos tener encuenta que no es un circuito muy preciso, que depende de muchos factores, no hay que hacerse muchas ilusiones al respecto.

Hasta pronto.
JUAN GALAZ

Bibliografía:
https://github.com/rjbatista/tm1638-library