Вы находитесь на странице: 1из 2

VuMetro con LCD

Una forma muy habitual de representar un valor numrico de forma visible, es mediante barras o bien grficos de barra,
ya que por ejemplo si tenemos un amperimetro y donde pasamos de leer de 1A a 9A de forma numrica como en el
ejemplo, no vamos a notar un cambio si no estamos prestando atencin directamente el numero en cuestin, pero si en
cambio tenemos un grfico de barra donde el fondo de escala es 10A, entonces pasara de "#" a "#########" donde
claramente se puede observar el incremento de la barra proporcional al valor medido.
Este mtodo se utiliza tanto en instrumentos de medicin de energa como tambin en termmetros y en el audio con el
nombre de VuMetro (Medicin de Unidades de Volumen).
En este caso yo lo he realizado para Audio ya que me pareci una opcin muy comn pero como mencionaba
antes, podramos hacer un termostato donde nos muestra el valor numrico y en barra (aprovechando los dos renglones
del LCD) u otro dispositivo.
En este caso al tratarse de un VuMetro de audio, estamos usando los dos renglones del LCD para poner un canal en
cada uno y se esta realizando una actualizacin del valor de la barra cada un poco mas de 20us que es el tiempo que
demora en leer los dos canales ADC (mas algo de tiempo de instruccin).
El programa es relativamente sencillo y no requiere de funciones especiales, en este caso he implementado
la funcin MAP que la pueden encontrar en el siguiente LINK, que se encarga de adaptar el valor del ADC al valor
necesario, en este caso de 0 a 16, ya que es la cantidad de caracteres que tenemos en el LCD.
Luego Leemos los ADC (uno por cada canal) y pasamos su valor por la funcin MAP, lo redimencionamos y lo
guardamos en Salida1 y Salida2.
Una vez echo esto borramos el LCD y procedemos al incremento de caracteres (bloque negro 0xFF) que sera nuestro
segmento por cada uno de los 16 niveles.
Para el incremento se utiliza un lazo de iteracion for, donde contamos de 1 a 16 y vamos incrementando el carcter con
la funcin gotoxy(), donde imprimimos el valor 0xFF con la funcin lcd_putc().
Luego repetimos este for para el otro canal cambiando el renglon y el ciclo se repite indefinidamente.
Notase que el LCD se borra cada vez que el ciclo se repite, esto es porque el audio cambia constantemente, y los lazos
for solo incrementan la cantidad.
Si utilizamos esta visualizacin para un termmetro por ejemplo, que la variacin es lenta, podramos actualizar el valor
con una frecuencia menor, sin la necesidad de borrar el lcd cada +20us.

En el mapa de caracteres del LCD podemos ver que el carcter que utilizamos corresponde a la fila xxxx1111 y la
columna 1111, quedando armado as como 11111111 que en hexadecimal es 0xFF, pero si quieren usar
otro smbolo pueden armar el valor de esta misma forma.

El circuito no tiene mucha magia, es algo sper bsico y ustedes pueden cambiar los pines a gusto, pero hay que tener
en cuenta que la tensin de entrada del ADC es de 0 a 5V, pueden utilizar un acondicionador de seal
con algn amplificador de entrada para tener 5V de fondo de escala, o bien pueden modificar por firmware la tensin de
referencia superior +Vref a la tensin mxima de audio, por ejemplo 1V o 200mV, depender del sistema de sonido.
El Programa.
#include<16f883.h>
#device adc=8
#use delay(int=4000000)
#include<LCD.C>
double map(float valor, float entradaMin,
float entradaMax, float salidaMin,
float salidaMax){
return ((((valor-entradaMin)*
(salidaMax-salidaMin))/
(entradaMax-entradaMin))+salidaMin);
}
void main(){
setup_adc_ports(sAN0|sAN1|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
lcd_init();
int8 salida1, salida2, i, j, leeAdc1, leeAdc2;
while(true){
set_adc_channel(0);
delay_us(10);
leeAdc1 = read_adc();
salida1 = map(leeADC1, 0, 255, 0, 16);
set_adc_channel(1);
delay_us(10);
leeAdc2 = read_adc();
salida2 = map(leeADC2, 0, 255, 0, 16);
lcd_init();
for(i=1;i<salida1+1;i++){
lcd_gotoxy(i,1);
lcd_putc(0xFF);
}
for(j=1;j<salida2+1;j++){
lcd_gotoxy(j,2);
lcd_putc(0xFF);
}
}
}

http://electgpl.blogspot.com.ar/2015/10/vumetro-con-lcd.html

Вам также может понравиться