Contador de Likes en Facebook, Arduino Yún para dummies

Linux + Arduino Leonardo + Conexión Ethernet + WIFI + SD = YÚN

El Yún es una de las mejores placas disponibles en el catálogo de Arduino, su versatilidad es realmente increíble, fusiona dos tecnologías totalmente diferentes, un Arduino Leonardo y un sistema en Linux, de una forma trasparente al usuario, que puede elegir lo mejor de ambos mundos en una sola placa,  si a todo esto le añades una excelente conexión a internet integrada, mediante WIFI o con cable y una lectora de tarjetas micro SD, obtienes esta maravilla de placa que de un plumazo soluciona todos los problemas que nos encontramos en los proyectos profesionales.

Yún dos micros en una sola placa.
Yún dos micros en una sola placa.
Acceso a estadísticas en tiempo real y cónsola del Yún
Acceso a estadísticas en tiempo real y cónsola del Yún

La mejor forma de conocerlo es probarlo, para eso hemos desarrollado este proyecto, un contador de Likes de tu página en Facebook, que consulta el número de Likes mediante un script en Python  y lo imprime,  junto con la hora, en un Display de 2×16 y cuando hay nuevos likes, hace sonar un beep.

Material necesario

Las conexiones son muy fáciles, solamente es necesario conectar los cuatro cables del Display I2C al Yún

  • DAT (SDA) Pin digital 2
  • CLK (SCL) Pin Digital 3
  • 5V
  • GND

El Buzzer (es optativo) se conecta el negativo a GND  y el positivo al Pin 12 de nuestro Yún

Conexiones del proyecto
Conexiones del proyecto
Contador de Likes en Facebook con Arduino Yún
Contador de Likes en Facebook con Arduino Yún funcionando.

El Arduino Yún se alimenta mediante el conector USB con 5V, si piensas utilizar directamente la entrada VIN de la placa para alimentar el proyecto, es MUY importante que tengas en cuenta que a diferencia con otros modelos, es necesario utilizar una fuente regulada de 5V,  si utilizas un voltaje superior, estropearás tu placa inmediatamente.

Code

En este código utilizamos varias funciones de Linux desde el Yún, al arrancar la placa, después de conseguir la conexión a internet, lo primero que hace es copiar el código python a un fichero y volverlo ejecutable, este código se encarga de leer la página de datos de una página en Facebook, convertirla en  datos Json e imprimir el número de Likes, este es el valor que recibirá la parte Arduino del Yún.

También ejecuta otro proceso linux (sh) que lee la hora del sistema y la presenta en pantalla.

El resto del código es muy fácil de entender, cada 30 segundos comprueba el número de Likes, si es diferente al último leído lo imprime y emite un pitido.

También hemos añadido un carácter al display con forma de corazón que se enciende y apaga cada segundo.

/*
 Facebook Likes counter 
 www.openhardware.pe
 Gets the time from the linino processor via Bridge
 then parses out hours, minutes and seconds for the Arduino
 using an Arduino Yun. 

 created  27 Jan 2014
 Basado en el codigo de los ejemplos de Arduino By Tom Igoe 

 This example code is in the public domain.
 */

#include <Process.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <FileIO.h>

uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; // Heart char

Process date;                 // process used to get the date
int hours, minutes, seconds;  // for the results
int lastSecond = -1;          // need an impossible value for comparison
int lastLikes = -1;          // need an impossible value for comparison
int likes = 0;
bool heartStatus = false ;
LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

void setup() {
  pinMode(12,OUTPUT); // beep 
  pinMode(13,OUTPUT);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  Bridge.begin();        // initialize Bridge
  Serial.begin(9600);    // initialize serial  

  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  lcd.createChar(0, heart);
  lcd.home();
  lcd.print("openhardware.pe");
  lcd.setCursor(0, 1);
  FileSystem.begin();
  uploadScript();  // Upload the python script to LINIO 
  // run an initial date process. Should return:
  // hh:mm:ss :
  if (!date.running())  {
    date.begin("date");
    date.addParameter("+%T");
    date.run();
  }
  digitalWrite(13, LOW);
}

void loop() {
  if(lastSecond != seconds) {  // if a second has passed
    lcd.setCursor(0, 1);
    // print the time:
    if (hours <= 9) lcd.print("0");    // adjust for 0-9
    lcd.print(hours);    
    lcd.print(":");
    if (minutes <= 9) lcd.print("0");  // adjust for 0-9
    lcd.print(minutes);
    lcd.print(":");
    if (seconds <= 9) lcd.print("0");  // adjust for 0-9
    lcd.print(seconds);

    // on/off Heart symbol
    lcd.print(" ");
    if (heartStatus)
      lcd.write(byte(0));
    else
      lcd.print(" ");

    heartStatus = !heartStatus;

    // restart the date process:
    if (!date.running())  {
      date.begin("date");
      date.addParameter("+%T");
      date.run();
    }

   if ((seconds % 30) == 0) {  // check every 30 secs modify to change the interval   
     likes = runScript(); // run the python script
     lcd.print(likes);
     if (lastLikes != likes ) {
       // Cambia el numero de likes
       lastLikes = likes;
       // codigo a ejecutar
       // En este caso produce un pitido con un buzzer
       digitalWrite(12, HIGH);
       delay(75);
       digitalWrite(12, LOW);

     }
   }
  }

  //if there's a result from the date process, parse it:
  while (date.available()>0) {
    // get the result of the date process (should be hh:mm:ss):
    String timeString = date.readString();    

    // find the colons:
    int firstColon = timeString.indexOf(":");
    int secondColon= timeString.lastIndexOf(":");

    // get the substrings for hour, minute second:
    String hourString = timeString.substring(0, firstColon); 
    String minString = timeString.substring(firstColon+1, secondColon);
    String secString = timeString.substring(secondColon+1);

    // convert to ints,saving the previous second:
    hours = hourString.toInt();
    minutes = minString.toInt();
    lastSecond = seconds;          // save to do a time comparison
    seconds = secString.toInt();
  } 

}
void uploadScript() {
  // Write our shell script in /tmp
  // Using /tmp stores the script in RAM this way we can preserve 
  // the limited amount of FLASH erase/write cycles
  File script = FileSystem.open("/tmp/likes.py", FILE_WRITE);
  // Shell script
  script.print("#!/usr/bin/python\n");
  // import libs
  script.print("import urllib2,json \n");
  // read the Facebook data page 
  script.print("data = urllib2.urlopen('http://graph.facebook.com/open.hardware.labs/').read() \n");
  // convert to Json
  script.print("json_data = json.loads(data)\n");
  // print the likes value
  script.print("print ('%s') % (json_data['likes'])\n");
  script.close();  // close the file

  // Make the script executable
  Process chmod;
  chmod.begin("chmod");      // chmod: change mode
  chmod.addParameter("+x");  // x stays for executable
  chmod.addParameter("/tmp/likes.py");  // path to the file to make it executable
  chmod.run();
}

// this function run the script and read the output data
int runScript() {
  // Run the script and return the results
  Process myscript;
  myscript.begin("/tmp/likes.py");
  myscript.run();

  String output = "";
  // read the output of the script
  while (myscript.available()) {
    output += (char)myscript.read();
  }
  // remove the blank spaces at the beginning and the ending of the string
  output.trim();
  return output.toInt() ;
}

En este enlace puedes descargar el código completo.
Descarga el código

Información adicional sobre Yún

8 comentarios sobre “Contador de Likes en Facebook, Arduino Yún para dummies”

    1. José, no se puede con otros modelos, el Arduino YUN tiene una configuración muy diferente al resto, incluye un módulo en Linux que es la parte que se utiliza para acceder a internet y procesar los datos mediante un programa en Python.

      1. Creo que de poder se debe poder sólo requieres conocimientos de programación para emular las llamadas rest al api de facebook. Yo he integrado Arduino Uno con Web Services sin problema. Lo que si el YUN te da una ventaja de tener librerias listas y hacen que el tiempo de habilitación de estos programas sean muy rápidos.

        César

    1. Hay varias librerías diferentes, son en función de la interface de Display que utilices.
      Asegúrate que el puerto de I2C que has seleccionado en el setup es el correcto.
      Esta es la cabecera de las últimas que estamos usando:
      //www.DFRobot.com
      //last updated on 21/12/2011
      //Tim Starling Fix the reset bug (Thanks Tim)
      //wiki doc http://www.dfrobot.com/wiki/index.php?title=I2C/TWI_LCD1602_Module_(SKU:_DFR0063)
      //Support Forum: http://www.dfrobot.com/forum/
      //Compatible with the Arduino IDE 1.0
      //Library version:1.1

      Teniendo en cuenta esta configuración:
      LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x20 or (0x27) for a 16 chars and 2 line display

    1. Hola Giovanni, por desgracia Facebook cambio los métodos y privilegios de acceso para consultar los datos y el código ya no funciona.
      Estamos trabajando una nueva versión, en cuanto esté disponible la publicaremos.

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.