Envia tweets con Arduino, usando ThingTweet

Este tema lo vimos antes en un artículo anterior con un servidor propio, ahora usaremos una aplicación de un tercero para enviar los tweets, de modo similar a lo que vimos aquí usando el DigiX

En efecto la empresa ThingSpeak te proporciona  la aplicación ThingTweet para poder enviar tuits, específicamente, ThingTweet es un  proxy que permite a nuestro Arduino enviar actualizaciones de status hacia Twitter usando una llamada a la API de ThingTweet.

 

 

Mas detalles tras el salto

Requisitos

  • Arduino Uno
  • Ethernet Shield
  • Acceso a Internet
  • Cable de Red
  • Red Local con DHCP
  • Cable USB B para Arduino

Procedimiento

Por el lado del hardware es muy simple, hay que conectar el Arduino Uno con el Ethernet Shield y el cable USB para cargar el sketch, hay que conectar el cable de red al Ethernet shield y al router de la red local.

En relación al software hay que ir al sitio www.thingspeak.com crear una cuenta y cuando ingreses vas a la sección de apps y elijes la aplicación Thingtweets,


esto te llevará a la página de Twitter donde ingresas tu user y password para dar el permiso a la aplicación de enviar twits por esta cuenta, vas a obtener una clave de API que te permite enviar el tweet y la usaremos en el sketch de ejemplo que mostramos a continuación

El sketch de ejemplo tomamos directo de GitHub

/*

*/

#include <SPI.h>
#include <Ethernet.h> 

// Local Network Settings
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x03, 0x09 }; // Must be unique on local network

// ThingSpeak Settings
char thingSpeakAddress[] = "api.thingspeak.com";
String thingtweetAPIKey = "aaaKRCDWA1DAAG19";

// Variable Setup
long lastConnectionTime = 0; 
boolean lastConnected = false;
int failedCounter = 0;

// Initialize Arduino Ethernet Client
EthernetClient client;

void setup()
{
  // Start Serial for debugging on the Serial Monitor
  Serial.begin(9600);

  // Start Ethernet on Arduino
  startEthernet();

  delay(1000);

  // Update Twitter via ThingTweet
  updateTwitterStatus("Probando twitter desde Arduino @thingspeak");
}

void loop()
{  
  // Print Update Response to Serial Monitor
  if (client.available())
  {
    char c = client.read();
    Serial.print(c);
  }

  // Disconnect from ThingSpeak
  if (!client.connected() && lastConnected)
  {
    Serial.println("...disconnected");
    Serial.println();

    client.stop();
  }

  // Check if Arduino Ethernet needs to be restarted
  if (failedCounter > 3 ) {startEthernet();}

  lastConnected = client.connected();
}

void updateTwitterStatus(String tsData)
{
  if (client.connect(thingSpeakAddress, 80))
  { 
    // Create HTTP POST Data
    tsData = "api_key="+thingtweetAPIKey+"&status="+tsData;

    client.print("POST /apps/thingtweet/1/statuses/update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(tsData.length());
    client.print("\n\n");

    client.print(tsData);

    lastConnectionTime = millis();

    if (client.connected())
    {
      Serial.println("Connecting to ThingSpeak...");
      Serial.println();

      failedCounter = 0;
    }
    else
    {
      failedCounter++;

      Serial.println("Connection to ThingSpeak failed ("+String(failedCounter, DEC)+")");   
      Serial.println();
    }

  }
  else
  {
    failedCounter++;

    Serial.println("Connection to ThingSpeak Failed ("+String(failedCounter, DEC)+")");   
    Serial.println();

    lastConnectionTime = millis(); 
  }
}

void startEthernet()
{

  client.stop();

  Serial.println("Connecting Arduino to network...");
  Serial.println();  

  delay(1000);

  // Connect to network amd obtain an IP address using DHCP
  if (Ethernet.begin(mac) == 0)
  {
    Serial.println("DHCP Failed, reset Arduino to try again");
    Serial.println();
  }
  else
  {
    Serial.println("Arduino connected to network using DHCP");
    Serial.println();
  }

  delay(1000);
}

Una vez que cargamos el sketch anterior, vamos a la consola serial (Tools -> Serial Monitor) y esta es la salida

Salida en puerta serial, al enviar un tweet
Salida en puerta serial, al enviar un tweet

Con esto podemos enviar un tuit desde el arduino, esto es solo un primer ejemplo.

Si tienes alguna duda o idea para compartir no olvides que puedes usar el formulario al final de este post

 

 

 

Author: Manuel Carrasco

Ingeniero Eléctrico, Institutano, instructor certificado Cisco, en twitter @mcarrasco con comentarios y opiniones personales.

9 thoughts

  1. Hola Manuel y amigos de intenet de las cosas…

    Me dirijo a ustedes nuevamente, por favor en esta ocacion deseo que me ayuden con lo siguiente: buscando skecth de Arduino y Thingpeak logre hacer exactamente lo que quiero, pero tengo un solo detalle y ya he leído un montos de paginas y no se me ocurre como darle una solución. Hice el siguiente programa basado en este: http://community.thingspeak.com/tutorials/arduino/update-thingspeak-channels-and-twitter-with-arduino-ethernet/ lo tuve que modificar ya que esta pensado en un IDE antiguo de Arduino. como te contaba logre hacer exactamente lo que sale ahí con el siguiente Skecth.

    #include

    #define DHTPIN 2 // Conectamos a la entrada del Pin Digital 2
    #define DHTTYPE DHT11 // El tipo de sensor que estamos ocupando
    DHT dht(DHTPIN, DHTTYPE);

    #include
    #include
    // Local Network Settings
    byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; // Must be unique on local network

    // ThingSpeak Settings
    char thingSpeakAddress[] = «api.thingspeak.com»;
    String writeAPIKey = «XXXXXXXXXXX»; // Write API Key for a ThingSpeak Channel
    String thingtweetAPIKey = «XXXXXXXXXXX»; // Write API Key for a ThingSpeak Channel
    const int updateThingSpeakInterval = 5000; // Time interval in milliseconds to update ThingSpeak (5000 =5 seconds)
    const long updateTwitterInterval = 61000; // Time interval in milliseconds to update Twitter (3600000 = 1 hour)

    // Variable Setup
    long lastConnectionTime = 0;
    long lastTweetTime = 0;
    boolean lastConnected = false;
    int failedCounter = 0;

    // Initialize Arduino Ethernet Client
    EthernetClient client;

    void setup(){
    dht.begin();
    {
    // Start Serial for debugging on the Serial Monitor
    Serial.begin(9600);
    // Start Ethernet on Arduino
    startEthernet();
    }
    }

    void loop()

    {

    int h = dht.readHumidity();
    int t = dht.readTemperature();

    // Print Update Response to Serial Monitor
    if (client.available())
    {
    char c = client.read();
    Serial.print(c);
    }
    // Disconnect from ThingSpeak
    if (!client.connected() && lastConnected)
    {
    Serial.println(«…disconnected»);
    Serial.println();
    client.stop();
    }

    // Update

    if(!client.connected() && (millis() – lastConnectionTime > updateThingSpeakInterval))
    {
    updateThingSpeak(«field1=»+(String(t))+»&field2=»+(String(h)));
    }

    // Update Twitter Status via ThingTweet
    if(!client.connected() && (millis() – lastTweetTime > updateTwitterInterval))
    {
    updateTwitterStatus(«La Temperatura en mi shack es: «+(String(t) + «°C, » + String(h) + » Humedad.@thingspeak CE2R «));
    }

    // Check if Arduino Ethernet needs to be restarted
    if (failedCounter > 3 ) {startEthernet();}
    lastConnected = client.connected();
    }

    void updateThingSpeak(String tsData)
    {
    if (client.connect(thingSpeakAddress, 80))
    {
    client.print(«POST /update HTTP/1.1\n»);
    client.print(«Host: api.thingspeak.com\n»);
    client.print(«Connection: close\n»);
    client.print(«X-THINGSPEAKAPIKEY: «+writeAPIKey+»\n»);
    client.print(«Content-Type: application/x-www-form-urlencoded\n»);
    client.print(«Content-Length: «);
    client.print(tsData.length());
    client.print(«\n\n»);

    client.print(tsData);

    lastConnectionTime = millis();

    if (client.connected())
    {
    Serial.println(«Connecting to ThingSpeak…»);
    Serial.println();
    failedCounter = 0;
    }
    else
    {
    failedCounter++;
    Serial.println(«Connection to ThingSpeak failed («+String(failedCounter, DEC)+»)»);
    Serial.println();
    }
    }

    else
    {
    failedCounter++;
    Serial.println(«Connection to ThingSpeak Failed («+String(failedCounter, DEC)+»)»);
    Serial.println();
    lastConnectionTime = millis();
    }
    }

    void updateTwitterStatus(String tsData)
    {
    if (client.connect(thingSpeakAddress, 80))
    {
    // Create HTTP POST Data
    tsData = «api_key=»+thingtweetAPIKey+»&status=»+tsData;

    Serial.println(«Connected to ThingTweet…»);
    Serial.println();

    client.print(«POST /apps/thingtweet/1/statuses/update HTTP/1.1\n»);
    client.print(«Host: api.thingspeak.com\n»);
    client.print(«Connection: close\n»);
    client.print(«Content-Type: application/x-www-form-urlencoded\n»);
    client.print(«Content-Length: «);
    client.print(tsData.length());
    client.print(«\n\n»);

    client.print(tsData);

    lastTweetTime = millis();
    }
    }

    void startEthernet()
    {
    client.stop();
    Serial.println(«Connecting Arduino to network…»);
    Serial.println();
    delay(1000);
    // Connect to network amd obtain an IP address using DHCP
    if (Ethernet.begin(mac) == 0)
    {
    Serial.println(«DHCP Failed, reset Arduino to try again»);
    Serial.println();
    }
    else
    {
    Serial.println(«Arduino connected to network using DHCP»);
    Serial.println();
    }
    delay(1000);
    }

    El problema es que en la siguiente linea:

    updateTwitterStatus(«La Temperatura en mi shack es: «+(String(t) + «°C, » + String(h) + » Humedad.@thingspeak CE2REF»));

    Al tratar de colocar el simbolo % de la siguiente manera:

    updateTwitterStatus(«La Temperatura en mi shack es: «+(String(t) + «°C, » + String(h) + » % de Humedad.@thingspeak CE2REF»));

    No me aparece nada…. nada de nada… pero solo en Twitter ya que a thingpeak siguen llegando los datos…. no entiendo que puede esta sucediendo…. esteticamente se ve mucho mejor expresar la humedad en % ….

    Mi cuenta en twitter es @Aficiona2dChile por si le quieres dar un vistazo… les agradeceria una orientacion…

    Muchas Gracias!!!

  2. En el post anterior no se ve esta linea…

    #include
    #include
    // Local Network Settings
    byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; // Must be unique on local network

  3. Yo tengo un problema al publicar los tweets o alertas, lo que pasa es qe tengo un codigo para ello usando la función que publicaste muy parecida, y una para mandar mensajes de texto, pero desde una GSM Shield V2 con modem M10, lo que me gustaria saber si existe algun intervalo de tiempo para mandar los tweets, porque se supone que es instantaneo, pero la conexion no me permite publicar en redes sociales, solo mandar SMS, por ejemplo tengo esto

    enviarsms();
    delay(2000);
    Updatetweet(«Alerta, se ha detectado…..etc»);
    Serial.println(«Alertas publicadas»);

    Teniendo esas instrucciones despues de que se conecta ala red la GSM mediante GPRS
    NO LOGRO PUBLICAR EN TWITTER ESPERO ME AYUDEN GRACIAS

    (Editamos el codigo ya que es mejor usar herramientas como github.com o bitbucket.com)

  4. Ya solucione algo, que twitter no acepta publicaciones repetidas pero quisiera agregarle una etiqueta de tal forma que se pueda actualizar sin problema, ya que ese es el motivo no puedo mantener la alerta publicada con el mismo msj, al menos agregandole una variable no se un numero y se actualice

    1. Angel, veo que ya encontraste el problema, efectivamente no puedes tuitear lo mismo varias veces.
      Nosotros con una Raspberry Pi usamos una funcion que nos entrega la fecha/hora y con eso evitamos que el tuit sea el mismo.
      En Arduino es mas complejo, porque no tiene un reloj de tiempo real, una solucion seria instalar un modulo gps que te entrega la fecha y hora exacta y concatenarlo con el mensaje del tuit, pero aumentara el costo del proyecto. Lo otro es usar la funcion millis() pero eso solo cambiara el tuit, no aportara informacion util al mismo.
      Saludos
      JZ

  5. hola, he buscado como hacer un monitoreo de 2 sensores DHT22 con thingspeak , arduino y ETHERNET SHIELD, hay muchos códigos en Internet pero quiero, que un sensor me mande las señales a canal 1 y el otro sensor me mande las señales a canal 2.
    Alguien me podría ayudar 😀

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *