In libreria a Torino vidi un paio di libri sull’Arduino e così decisi di leggere qualche pagina.

Trovai un articolo interessante che trattava di Arduino in coppia con Twitter, dissi subito <<Una cosa fantastica!>>.
Così da ieri ho cominciato a questo progettino cercando di collegare il mio Arduino (con la relativa Ethernet Shield), tramite la libreria Twitter.h (http://arduino.cc/playground/Code/TwitterLibrary), a Twitter.

Ho incontrato qualche difficoltà. In realtà solo due.

La prima riguardava il fatto che la funzione post, che si occupa di inviare il messaggio, accetta come parametro NON una stringa ma array di caratteri:

bool post(const char *message)

Scrivere un messaggio statico è facile, bastava:

char msg[] = "Messaggio";

Ma se voglio inserire una variabile?
Così ho fatto qualche ricerca su internet e ho trovato una libreria chiamata PString.h (http://arduiniana.org/libraries/pstring/) che si occupa di “convertire” una stringa in un array di caratteri.

 

Il secondo problema era la configurazione dell’Ethernet Shield che non voleva acquisire l’indirizzo ip (nè da DHCP nè direttamente) il che mi sembrava strano dato che altre volte avevo utilizzato la shield senza mai riscontrare tale problema.

Così anche per questo ho fatto qualche ricerca su internet che però sembrava non portasse a nessun risultato, quando ho letto per caso scorrendo su un forum che inserire la microSD nel suo slot sulla shield potrebbe portare qualche problema, sembra strano, ma è così: una volta rimossa la shield ha acquisito l’indirizzo ip tramite DHCP e il codice ha cominciato a funzionare.

 

Per poter utilizzare la libreria è necessario autorizzare un applicazione ad accedere al proprio account twitter per inviare appunto i tweet. E’ spiegato su questo sito: http://arduino-tweet.appspot.com/.

Questa applicazione potrà:

  • Leggere i Tweet dalla tua cronologia.
  • Vedere chi segui, e seguire nuove persone.
  • Aggiornare il tuo profilo.
  • Pubblicare Tweet per te.

Questa applicazione non potrà:

  • Accedere ai tuoi messaggi diretti.
  • Vedere la tua password Twitter.
Una volta autorizzata l’applicazione si riceverà un codice da inserire nello sketch, questo codice serve, detto in maniera rozza, ad identificare il proprio Arduino nel proprio account.

Twitter twitter("Qui il token");
 
Io ho creato un account fatto solo per il mio Arduino e ricevo i messaggi tramite DM (messaggi diretti) in modo che sia solo io a leggere ciò che il mio Arduino “dice”.

 

Il principale utilizzo è dato dal fatto che twitter offre il servizio sms tramite il quale si possono ricevere sul cellulare notifiche di tweet, messaggi diretti e risposte in maniera del tutto gratuita!
Per attivare questo servizio basta andare sulle impostazioni del proprio account twitter e cliccare sulla voce “Mobile”.

 

Ed ecco il codice sorgente:

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

// Ethernet Shield Settings
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x0D, 0x06, 0x5A };

IPAddress ip(192,168,0,25);
IPAddress gateway(192,168,0, 1);
IPAddress subnet(255, 255, 255,0);

// Your Token to Tweet (get it from http://arduino-tweet.appspot.com/)
Twitter twitter("Qui il Token");

int pin = 2;

//Buffer used for tweets, tweets can't be more than 140 characters
char msg[140] = {0};

void setup()
{
  delay(1000);
  Serial.begin(9600);

  Serial.println("Attempting to get an IP address using DHCP:");
  if (!Ethernet.begin(mac)) {
    Serial.println("failed to get an IP address using DHCP, trying manually");
        Ethernet.begin(mac, ip, gateway, subnet);
  }
  Serial.print("My address:");
  Serial.println(Ethernet.localIP());

  pinMode(2, INPUT);
  digitalWrite(2, HIGH);

}

void loop()
{
  if(digitalRead(2) == LOW){ 
    delay(1000);

        PString mystring(msg, sizeof(msg));
        mystring.print("DM Xfox1 Numero random: ");
        mystring.print(random(0,100));

    Serial.println("connecting ...");

    Serial.println(msg);

    if (twitter.post(msg)) {

      // Specify &Serial to output received response to Serial.
      // If no output is required, you can just omit the argument, e.g.
      // int status = twitter.wait();
      int status = twitter.wait(&Serial);
      if (status == 200) {
        Serial.println("OK.");
      } 
      else {
        Serial.print("failed : code ");
        Serial.println(status);
      }
    } 
    else {
      Serial.println("connection failed.");
    }

  }
}

In sostanza, questo codice, mi invia un messaggio privato (DM Xfox1) con un numero random tra 0 e 100 (dopo aver portato a livello logico alto il piedino due alla quale è collegato un pulsante con resistenza di pullup).

Si può notare che

 mystring.print("DM Xfox1 Numero random: ");
 mystring.print(random(0,100));

Non fa altro che concatenare la stringa con la variabile e riportarle sull’array di caratteri dichiarato per il messaggio.

 

Un’ultima cosa. L’applicazione consiglia di non inviare tweet a distanza minore di 1 minuto poichè questo potrebbe sovraccaricare il server. Ho testato io stesso e se invio messaggi molto rapidi i tweet li invia però i messaggi al cellulare non mi arrivano, o per essere più specifici, mi arriva solo il primo.

Arduino e Twitter
Tags:                                     
  • Arduino_gab

    sei troppo giusto. Grazie!

    • Arduino_gab

      In questa maniera ho risolto un problema micidiale: far tweettare ad Arduino il suo indirizzo IP acquisito in DHCP. Messo nel “void setup” esegue il comando ogni volta che si riavvia (salta la corrente, lo staccano…) e mi manda i suoi nuovi riferimenti di rete. Senza questa tua dritta fondamentale, come notavi, non era possibile far tweettare un contenuto che non fosse un testo tra “”.
      Davvero utilissimo!

      • Xfox1

        Sono felice di averti potuto aiutare!

        A presto.