Este es el IDE del processing, muy similar al de arduino. |
import processing.serial.*; Serial puerto; long valor, x=25, valor1=10, alto, ancho, tiempo1;
long tiempo2=1000, z, tiempo, basura, nulo=0;
String valores;
boolean comprobacion=false;
void setup()
{
size(900, 500);
alto = height;
ancho= width-200;
background(0);
puerto = new Serial(this, Serial.list()[0], 115200);
dibujo();
}
void draw()
{
if(puerto.available() > 0)
{
textSize(11);
//valores=puerto.readStringUntil('\n');
tiempo1 = int(trim("0"+puerto.readStringUntil(' ')));
valor = int(map(int(trim("0"+puerto.readStringUntil('\n'))), 0, 1023, alto-20, 10));
println(tiempo1+" "+tiempo2+" "+valor);
stroke(0);
fill(0);
rect(ancho-45, 0, 50, 10);
stroke(0, 255, 0);
fill(255);
text(map(valor, alto-20, 10, 0, 5), ancho-45, 10);
text("v", ancho-10, 10);
if(tiempo1 != nulo)
{
if((x+((tiempo1-tiempo2)*ancho/20000))>25)
{
line(x, valor1, x+((tiempo1-tiempo2)*ancho/20000), valor);
x+=((tiempo1-tiempo2)*ancho/20000);
valor1 = valor;
tiempo2=tiempo1;
//x++;
valor=0;
if((x==ancho-10)||(x>ancho-10))
{
dibujo();
x=25;
}
}
}
else
{
println("error tiempo");
}
}
if(mousePressed && ((millis()-tiempo)>300))
{
tiempo = millis();
println(botonpresionado(mouseX,mouseY, 720, 50, "botón"));
}
}
void dibujo()
{
int div = 11, ini = 20;
clear();
background(0);
stroke(127, 34, 255);
line(25, 10, 25, alto-20);
line(25, alto-20, ancho-15, alto-20);
for(int i = 0; i<div; i++)
{
line(ini, ((alto-30)/(div-1))*i+10, ini+10, ((alto-30)/(div-1))*i+10);
text(5-i/2.0+"v", 0, ((alto-30)/(div-1))*i+15);
line(((ancho-35)/(div-1))*i+25, alto-15, ((ancho-35)/(div-1))*i+25, alto-25);
text(/*nf((ancho-30)/(div-1)*0.03*i, 1, 2)*/(i*2)+"s", ((ancho-35)/(div-1))*i+15, alto-0);
}
boton(720,50,"botón");
}
void boton(int x, int y, String texto)
{
stroke(0);
fill(50);
rect(x,y,90, 30);
fill(230);
rect(x+3,y+3,84, 24);
fill(0);
textSize(15);
text(texto,x+5,y+20);
}
boolean botonpresionado(int mx, int my, int x, int y, String texto)
{
if (((mx>=x && mx<=x+90) && (my>=y && my<=y+30)))
{
return true;
}
else
{
return false;
}
}
Este programa nos va a crear la siguiente ventana (una vez que presionemos el botón de "play" que se encuentra en la esquina superior derecha):como se puede ver tenemos la gráfica de la señal que lee el arduino y por otro lado tenemos un botón que si se explora un poco el lenguaje se podría hacer que haga cosas interesantes como un zoom o que cambie las escalas (bastante sencillo de implementar). Vale aclarar que este programa no funciona si no detecta un arduino conectado en el puerto usb de la computadora.
Para el arduino (en este caso un arduino leonardo) el programa es el siguiente:
void setup() { Serial.begin(115200); } void loop() {
Serial.print(millis()); Serial.print(' '); Serial.println(analogRead(A0));
delay(50);
}
Estos programas se pueden editar rápidamente para obtener mejores resultados. Como nota, para un mejor muestreo de la gráfica, el tiempo se manda desde el arduino junto con el valor equivalente al de la tensión.
Por último pido disculpas si las instrucciones invaden otro campo, pero cambiarlo significaría que no se podría copiar el código y pegarlo en donde queramos porque habría saltos de línea por todos lados.
Hola, intenté modificar el codigo para que el mismo pudiera poner cada dato en su respectivo tiempo, pero no lo hace processing. Yo no envio datos del timer con la funcion millis, sino que directamente envio 2 datos que requiero graficar
ResponderBorrarHola, el tiempo se manda para poder sincronizar el programa de processing con el arduino. Si querés mandar dos datos para que se grafiquen (me imagino que es uno en función del otro, es decir una coordenada de "X" y otra de "Y") vas a tener que modificar algunas cosas del programa de processing, sobre todo porque el eje "X" está preparado para tener valores muy grandes (ya que lo que envía el arduino es un valor que ronda las cuatro cifras como mínimo). Básicamente tendrías que hacer que el programa de processing reciba datos y hacer que esos datos sean coordenadas.
ResponderBorrarSaludos!