Aquí os dejo un programa hecho para el arduino duemilanove, que hace la función de voltímetro usando 6 leds.
Poniendo le un par de diodos de pequeña señal, una resistencia y un condensador se podría convertir en un vúmetro de audio sin mucho problema.
El valor de la variable max establece el fondo de escala, que correspondería a la tensión que haría falta para que los 6 diodos LEDs permaneciesen encendido. El programa viene por defecto para que funcione entre los 0 a 5v, es decir que cada LED se encendería por cada múltiplo de 0,83v.
Las aplicaciones de este programa pueden ser muchas y muy variadas, como medir tensiones, temperaturas, o cualquier magnitud que se pueda traducir a un voltaje de entre 0 a 5 voltios o de 0 hasta 0,029v.
CODIGO:
/*
BUMETRO CON 6 LEDs
HECHO PARA ARDUINO DUEMILANOVE
CONEXIONADO
- Conectar el ánodo de los diodos LEDs a los pines digitales 2,3,4,5,6 y 7
- Colocar una resistencia de 220 ohmios de los cátodos de los diodos a masa
AUTOR: Mario R.P - mariorp@terra.es - 13-6-2012
*/
int sensorValue = 0; // variable de tensión detectada en el pin analógico 0
long max=170; // El valor de la variable max corresponde al nivel de tensión por el que se encenderán los diodos.
// Ejmeplo: 170 corresponde a un rango de entrada por el pin 0 de 0v a 5v (0= los 6 diodos apagados y 5v todos los leds encendidos).
// Si queremos un rango de por ejemplo 0v a 0,5v, el valor de max sería de 17 en vez de 170.
// NOTA: el pin 0 tiene que estar conectado a masa a través de una resistencia, aunque sea de muy alta resistencia, ya que de lo contrario, las lecturas serán por el efecto campo, es decir, serán lecturas erróneas.
void setup() {
pinMode(2, OUTPUT); //se establecen los pines digitales de salida
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}
void loop() {
sensorValue = analogRead(A0); // se establece el pin 0 como pin analógico de entrada
if(sensorValue>((1023/max)*1)) // Las condiciones anidadas enciende un LED si la tensión es superior a la establecida por max.
{
digitalWrite(2, HIGH);
if(sensorValue>((1023/max)*2))
{
digitalWrite(3, HIGH);
digitalWrite(2, HIGH);
if(sensorValue>((1023/max)*3))
{
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
digitalWrite(2, HIGH);
if(sensorValue>((1023/max)*4))
{
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
digitalWrite(2, HIGH);
if(sensorValue>((1023/max)*5))
{
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
digitalWrite(2, HIGH);
if(sensorValue>((1023/max)*6))
{
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
digitalWrite(2, HIGH);
}
else
{
digitalWrite(7, LOW);
}
}
else
{
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
}
else
{
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
}
else
{
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
}
else
{
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
}
else
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
delay(100); // tiempo de muestreo
}