INDICADOR ANALÓGICO CON ARDUINO Y PROCESSING
En este tutorial veremos como hacer un indicador analógico con arduino y processing.
El indicador consiste en una aguja que va moviéndose de acuerdo al nivel de tensión que lee el conversor analógico digital de Arduino.
Para generar el movimiento de la aguja tenemos que pensar en coordenadas "R" y "teta" (R es el radio del indicador y teta es el angulo que se desplaza la aguja).
Entonces, lo que debemos hacer es simplemente dibujar una linea recta en processing donde la coordenada inicial sera el centro del indicador analógico (X,Y) y la coordenada final tendrá como como componentes: (X+R*cos(teta),Y+R*sn(teta)).
Haciéndolo de esta manera, la posición de la aguja ira cambiando con respecto al angulo teta. Por esa razon, el valor digital leido por el adc[0-1023 ] tendrá que que ser mapeado para un rango de angulo de [0 a 180 grados].
El código en arduino será el siguiente:
void setup()
{
Serial.begin(9600);
}
void loop()
{
int valor=analogRead(A0);
Serial.println(valor);
}
El código en processing será el siguiente:
//indicador analogico de voltaje
import processing.serial.*;
Serial port; // creamos un objeto serial puerto
float voltaje; //variable que contiene el voltaje actual medido
float angulo; //angulo proporcional al voltaje que se esta midiendo
int x, y; //coordenadas iniciales de la aguja indicadora
int radio; //radio de la aguja indicadora
PImage img; //creamos el objeto imagen que importaremos
PFont font;
void setup()
{
size(340, 400);
img = loadImage("gauge2.png");
font = loadFont("ArialMT-30.vlw");
textFont(font); //cargamos el font a nuestro texto
x = 170;//puntos centrales de la circunferencia
y = 170;
radio = 110; //radio de la circunferencia
///////////////////////////////////////////////////////
//defininimos parametros para la comunicacion serial
port = new Serial(this,"COM21", 9600);
port.bufferUntil('\n');
////////////////////////////////////////////////////
}
void draw()
{
background(0);
stroke(255,0,0);
point(x,y);
image(img,20,20);
//formateando a dos decimales
String volts = nf(voltaje, 2, 2);
println(volts);
line(x,y, x+radio*cos(radians(angulo)), y+radio*-sin(radians(angulo)));
line(x-1,y-1, x+radio*cos(radians(angulo)), y+radio*-sin(radians(angulo)));
line(x-2,y-2, x+radio*cos(radians(angulo)), y+radio*-sin(radians(angulo)));
fill(255,255,0);
textAlign(CENTER);
text(volts+" VOLTIOS",175,370);
delay(30);
}
se puede osbservar en el video: