Arduino+Java: Ejemplo de LED Blink con Java Threads

12
364

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.

Sin título

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.

Sin títuloReemplazamos 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.

Sin título

Recuerden implementar la interfaz Runnable que es esencial para el uso de los Hilos.

Sin título

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:

 

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.

Sin título

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.

 

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.

  • adesmiro

    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

  • Hugo Martínez

    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();
    }

  • Carlos Andres Castaño

    no me parpadea el led alguna idea??

    • Java te arroja algún tipo de error?

      • Carlos Andres Castaño

        no simplemente cargo el programa y al dar click en encender no pasa nada

      • Carlos Andres Castaño

        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

      • Carlos Andres Castaño

        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í.

      • Carlos Andres Castaño

        ok gracias