Monitorare la temperatura (o qualsiasi altra grandezza) da qualsiasi parte del pianeta e condividere i dati sul cloud di Google Spreadsheet è possibile ed anche abbastanza semplice grazie ad FTPmicro e ad alcune implementazioni allo stack TCP/IP Microchip.
Vi piacerebbe poter monitorare la temperatura delle vostre celle frigorifere o di qualsiasi altro dispositivo sparso per il mondo ed inviare i dati in tempo reale su un documento tipo Foglio di Calcolo? E se poi questo documento fosse online e facilmente accessibile sempre da qualsiasi parte del pianeta? Il tutto è possibile, basta avere una connessione internet, un account Google ed un Picmicro sottomano 🙂
Inviare i dati a Google Documents Spreadsheets con il Picmicro
Per prima cosa si deve entrare su Google Documents (tra poco cambierà in Google Drive) e creare un MODULO (form). Successivamente apparirà una schermata dove è possibile impostare i "titoli delle domande" che non sono altro che le intestazioni delle colonne che organizzeranno i nostri dati.
Nel nostro caso abbiamo inserito Device in Rome e poi Device in Milan.
Dopo aver salvato (in automatico) torniamo nella nostra pagina principale Google Drive (ex Documents) e troviamo il nostro Documento al quale possiamo assegnare un nome, nel nostro esempio Temperature Monitor, poi modifichiamo la prima riga della prima colonna da "Informazioni Cronologiche" a Timestamp che ci fornirà l'orario preciso dell'aggiornamento della cella.
Quindi avremo la nostra prima riga che gestisce 3 colonne:
Timestamp - Device in Rome - Device in Milan
Ovviamente tutti questi nomi sono personalizzabili in base alle vostre esigenze, è anche possibile aumentare il numero di colonne per monitorare un numero maggiore di dispositivi.
Si dovrà poi condividere il documento per renderlo pubblico sia come visibilità che come accesso,
semplifichiamoci la vita, per ora, poi se necessario affronteremo anche la condivisione solo con alcune persone.
In un form apparirà anche un link per la condivisione, per un accesso rapido, segnatevi questo link da diffondere ai vostri collaboratori per avere accesso diretto, in real time, ai dati aggiornati sul documento:
https://docs.google.com/spreadsheet/ccc?key=0Ail81YGXRx8XdFVJMDBVYS02YjZwNFlPVXp4Q1dHMXc
A questo punto dobbiamo andare a scoprire il nome delle caselle, stiamo parlando del nome assegnato dal software per riconoscere le varie colonne, che è differente dal nome da noi assegnato 😉
Per farlo basta dare un'occhiata al sorgente della pagina web: dal nostro spreadsheet, nel menu trovate modulo->modifica, verificate gli input name delle caselle utilizzate come intestazioni. E' solo una conferma, perchè Google nomina gli input form con entry.NumeroProgressivo.single
quindi:
entry.0.single (Per la colonna Device in Rome)
ed
entry.1.single (Per la colonna Device in Milan)
alla fine della stessa pagina web, troverete anche il link con la formkey
"Puoi visualizzare il modulo pubblicato qui di seguito: https://docs.google.com/spreadsheet/viewform?formkey=dFVJMDBVYS02YjZwNFlPVXp4Q1dHMXc6MQ "
annotatela, servirà come chiave di accesso remoto al form!
Ora avete tutti i parametri da inserire nelle impostazioni del firmware da caricare sul Picmicro (FTPmicro)
Sappiamo quindi che, per accedere al documento dobbiamo utilizzare la FORMKEY
e per scrivere nelle righe relative alla colonna ROMA dobbiamo utilizzare entry.0.single , invece entry.1.single per MILANO
Saranno poi questi i parametri di programmazione sia per FTPmicro in ROMA (0) e per quello di MILANO (1)
HTTP HEADER
La stringa per aggiornare i dati nelle celle, può essere verificata attraverso il browser, infatti basta digitare la url composta dal formkey e dalle celle con i relativi valori nel proprio browser per vedere il dato inviato al relativo Google Spreadsheet.
Per tramutare questi dati in codice leggibile, è necessario passare attraverso un visualizzatore http header come ad esempio
http://web-sniffer.net/
In questo modo potete avere i dati precisi da inserire nel firmware.
Se avete problemi scrivetemi anche su questo nei commenti.
Il firmware per FTPmicro (Picmicro 18F67J60)

E' stato utilizzato lo stack Microchip tcp/ip versione 5.41 con le seguenti configurazioni e implementazioni:
nel file TCPIP ETH97.h abilitare i seguenti moduli:
#define STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE // HTTP Client example in GenericTCPClient.c
#define STACK_USE_DNS // Domain Name Service Client for resolving hostname strings to IP addresses
nel file GenericTCPClient.c eseguire le seguenti implementazioni:
static WORD ServerPort = 80;
static ROM BYTE RemoteURL1[] = "formkey=";
static ROM BYTE FormKEY[] ="dFVJMDBVYS02YjZwNFlPVXp4Q1dHMXc6MQ";
static ROM BYTE RemoteURL2[] = "&ifq&";
//static ROM BYTE Entry0[] ="entry.0.single="; //change HERE number of coloumn to update (0 = Device in Rome)
static ROM BYTE Entry0[] ="entry.1.single="; //change HERE number of coloumn to update (1 = Device in Milan)
extern BYTE Temperature[2];
e poi
TCPPutROMString(MySocket, (ROM BYTE*)"Host: ");
TCPPutString(MySocket, ServerName);
TCPPutROMString(MySocket, (ROM BYTE*)"\r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"Connection: close\r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"Content-Type: application/x-www-form-urlencoded\r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"Content-Length: 83\r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"\r\n");
TCPPutROMString(MySocket, RemoteURL1);
TCPPutROMString(MySocket, FormKEY);
TCPPutROMString(MySocket, RemoteURL2);
TCPPutROMString(MySocket, Entry0);
TCPPutString(MySocket, Temperature);
TCPPutROMString(MySocket, (ROM BYTE*)"B0C&submit=Submit");
Poi nel file principale, quindi MainDemo.c inserite:
// Main application entry point.
//
unsigned char Temperature[2];
void main(void)
{
static DWORD t = 0;
static DWORD dwLastIP = 0;
// Initialize application specific hardware
InitializeBoard();
TickInit();
// Initialize Stack and application related NV variables into AppConfig.
InitAppConfig();
// Initialize core stack layers (MAC, ARP, TCP, UDP) and
// application modules (HTTP, SNMP, etc.)
StackInit();
while(1)
{
// if(TickGet() - t >= TICK_SECOND) // about 5 sec. ->> Device in Rome REFRESH
if(TickGet() - t >= TICK_MINUTE/8ul) // about 30 sec. -->> Device in Milan REFRESH
{
t = TickGet();
GenericTCPClient();
}
// This task performs normal stack task including checking
// for incoming packet, type of packet and calling
// appropriate stack entity to process it.
StackTask();
// This tasks invokes each of the core stack application tasks
StackApplications();
// Process application specific tasks here.
ProcessIO();
}
}
E' appunto questa la parte che si occupa della gestione dei tempi di aggiornamento. Infatti i due FTPmicro sono stati programmati con tempi di aggiornamento differenti. Il dispositivo in Roma invia i dati a Google Spreadsheet ogni 5 secondi, mentre quello in Milano ogni 30 secondi circa. Le temperature quindi si aggiorneranno in relazione a questi timing.
Nella chiamata a ProcessIO ci dovranno essere i risultati della conversione analogico digitale rivolti a rappresentare numericamente la temperatura misurata con il sensore di temperatura a bordo dell'FTPmicro.

Grazie sempre ai form di Google Drive è possibile convertire i dati della tabella in un grafico. Questo è il risultato per monitorare la temperatura di due dispositivi in due posti diversi.

Tutto il firmware è open source quindi facilmente personalizzabile, potete anche utilizzare i commenti di questo articolo per segnalare miglioramenti e/o implementazioni.
Ecco il link a Google Code per il download dei sorgenti e dell'intero progetto pronto per MPLAB di Microchip.
http://code.google.com/p/from-picmicro-to-google/downloads/list
Video su come inviare i dati della temperatura da FTPmicro a Google Drive
FTPmicro montato e collaudato è disponibile sul nostro store --> FTPmicro
Potete realizzarlo da soli (fai-da-te) scaricando tutti i codici sorgenti (Schema elettrico realizzato con Orcad, lista parti, circuito stampato realizzato con Orcad, file gerber, codice sorgente assembler realizzato su piattaforma Microchip).
Il progetto montato e collaudato è disponibile sul nostro store --> FTPmicro
In pieno spirito open che da sempre ci contraddistingue, un FTPmicro sarà spedito in omaggio (nel rispetto del regolamento di Review4U quindi anche con le spese di spedizione comprese) a chi indovinerà gli effetti di Instagram applicati alla foto iniziale con FTPmicro.
I commenti a voi!

Leggo con vero piacere questo articolo. Stampato ed archiviato. Sono questi gli articoli che mi portano su questo sito.
Se posso vorrei chiedere, sul web-sniffer, come può essere utilizzato e che parametri vanno inseriti. Grazie Emanuele
Articolo spiegato perfettamente nei dettagli necessari alla implementazione, con pochi passi effettivamente si possono ottenere misure di grandezze da qualunque parte del mondo raggiunto da un indirizzo ip. Aperto a mille applicazioni.
Per giocare, il filtro Instagram è “Amaro” ?
Anche per me è Amaro ma considerando che parli di “filtri” aggiungo che hai usato anche la barretta orizzontale che sfoca la parte alta e bassa della foto.
Ciao Boris,
molto interessante anche la tua soluzione! Analizzando il software da te scritto devo dire che la soluzione con Arduino+Shield è più semplice a livello di software. Io per arrivare a quelle poche linee di codice essenziali ho dovuto barcamenarmi tra i mille file dello stack, quanto meno per essere sicuro di ogni modifica e/o taglio. Alla fine i codici sembrano abbastanza simili, del resto il processing deriva dal C.
A livello hardware invece la soluzione con ftpmicro è sicuramente più performante, una unica scheda di 8×2 cm fa la stessa funzione di una arduino con shield. Rispetto ai costi non so, dipenderà dai lotti di produzione, ma sicuramente ftpmicro occupa meno spazio.
Insomma abbiamo offerto due soluzioni per amanti Atmel e per patiti Microchip 🙂
Il passaggio relativo a web-sniffer è solo per verificare che la nostra stringa funzioni e quindi ritrovarsela già formattata per l’inserimento nel firmware del picmicro.
Ad esempio: se vogliamo inserire TEST nella prima colonna la stringa è:
http://spreadsheets.google.com/formResponse?formkey=dFVJMDBVYS02YjZwNFlPVXp4Q1dHMXc6MQ&ifq&entry.0.single=TEST&submit=Submit
da qualsiasi browser potete trasmettere la url e la colonna 0 si aggiornerà con la scritta TEST. Come fare la stessa cosa con il picmicro in linguaggio C ?
Semplicemente inserendo la stessa stringa in web-sniffer.net impostando HTTP/1.1 ed il metodo POST
dopo aver premuto l’ovvio tasto submit questa è l’header trasmessa:
Connect to 173.194.35.166 on port 80 … ok
POST /formResponse HTTP/1.1[CRLF]
Host: spreadsheets.google.com[CRLF]
Connection: close[CRLF]
User-Agent: Web-sniffer/1.0.37 (+http://web-sniffer.net/)[CRLF]
Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7[CRLF]
Cache-Control: no-cache[CRLF]
Accept-Language: de,en;q=0.7,en-us;q=0.3[CRLF]
Referer: http://web-sniffer.net/%5BCRLF%5D
Content-type: application/x-www-form-urlencoded[CRLF]
Content-length: 80[CRLF]
[CRLF]
formkey=dFVJMDBVYS02YjZwNFlPVXp4Q1dHMXc6MQ&ifq&entry.0.single=TEST&submit=Submit
Se inoltre nella
HTTP Response Header
abbiamo ottenuto anche
Status: HTTP/1.1 200 OK
allora la nostra colonna si sarà nuovamente aggiornata con TEST
Tornando alla formattazione della richiesta, da questi darti possiamo estrapolare le stringhe che ci servono, ad esempio l’Userà Agent non è necessario inviarlo (nemmeno la lingua, i caratteri, il cache control ed il referer) per aggiornare Google Spreadsheets, quello che realmente ci serve è indicato nel firmware:
Host: spreadsheets.google.com[CRLF]
Connection: close[CRLF]
Content-type: application/x-www-form-urlencoded[CRLF]
Content-length: 80[CRLF]
[CRLF]
formkey=dFVJMDBVYS02YjZwNFlPVXp4Q1dHMXc6MQ&ifq&entry.0.single=TEST&submit=Submit
Fuochino!
Non avete indovinato ma ci siete andati vicino. NON è Amaro!