domingo, 27 de julio de 2014

Publicar en twitter desde Arduino.

Algo que no podemos negar es que cada vez más dispositivos llevan incorporado el Internet of things, es decir, en un futuro no muy lejano, muchos electrodomesticos, televisiones, herramientas... estarán conectadas a internet, bien para obtener información, o bien para transmitirla. La incorporación a nuestro diseño de un elemento capaz de comunicarse por la red es cada vez más sencilla, y si ese diseño incluye una tarjeta Arduino, el diseño se hace todavía más sencillo.
Un proyecto que llevaba tiempo queriendo hacer, pero que todavía no había tenido tiempo de sentarme a estudiarlo, es la publicación en twitter mediante una placa Arduino y una Ethernet Shield. Antes de empezar a informarme sobre el tema, pensaba que seria un proyecto lleno de librerías, referencias, y, en definitiva, problemas, pero si algo tiene la comunidad Arduino, es que si algo puede hacerse sencillo, lo es, y así pasa con esta aplicación.
Lo primero que debemos hacer si queremos hacer un proyecto de este tipo es autorizar a nuestra placa a publicar en twitter por nosotros, y esto es algo que twitter ya tiene pensado por lo que si accedemos a esta página, twitter nos preguntará si queremos permitir a la aplicación Arduino acceder a nuestra cuenta, en caso de que aceptemos, nos devolverá un código bastante largo de números, letras y símbolos. Este código tenemos que guardarlo bien, ya que es la autentificación.
Una vez tenemos nuestro token, lo siguiente que podemos hacer es empezar a teclear el código, pero antes tenemos que añadir una librería a nuestro entorno de Arduino, la libreria twitter.h, que podéis descargar aquí. Una vez descomprimido, lo copiamops en la carpeta libraries/ de nuestro directorio de Arduino, y con esto conseguimos dos cosas, la primera es tener incluida la libreria en todos nuestros proyectos, y la segunda es el acceso a dos nuevos ejemplos marcados como Twitter.
Si miráis esos ejemplos veréis que publicar en twitter es tan fácil como ejecutar la instrucción twitter.post(msg). Esa instrucción, además de publicar en twitter nos devuelve un valor de error si no ha sido posible realizar la comunicación.
Una vez conocido el funcionamiento básico de la librería, he desarrollado un programa que publica en twitter cada 2 horas la temperatura. El twit que publica queda así.
Y a continuación tenéis el código que hay que programar en el Arduino.
Como veis el código es muy sencillo y a partir de aquí podéis publicar en twitter lo que querais, por ejemplo, se me ocurre medir la potencia que está consumiendo tu vivienda y publicarla en twitter para que todos vean lo eficiente que eres.

3 comentarios:

  1. Tío, no me seas así, formatea el float como es debido.
    sprintf(msg, "Hola! La temperatura ahora es de %.1f ºC.", temp);

    Hasta la próxima!

    ResponderEliminar
    Respuestas
    1. La instrucción sprintf() que implementa el IDE de Arduino no permite formatear variables en coma flotante de esa forma, el número sale mal y con un ?, por eso hay que formatearlo de esa forma.
      Un saludo!

      Eliminar
    2. Es curioso, nunca me había fijado.
      En todo caso no es cosa del IDE (el IDE apenas hace nada), sino cosa del compilador (avr-gcc). He estado buscando por ahí, y parece ser que deshabilitan esta funcionalidad por defecto para reducir el tamaño final del programa, pero existe una forma de volverla a añadir (algo tediosa ya que el IDE no permite pasar parámetros al compilador).
      La he encontrado aquí y copio y pego la parte interesante.
      http://forum.arduino.cc/index.php?topic=124809.msg938573#msg938573

      "The trick is finding the correct libc.a file as there is is libc.a for each AVR architecture.
      If you are using linux and Arduino 1.0.1 then the directory you want to go to (for the mega328)
      is {installdir}/hardware/tools/avrlib/avr/lib/avr5
      Note: Prior to Arduino 1.0.1, the Linux IDE did not ship with a compiler and librarys.
      So if not using Arduino 1.0.1, then you have to locate the avr5 library down in the local system.
      (This can be different places depending on which release of the tools and which repo you are using)

      Once you get down into the avr5 directory:
      Make a copy of the original libc.a
      cp libc.a libc.a.orig

      You extract & remove the std vfprintf() with:
      ar -dv libc.a vfprintf_std.o

      You extract the floating point vfprintf() with:
      ar -xv libprintf_flt.a vfprintf_flt.o

      You put the floating point vfprintf() into libc.a with:
      ar -rv libc.a vfprintf_flt.o

      After that, you you now have floating point xxprintf() support
      for the m168/m328, 32u4, and m644 processors by default.

      For the Arduino Megas, you will have to modify the libc.a in
      avr51 and avr6"

      He visto también que hay gente que recurre a hacerse funciones del tipo "str2f()".

      Saludos!

      Eliminar