En los primeros posts que hice de Arduino, utilizé el ejemplo Blink.
En dicho ejemplo utilizábamos un delay de 1 segundo para provocar un parpadeo. En este post haremos lo mismo, sin embargo no colocaremos el delay en el código Arduino, sino en Java.
Para poder utilizar un delay en Java es necesario implementar los Hilos o Threads, los cuales ya vimos en un post pasado.
Crearemos una interfaz en Java con un botón de encendido y apagado, tal como lo hicimos en el post de Encender un LED desde la PC con Arduino y Java.
Los resultados obtenidos con dicho post los podemos apreciar en el siguiente video:
Ahora usaremos la misma interfaz, con solo algunas variaciones en el código.
El código de los botones lo modificaremos ligeramente. Necesitaremos declarar una variable global del tipo boolean llamada state.
En dicha variable guardaremos el estado del LED, ya sea encendido(parpadeando) o apagado.
Eliminaremos la función enviar datos de los 2 botones que hemos colocado.
Reemplazamos el «EnviarDatos()» por el state, que será true para encendido y false para apagado.
Sin embargo, para poder comunicarnos con Arduino tenemos que utilizar obligatoriamente la función EnviarDatos.
Esta será la función que manejaremos con los Threads. Declaramos una variable tipo Thread a la que llamaremos Hilo y la iniciaremos en el start del programa.
Recuerden implementar la interfaz Runnable que es esencial para el uso de los Hilos.
Esto también implica que se agregue el método public void run() al final del código.
Ahí es donde llamaremos a EnviarDatos().
El código para el método Run es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Thread ct = Thread.currentThread(); while (ct == Hilo) { try { if (state == true) { EnviarDatos("1"); Thread.sleep(1000); EnviarDatos("0"); Thread.sleep(1000); } } catch (InterruptedException ex) { Logger.getLogger(Window.class.getName()).log(Level.SEVERE, null, ex); } } throw new UnsupportedOperationException("Not supported yet."); |
Esto funciona de la siguiente manera:
En la variable ct se guarda el CurrenThread que es el hilo que se esté ejecutando en determinado instante.
Mientras ct sea igual a Hilo que es el thread que declaramos, entonces se ejecutará determinado código.
Si la variable state es igual a true, es decir, LED encendido, entonces se entra en un ciclo en donde se enviará un «1» que es el que enciende el LED, se «dormirá» el hilo durante 1000 milisegundos, que es un segundo, luego se enviará un «0» que apagará el LED. Se espera 1 segundo más y luego se enciende el LED y así sucesivamente.
Si la variable state cambia a falso, el programa no encontrará ningún código que ejecutar y permanecerá sin hacer nada.
Con el comando Thread.sleep(1000) podemos retrasar la ejecución de un hilo la cantidad de tiempo que nosotros decidamos.
En Arduino el código es extremadamente sencillo, el mismo que usamos en el post Comunicación Serial con Arduino: Encender luces desde el teclado de nuestra computadora.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int input; // Variable to store the input received via serial communication void setup() { pinMode(13, OUTPUT); // Set pin 13 as an output pin Serial.begin(9600); // Initialize serial communication at 9600 bits per second } void loop() { if (Serial.available() > 0) { // Check if there's any data available to read from the serial buffer input = Serial.read(); // Read the first byte of incoming serial data if (input == '1') { digitalWrite(13, HIGH); // If the input is '1', turn on the LED connected to pin 13 } else { digitalWrite(13, LOW); // If the input is not '1', turn off the LED } } } |
Cargando este código en Arduino y ejecutando nuestro programa en Netbeans podemos probar si lo que hemos hecho funciona o no.
Como podemos observar en un momento cambié la frecuencia del parpadeo de 1 Hz a 10 Hz modificando el tiempo en el que el thread permanece «dormido».
Espero sus comentarios acerca de este tema. Saludos.
exelente todo pero yo quiero hacerlo desde el entorno web de netbeans y no me funciona ayúdenme.
Lo siento pero no he trabajado nunca con el entorno web así que no tengo experiencia y por lo tanto no le puedo ayudar
Falta añadir estas dos líneas en el método Window()
Hilo = new Thread(this);
Hilo.start();
Así,
public Window() {
initComponents();
ArduinoConnection();
Hilo = new Thread(this);
Hilo.start();
}
Gracias por la observación. Saludos
no me parpadea el led alguna idea??
Java te arroja algún tipo de error?
no simplemente cargo el programa y al dar click en encender no pasa nada
Lo tienes conectado al revés
no mira que pruebo el programa de encender y apagar el led y me funciona a la perfección pero cuando hago los cambios para que parpadee no me funciona, no se porque razon
si pudieses mandarme el programa al correo para compararlo con el mio te lo agradeceria, muchas gracias igual por querer ayudarme.
En la noche publico el source code. Pensé que lo había hecho pero parece ser que no fue así.
ok gracias