Mostrando entradas con la etiqueta voltimetro. Mostrar todas las entradas
Mostrando entradas con la etiqueta voltimetro. Mostrar todas las entradas

miércoles, 26 de enero de 2022

Voltímetro analógico en Gambas (VB Linux) y con Arduino

  Página principal

Voltímetro analógico en Gambas (VB Linux)
Arduino

Este es un montaje rápido a nivel de circuito, simplemente lee el pin A0 del arduino para luego mandar la lectura a través del puerto serie.
En la parte del programa del arduino, espera la llegada de la orden "DATA" desde el puerto serie, para luego mandar la lectura analógica del A0 al puerto serie.
En la parte del ordenador, el programa está hecho en Gambas (VB Linux)
El programa lee el puerto serie, y cuando llega la cadena con la forma "A0 645" interpreta la lectura como el valor analógico del pin A0.
La representación se hace de forma digital y analógico.
Como la alimentación del arduino nano puede variar dependiendo si se conecta al USB o una fuente real de 5V, he colocado un ajuste fino del voltaje de referencia.


Programa en Gambas.



Para el ajuste perfecto de medida, se coloca el pin A0 a 3V3 y se ajusta el Voltaje de referencia para que mida 3300 mV.



PROGRAMAS Gambas y Arduino

Saludos.
Juan Galaz



Bibliografía:


martes, 12 de septiembre de 2017

Voltímetro y Amperímetro - Arduino - TM1638

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

miércoles, 6 de septiembre de 2017

Doble voltímetro 0-15V con Arduino y TM1638

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