A Lonate Pozzolo l’Ecoalbero si illumina con i tweet inviati dalla rete con parole di speranza e buon auspicio.

Dopo le piante che twittano se hanno sete, Arduino è ancora al centro di un progetto molto particolare. Il Gruppo Utenti Linux Lonate Pozzolo – con l’aiuto di moltissimi volontari e sponsor tra cui Futura Elettronica –  ha infatti deciso di regalare al proprio comune un Natale del tutto speciale realizzando un albero che per le sue caratteristiche riuscisse a lasciare un segno.

Gli elementi che lo caratterizzano sono le 34.626 bottiglie di plastica riciclate, una struttura portante metallica e un cuore con due Arduino Uno che ricevono dal servizio Paraimpu dei comandi per accendere dodici set di luci diverse, ognuno dei quali corrisponde a una parola di buon augurio contenuta nel tweet inviato con l’hashtag “#Ecoalbero”.

Tutto nasce dall’opera di un artista lituano che nel 2011 utilizza proprio delle bottiglie di plastica per realizzare una sua creazione: si tratta di un approccio interessante in quanto le bottiglie hanno colori diversi e si prestano ad una lavorazione tutto sommato semplice. Partendo da quell’idea, il GULLP – assieme ai volontari della Pro Loco di Lonate Pozzolo e grazie al supporto di una serie di attività commerciali presenti nel comune e nei dintorni – sviluppa il progetto di un albero di Natale vero e proprio, alto 12 metri e realizzato con dei rosoni di bottiglie.

Come renderlo però ancora più originale? Rendendolo una finestra sugli umori del cyber mondo che, twittando, può accendere per 10 minuti a tweet una delle 12 luci dell’albero. Le parole che corrispondono a una luce ciascuna sono: Pace, Amore, Serenità, Fratellanza, Tolleranza, Gioia, Speranza, Solidarietà, Felicità, Peace, Love, Brotherhood. Basta quindi che un utente invii un tweet contenente oltre a “#Ecoalbero” una delle dodici parole elencate sopra e si accenderà l’Ecoalbero.

Il risultato, apparentemente complicato, è stato ottenuto combinando le funzionalità del servizio Paraimpu – che permette di intercettare dai tweet l’hashtag “#Ecoalbero” estraendo poi le parole chiave – con due schede Arduino a cui sono state aggiunte sia gli shield Ethernet, sia gli shield a sei porte di I/O prodotte da Futura Elettronica. Un approccio semplice e poco costoso che il GULLP ha scelto dopo aver valutato diverse opzioni e che, anche grazie al supporto dei partner locali, si è focalizzato su Arduino.

Lo schema logico del progetto è quindi il seguente:

I due Arduino si interfacciano alla Rete tramite un router Wireless che, a sua volta, accede a Internet tramite un collegamento wifi appositamente predisposto. Ciascun Arduino gestisce una metà delle parole chiave e la configurazione su Paraimpu riflette questa situazione. Le uscite a relè degli shield sono utilizzate per pilotare degli ulteriori relè in quanto le lampade sono alimentate a 220V e questo valore non è gestibile direttamente dagli shield. Il cablaggio, come si vede nell’immagine, è solo ripetitivo, ma non particolarmente complesso.

Di fronte alle quasi 35 mila bottiglie lavorate e fissate con 120 mila fascette di nylon, con oltre 1300 ore uomo di lavoro dei volontari, la parte di sviluppo del codice che si interfaccia con Internet e Paraimpu sembra poca cosa, eppure ha determinato il successo dell’iniziativa.

Rispetto ad altre realizzazioni, come il classico shield GSM a cui inviare via SMS dei comandi per accendere un led o cambiarne il colore, questa soluzione basata sui tweet permette di esprimere un pensiero compiuto che contemporaneamente determina un risultato visuale, magari a centinaia di chilometri di distanza dal punto di invio.
Oltre che tramite tweeter, è possibile accendere le luci direttamente dal web attivando uno dei dodici pulsanti con le relative parole:

Per dare la possibilità di avere un feedback, ovvero di vedere le luci accendersi alla pressione del tasto o dopo l’invio del tweet, al sistema è stata aggiunta una webcam (il modello CP391 di Futura Elettronica).

Sempre sul sito di eco albero si trova una galleria con le immagini relative al lungo e faticoso processo di assemblaggio dell’albero: decisamente più impegnativo di quanto si possa immaginare, ma che ha ripagato tutti i partecipanti all’iniziativa con la risonanza mediatica e il gradimento espressi dalla cittadinanza (di Lonate Pozzolo e della Rete).

C’è a questo punto da augurarsi che non faccia la fine di tutte le decorazioni natalizie e che possa mantenere un ruolo nell’arredo urbano cittadino, continuando a lanciare raggi di luce ogni volta che qualcuno vorrà esprimere un pensiero positivo tramite twitter e l’Ecoalbero.

Infine, ecco lo sketch utilizzato nel sistema per controllare le luci tramite Arduino (scarica):

/***************************************************************************/
/*                                                                         */
/*  This sketch sets 8 digital and all 6 analogic outputs of the Arduino   */
/*  board according to the inputs read by actuator instance on Paraimpu.   */
/*  v1 - December 2011                                                     */
/*                                                                         */
/*  http://paraimpu.crs4.it                                                */
/*                                                                         */
/*  This sketch is released under GPL v3. For more details, please read    */
/*  http://www.gnu.org/licenses/gpl-3.0.txt                                */
/***************************************************************************/

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

// MAC Address of your Arduino Ethernet shield
byte mac[6] = { 0x90, 0xA2, 0xDA, 0x0D, 0x08, 0x5F };

IPAddress ip( 192, 168, 1, 51);

IPAddress server( 156, 148, 18, 164 );
EthernetClient client;
int p;
int i;
String data = String();
char c;
boolean take;
int waiting;
int n;
int v;
int digits;
int jump;

void setup() {
  for(i = 2; i < 10; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  for(i = 14; i < 20; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  //Serial.begin(9600);
  	Ethernet.begin(mac, ip);
  delay(1000);
}

void loop() {
  if (client.connect(server, 80)) {
    client.println("GET /use?token=[Your TOKEN] HTTP/1.1");
    client.println("Host: paraimpu.crs4.it");
    client.println();
    data = String();
    take = false;
    //Serial.println("           ");
    //Serial.println("reading ...");
    waiting = 0;
    while (!client.available() && waiting < 500){
        delay(10);
        waiting++;
    }
    while (client.available()){
        c = client.read();
        if (c == '}'){
            run();
            break;
        }
        else if(c == '{'){
          take = true;
        }
        else if(c == '\\' || c == ' '){}
        else {
          if (take){
              data.concat(String(c));
          }
        }
     }
  }
  client.stop();
  delay(1000);
}

void run(){
  if(data.charAt(2) == 'X' ){ //all data
    writeAll(data.charAt(7));
    data = "";
  }
  else {
    p = 0;
    n = 0;
    v = 0;
    digits = 0;
    jump = 0;
    while (p < data.length()){
      if (data.charAt(p + 1) == 'A'){
        n = int(data.charAt(p + 2)) - 48;
        n = n + 14;
        jump = 9;
        if (data.charAt(p + 6) == 'L'){
          digitalWrite(n, LOW);
        }
        else {
          digitalWrite(n, HIGH);
        }
      }
      else {
        n = (int(data.charAt(p + 2)) - 48) * 10;
        n = n + int(data.charAt(p + 3)) - 48;
        if (data.charAt(p + 7) == 'L'){
          digitalWrite(n, LOW);
          jump = 10;
        }
        else if (data.charAt(p + 7) == 'H'){
          digitalWrite(n, HIGH);
          jump = 10;
        }
        else {
          v = 0;
          if (isDigit(data.charAt(p + 8))){
            v = int(data.charAt(p + 8)) - 48 + (int(data.charAt(p + 7)) - 48) * 10 + (int(data.charAt(p + 6)) - 48) * 100;
            jump = 10;
          }
          else if (isDigit(data.charAt(p + 7))){
            v = int(data.charAt(p + 7)) - 48 + (int(data.charAt(p + 6)) - 48) * 10;
            jump = 9;
          }
          else {
            v = int(data.charAt(p + 6)) - 48;
            jump = 8;
          }
          analogWrite(n, v);
        }
      }
      p = p + jump;
    }
    data = "";
  }
}

void writeAll(char out) {
  if(out == 'L'){
    for(i = 2; i < 10; i++){
      digitalWrite(i, LOW);
    }
    for(i = 14; i < 20; i++){
      digitalWrite(i, LOW);
    }
  }
  else{
    for(i = 2; i < 10; i++){
      digitalWrite(i, HIGH);
    }
    for(i = 14; i < 20; i++){
      digitalWrite(i, HIGH);
    }
  }
}

boolean isDigit(char ch){
  if(ch >= 48 && ch <= 75){
    return true;
  }
  return false;
}

Visita il sito: www.ecoalbero.it/