Con esta unin se pueden dar mil usos, desde mecnicos, electrnicos y por que
no hasta mdicos como fue en mi caso, ver otro de mis blogs donde use este
cirucitor para fines medicos.
paso 1.preparar java para la conexin con arduino llamando libreras y ajustando
directorios de archivos. (visto en el post anterior mismos pasos) ir al post anterios
paso 2.preparar la interfaz en java encargada de recibir los datos que arduino le ara llegar,
para este tutorial yo he preparado un termmetro dibujado en el metodo paint() de
una clase java. quedando asi
Esta interfaz ira representando los valores que arduino le haga llegar.
CDIGO
public void paint(Graphics g)
{
//super.paint(g);//para algunos sistemas windoxs
repaint();
//temp=(redonde((n/.30)));
if ((x-c<=156)&&(x-c>=106))
{
fondo=Color.BLUE;
}
if ((x-c<=106)&&(x-c>=74))
{
fondo=Color.ORANGE;
}
if ((x-c<=74)&&(x-c>=34))
{
fondo=Color.RED;
}
//base
//fuente de todas las letras en el termometro
Font f = new Font( "Helvetica",Font.BOLD,16 );
g.setFont( f );
g.setColor(Color.BLACK);
g.drawArc(90,230,50,50, 130,280);//base arriba
g.drawArc(80,230,70,60, 130,277);//base abajo
g.drawLine(100,80,100,235);
g.drawLine(92,80,92,237);
g.drawLine(132,80,132,235);
g.drawLine(140,80,140,238);
//base
g.drawArc(92,60,48,48,8,180);//tapa de arriba
g.drawArc(100,65,32,32,5,180);//tapa de abajo
//g.drawArc(90,50,50,50, 540,360);
//rellono que simula al mercurio
g.setColor(fondo);
g.fillArc(90,230,50,50, 0,360);
g.fillRect(101,80,31,156);//rellono mercurio
g.setColor(Color.WHITE);
g.fillRect(101,80,31,x-c);//rellono mercurio
//fuentes
g.setColor(Color.white);
g.fillArc(100,65,32,32,5,180);//tapa de abajo
g.drawString((c)+"C", 95,260);
//letras
g.setColor(Color.BLUE);
g.drawString("0 -", 70,240);
g.drawString("20 -", 65,220);
g.setColor(Color.ORANGE);
g.drawString("40 -", 65,200);
g.drawString("60 -",65,180);
g.setColor(Color.RED);
g.drawString("80 -", 65,160);
g.drawString("100 -",55,140);
//g.drawString("120 -", 55,120);
//g.drawString("140 -",55,100);
if(x<=10)
{
g.setColor(Color.RED);
g.fillArc(100,65,32,32,5,180);//tapa de abajo
}
}
Es fcil notar que el termmetro ira adquiriendo otro color mientras la temperatura
vaya aumentando.
paso 3.
hasta ahora solo se ha preparado la interfaz de usuario, entramos a la parte de
la conexin pues prepararemos arduino para mandar los datos a java.
el codigo es muy simple.
void setup()
{
//abrimos el puerto serie a una tasa de bits de 9600 estantar
Serial.begin(9600);
}//fin de setup
void loop()
{
//se prepara los datos para ser enviados
/*primero se lee lo que esta en la entrada analgica 0 luego lo multiplicamos por
500 por que esta siendo alimentado con 5v y hay 500 veces 10 mlv en el. 10ml por
500 = 5v (LM35 usa 10ml para presesentar un 1c)
esta es la explicacin de por que por 500
luego se divide entre 1023.
esto por que es lo mximo que arduino puede leer de la estragada analogica
y por ultimo escribimos en el puerto serie la cantidad que nos quedo. ya en grados
*/
Serial.write((analogRead(0)*500.00)/1023.00);
//le decimos a arduino que lee la entrada analgica cada segundo
delay(1000);
}
cabe aclarar que hay dos formas en las que arduino enva informacion por el
puerto serie son Serial.write ();
y Serial.println();
uno envia el valor real y el otro pinta el resultado sin importarle cual es su valor.
ejemplo si estamos a 61c
el mtodo Serial.write (); mandara una a por que? es simple por que en la tabla
ascii a=61 entonces cuando java reciba esta "a" sabr que es un 61 y lo graficara
en el termmetro.
el metodo Serial.println (); este no le importara su valor real y
simplemente pondr en el puerto serie el 61
entonces cuando java reciba este este 61, tomara el "6" y graficara en
el termmetro el 54, tabla ascci 6 =54
e inmediatamente tomara el "1" y graficara en el termmetro el 49, por la misma
razon 1 en la tabla ascii=49.
por lo que el metodo Serial.println() no es valido para estas practicas.
el codigo sin comentarios queda asi:
paso 4 y ultimo:
recibir los datos de arduino
//importamos las librerias necesarias para la conexion
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.lang.reflect.*;
import java.io.InputStream;
import processing.app.Preferences;
creamos
una variable de tipo Input para que este reciba los datos de arduino asi:
"/dev/ttyUSB8",
"/dev/ttyUSB9",
"/dev/ttyUSB10",
"/dev/ttyUSB11",
"/dev/ttyUSB12","/dev/ttyUSB13","/dev/ttyUSB14","/dev/ttyUSB15","/dev/ttyUSB16",
"/dev/ttyUSB17","/dev/ttyUSB18","/dev/ttyUSB19","/dev/ttyUSB20","/dev/ttyUSB21"
,"COM3","COM0","COM1","COM2","COM4","COM5","COM6","COM7","COM3","
COM8","COM9","COM10","COM11","COM12" // Windows
};
static public class MyPrefs extends Preferences {
static public void init() {
Preferences.init("/home/victor/.arduino/preferences.txt");
//Preferences.init("c:/preferences.txt");
}
}
/** Creates new form Temperatura */
public Temperatura() {
initComponents();
}
public static void temperatura(int t)
{
c=t;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Termometro");
javax.swing.GroupLayout
layout
=
new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 244, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) throws IOException, PortInUseException,
UnsupportedCommOperationException {
}
static public double redonde (double x)
{
return Math.rint(x*1)/1;
}
}
cdigo completos dudas comentarios y/o sugerencias a vctr.31@hotmail.com