Página principal


Arduino
TM1638

Doble voltímetro 0-15V
xsetaseta@gmail.com


Siguiendo con esta serie de artículos que emplean el TM1638, en este haremos un doble voltímetro.
Hay que mencionar que el voltaje del USB debería ser siempre de 5V, pero en la práctica se encuentra entre 4.5V y 5V . Como el conversor A/D toma la referencia sobre la tensión del USB , la medida real puede variar. Para solucionar este problema se hace una medida de referencia sobre los 3.3V del pin del arduino. Con la referencia tomada, se hace un cálculo con la medida tomada de la entrada de A0 y A1 y la referencia, corrigiéndose el valor.
En todas las medidas de voltaje, se hace una media de 10 medidas consecutivas, de esta forma se hace mas exacto la medida.
Como el arduino solo puede medir hasta 5V, para medir hasta 15V colocamos un divisor por 3 mediante 3 resistencias de 10K.
He utilizado el botón S1 para cambiar entre 1 y 2 decimales, algunas veces se necesitan 2 decimales.
En las pruebas prácticas se ha comprobado que las medidas son bastante exactas.


Esquema de conexión.


Montaje del circuito.


Visión con 2 decimales.

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

*/


#include <TM1638.h>

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


#define MULTIPLO 3
#define ENTRADA1 A0
#define ENTRADA2 A1

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

void setup()
 {
  //Serial.begin(9600);
  pinMode(ENTRADA1, INPUT);
  pinMode(ENTRADA1, 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;
  int z1,z2;
 
  vv1=analogRead10(ENTRADA1);
  delay(150);

  vv2=analogRead10(ENTRADA2);
  delay(150);
 
  voltios1=vv1*33; voltios1*=MULTIPLO; voltios1*=modo; voltios1/=test3v3;
  voltios2=vv2*33; voltios2*=MULTIPLO; voltios2*=modo; voltios2/=test3v3;
  z1=voltios1;    z2=voltios2;
 
  if(modo==1)
       { sprintf(cadena,"%03du%03du",z1,z2);  }
      else
       { sprintf(cadena,"%04d%04d",z1,z2);    }
 
  module.setDisplayToString(cadena,0,0);
  module.setDisplayDigit(cadena[1]-48,1,1);
  module.setDisplayDigit(cadena[5]-48,5,1);
//  Serial.println(cadena); 
//  sprintf(cadena,"vv1=%05d  vv2=%05d  test=%05d ",vv1,vv2,test3v3);
//  Serial.println(cadena);
 
  keys = module.getButtons();
  if(keys==1)
    {
     if(modo==10)
       {
        modo=1;
        module.setLEDs(0);
       }
      else
       {
        modo=10;
        module.setLEDs(1);
       }
     while( 0 != module.getButtons());
    } 
}

//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);
}



Hasta pronto.
JUAN GALAZ

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