Arduino+ETH Shield e Google Spreadsheet

E..un' altra cosa..quando apro il mio foglio di calcolo sulla barra indirizzi trovo scritto:
https://spreadsheets.google.com/ccc?key=0ArTGw8....
e non
https://spreadsheets.google.com/formResponse?formkey=0ArTGw8....
centra qualcosa?

l'ip va quello spreadshett...
centra qualcosa, devi modificare l'algoritmo per usare ccc?blbla e non l'altro modo (evidentemente l'algoritmo è vecchio)

ed infine tu stai usando HTTPS, mentre l'algoritmo supporta solo HTTP...

Pensi dunque non ci sia maniera di andare a scr ivere sul foglio di calcolo con algoritmo https? =(

non lo so. in HTTPS tutte le comunicazioni sono criptate, bisogna vedere se arduino ha abbastanza potenza di calcolo per criptare i dati, oppure abbastanza memoria per criptare i dati o-line e poi spedirli una volta elaborati.

allora ho fatto qualche prova anch'io. Se non ti logghi in google, spreadsheet usa l'HTTP, però i dati restano salvato solo 24 ore, infatti se noti lo sketch che hai postato NON si autentica.

se vuoi implementare l'HTTPS, ecco tutto ciò che ti serve; la RFC: RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2
per chi non lo sapesse le RFC sono i documenti tecnici che, se approvati, divengono standard di internet.
Ovviamente spiegano per filo e per segno come devono comportarsi i programmi per essere compatibili.
Per esempo lFTP, l'HTTP, e molti altri....

dopo di che puoi seguire questa guida:

che in pratica spiega il protocollo al di sopra dell'HTTPS ( e comunque credo che le api, ovvero le funzioni, siano le stesse per l'http)

Mi sa che HTTPS è un pò troppo per me.. :frowning: va bhe..grazie comunque per l' interesse e la spiegazione. C' è un tasto Thanks su questo forum?

no, ma ci vorrebbe in effetti :slight_smile:
comunque puoi usare l'http, però devi ricordarti di fare il backup dei dati ogni 24h e che il link al foglio cambia...

Volevo comunicare che sono riuscito a scrivere sul foglio di calcolo Google seguendo questa guida:

Probabilmente c' è ancora qualcosa da sistemare perchè dopo qualche inserimento l' ETH shield sembra come incepparsi e conclude la trasmissione. Questa cosa mi serviva per rilevare dei dati di temperatura e umidità per poterli poi rappresentare comodamente su un grafico inserito in un sito Google.

Anche io stò facendo la stessa cosa ma ho lo stesso tuo identico problema...dopo 5-6 scritture il sistema si ferma e non scrive più nelle label dello spreadsheet...come hai risolto Devon ???

Ho letto che l' Ethernet Shield (basato su WizNet5100) si blocca se usato con troppa insistenza.
Ho anche letto che c'e' un trucco per non farlo bloccare.

Cerca con la chiave "Wiznet 5100"

pietro78:
Anche io stò facendo la stessa cosa ma ho lo stesso tuo identico problema...dopo 5-6 scritture il sistema si ferma e non scrive più nelle label dello spreadsheet...come hai risolto Devon ???

Io ho usato il codice modificato in questo modo e così funziona.

/* Arduino to Google Docs
created 2011

This example code is in the public domain.

http://www.open-electronics.org

http://www.futurashop.it

Arduino data &ifq&entry.0.single=Boris&entry.2.single=Landoni&submit=Submit
Original from http://goodsite.cocolog-nifty.com/uessay/2010/07/arduinogoogle-d.html
Modified by John Missikos 11/6/11
Modified by Andrea Fainozzi 30/6/11
Modified by Boris Landoni 8/7/11

*/

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

char formkey[] = "dEtqRGhDa1pOTVJRLTlzNWw3U3htV0E6MQ"; //Replace with your Key
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //Replace with your Ethernet shield MAC
byte ip[] = { 192,168,0,4}; //The Arduino device IP address
byte subnet[] = { 255,255,255,0};
byte gateway[] = { 192,168,0,1};
byte server[] = { 209,85,229,101 }; // Google IP
Client client(server, 80);
unsigned long time;
#define dataPin 2
#define clockPin 3
SHT1x sht1x(dataPin, clockPin);
float temp_c;
float humidity;
String data;

void setup()
{
Serial.begin(9600);
Ethernet.begin(mac, ip , gateway , subnet);
delay(1000);
Serial.println("connecting...");
}

void loop(){

if ( millis() > time + 10000){ // update sheet each 10 s
temp_c = sht1x.readTemperatureC(); //read temperature
humidity = sht1x.readHumidity(); //read humidity
data+="";
data+="entry.0.single=";
data+=(int) temp_c;
data+="&entry.1.single=";
data+=(int) humidity;
data+="&submit=Submit";

if (client.connect()) {
Serial.println("connected");

client.print("POST /formResponse?formkey=");
client.print(formkey);
client.println("&ifq HTTP/1.1");
client.println("Host: spreadsheets.google.com");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Connection: close");
client.print("Content-Length: ");
client.println(data.length());
client.println();
client.print(data);
client.println();
//Show on serial monitor
Serial.print("POST /formResponse?formkey=");
Serial.print(formkey);
Serial.println("&ifq HTTP/1.1");
Serial.println("Host: spreadsheets.google.com");
Serial.println("Content-Type: application/x-www-form-urlencoded");
Serial.println("Connection: close");
Serial.print("Content-Length: ");
Serial.println(data.length());
Serial.println();
Serial.print(data);
Serial.println();
time = millis();
}
delay(10);
client.stop();
Serial.println("disconnected..");
}
delay(1000);
}

Che bello Devon, il tuo primo Topic XD, non ti sei un po' emozionato a rivederlo in UP?
A breve apro anch'io un Topic sul mondo Ethernet, abbene sì, è venuto il momento, ma io devo fare una cosa un po' particolare, tra qualche giorno ne riparliamo. :wink:

Ok il codice postato da Devon funzionicchia...a mio avviso c'è ancora qualche problema legato al server google spreadsheet che a volte "risponde male" e difatti al debug sulle serialPrint leggo dei caratteri strani...e comunque tutta la notte ha funzionato ...ho messo un time millis 1000,un secondo e mi ha mandato regolarmente tutti i dati...

Ora volevo chiedere se volessi aggiungere oltre ai due dati analogici di A0 e A1 anche un paio di DigitalRead di due Ingressi digitali come modifico lo sketch??
Premetto che ho provato così come segue ma nulla...o meglio mi stampa lo stato del pin in un'altra label dello spreadsheet ma modificandolo durante le letture non mi varia da 0 a 1 oppure da 1 a 0..ottengo sempre la stampa a 1 ...aggiungo che chiaramente ho inserito una 4,7 K di resistenza...
Grazie e buona giornata a tutti...allego lo sketch con le modifiche in rosso...ciao a tutti...


/* Arduino to Google Docs
created 2011

This example code is in the public domain.

Arduino data &ifq&entry.0.single=Boris&entry.2.single=Landoni&submit=Submit
Original from http://goodsite.cocolog-nifty.com/uessay/2010/07/arduinogoogle-d.html
Modified by John Missikos 11/6/11
Modified by Andrea Fainozzi 30/6/11
Modified by Boris Landoni 8/7/11

*/

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

char formkey[] = "dEtqRGhDa1pOTVJRLTlzNWw3U3htV0E6MQ"; //Replace with your Key
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //Replace with your Ethernet shield MAC
byte ip[] = { 192,168,0,4}; //The Arduino device IP address
byte subnet[] = { 255,255,255,0};
byte gateway[] = { 192,168,0,1};
byte server[] = { 209,85,229,101 }; // Google IP
Client client(server, 80);
unsigned long time;
#define dataPin 2
#define clockPin 3
int statoPin = 5
SHT1x sht1x(dataPin, clockPin);
float temp_c;
float humidity;
String data;

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

pinMode(statoPin, INPUT);
Ethernet.begin(mac, ip , gateway , subnet);
delay(1000);
Serial.println("connecting...");
}

void loop(){

if ( millis() > time + 10000){ // update sheet each 10 s
temp_c = sht1x.readTemperatureC(); //read temperature
humidity = sht1x.readHumidity(); //read humidity
data+="";
data+="entry.0.single=";
data+=(int) temp_c;
data+="&entry.1.single=";
data+=(int) humidity;
data+="&entry.2.single=";
data+=digitalRead(statoPin);
data+="&submit=Submit";

if (client.connect()) {
Serial.println("connected");

client.print("POST /formResponse?formkey=");
client.print(formkey);
client.println("&ifq HTTP/1.1");
client.println("Host: spreadsheets.google.com");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Connection: close");
client.print("Content-Length: ");
client.println(data.length());
client.println();
client.print(data);
client.println();
//Show on serial monitor
Serial.print("POST /formResponse?formkey=");
Serial.println(statoPin);
Serial.print(formkey);
Serial.println("&ifq HTTP/1.1");
Serial.println("Host: spreadsheets.google.com");
Serial.println("Content-Type: application/x-www-form-urlencoded");
Serial.println("Connection: close");
Serial.print("Content-Length: ");
Serial.println(data.length());
Serial.println();
Serial.print(data);
Serial.println();
time = millis();
}
delay(10);
client.stop();
Serial.println("disconnected..");
}
delay(1000);
}

prova con data+=(int)digitalRead(statoPin);

anche se dubito.. per me il problema è o il pin è usato dalla shield, o il circuito è errato

:stuck_out_tongue_closed_eyes: Effettivamente quando l' ho visto ho subito pensato..ma chi lo ha ripescato??

Siamo curiosi..staremo a vedere.
@Pietro78
Io a questo punto proverei ad allinearmi in questo modo. Dichiara una variabile int. (tipo int val=0;. Poi modifichi così il tuo programma.

 if ( millis() > time + 10000){ // update sheet each 10 s
    temp_c = sht1x.readTemperatureC();    //read temperature
    humidity = sht1x.readHumidity();      //read humidity
    val = digitalRead(statoPin);
    data+="";
    data+="entry.0.single=";
    data+=(int) temp_c;
    data+="&entry.1.single=";
    data+=(int) humidity;
    data+="&entry.2.single=";
    data+=(int) val;
    data+="&submit=Submit";

Io a questo punto proverei ad allinearmi in questo modo. Dichiara una variabile int. (tipo int val=0;. Poi modifichi così il tuo programma.
Code:
if ( millis() > time + 10000){ // update sheet each 10 s
temp_c = sht1x.readTemperatureC(); //read temperature
humidity = sht1x.readHumidity(); //read humidity
val = digitalRead(statoPin);
data+="";
data+="entry.0.single=";
data+=(int) temp_c;
data+="&entry.1.single=";
data+=(int) humidity;
data+="&entry.2.single=";
data+=(int) val;
data+="&submit=Submit";

Ho provato in vari modi e diciamo che riesco ad ottenere 3-4 stampe sullo spreadsheet con tutti e tre i valori(i primi due analogici e il terzo digitale che riesco anche a variare tra 1 e 0 )ma poi il processo si ferma e sembra essere un problema di codice o meglio di caratteri...difatti sul debug serial noto che il parametro " client.println(data.length());" mi riporta il numero di caratteri trasmessi e sembrano essere troppi ( con due variabili mi riporta 63 mentre con il terzo val mi arriva a 92) quando aggiungo il terzo valore digitalRead ...se riporto il codice a mandare solo i primi due valori analogici tutto funziona per intere ore con intervalli anche di 2-3 secondi...
Chiedo a qualcuno più pratico del C si potrebbe aumentare un ciclo di String.data con i valori in più da immettere ad esempio:
String.data = analogicRead (A0) e analogicRead(A1) e finisco un invio dati
String.data1 = digitalReadRead (4) e digitalRead(5) e finisco un altro invio dati...

Ciao e grazie...

scusa, ma tu non fai mai la clear della String data, dopo averla spedita...
ciò vuol dire che data cresce, cresce e cresce finchè non finisci la ram, o meglio non riesce ad allocare abbastanza ram contigua per la stringa, però rimane un pò di ram disponibile, evidentemente abbastanza percchè il resto del codice funzioni senza problemi.

Visto che "data" nasce e muove all'interno del loop(), e che non necessita trasportare dati da un loop e l'altro, non dichiararla come variabile globale, ma dichiarala all'interno del loop. In questo modo ogni loop "data" muore e viene ricreata al loop successivo, liberando le risorse (e cancellando i dati non più necessari)

+1 per lesto
O fai come come dice lui o per lo meno dopo

    time = millis();

ci devi cacciare un

    data= "";

Non vorrei smentire nessuno di voi che con grande spirito di solidarietà open source mi state aiutando ma con un pò di fattore C sono riuscito ad ottenere quello che volevo...ovvero:

-Invio dati di n. 4 variabili su n.4 label diverse della tabella google spreadshhet creata;
-Invio dati con frequenza regolare piuttosto stressante = 5 secondi
-Le 4 variabili sono n.2 analogiche A0 A1 e n.2 digitali Pin3 e Pin7
-I valori di tutte e 4 le variabili si aggiornano col variare dei due stati Pin digitalRead

Ora la soluzione grazie a voi era facile...ma in prima persona non saprei a cosa attribuire la vera riuscita della compilazione del codice...di sicuro è certo che quando il data-lenght (numero di caratteri che compongono la stringa ogni volta che la si trasmette)non è superiore ai 90 caratteri il tutto pare funzionare a meraviglia,se invece supera i 90 magari aggiungendo un'altra variabile analogica o digitale si arriva a superare i 100 caratteri il codice si blocca e non saprei come risolvere...

Allego il codice sketch che al momento funziona..

/* Da Arduino 1 a Google Documenti spreadsheet
created 2012 by Arduino IDE 23 Linux Ubuntu 10.04

Pietro78

Il circuito è installato su un bollitore caldaia per
la produzione di acqua calda sanitaria ed è composto da n.2 Sonde
di temperatura lm 35 collegate su A0 e A1 e
con il controllo di una elettrovalvola collegata su PIN 7 e
con il controllo della pompa circolatore collegata su PIN 3
Tutti i dati vengono mandati con una frequenza all'incirca di 5 secondi a Google Spreadsheet
e vengono elaborati in tempo reale con un grafico personalizzabile condiviso in rete

*/

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

char formkey[] = "dFJfLVJfdXM0QVI0NE40NXEzUmdtTFE6MQ"; //Replace with your Key
byte mac[] = { 0x90,0xA2,0xDA,0x00,0x55,0x8D}; //Replace with your Ethernet shield MAC
byte ip[] = { 192,168,0,200}; //The Arduino device IP address
byte subnet[] = { 255,255,255,0};
byte gateway[] = { 192,168,0,1};
//byte server[] = { 209,85,229,101 }; // Google IP
byte server[] = { 173,194,35,46};
Client client(server, 80);
unsigned long time;

void setup()
{

Serial.begin(9600);
Ethernet.begin(mac, ip , gateway , subnet);
delay(1000);
Serial.println("connecting...");
}

void loop(){

String data;

if ( millis() > time + 2000){ // update sheet each 10 s

data+="";
data+="entry.0.single=";// prima label temperatura IN acqua
data+=analogRead(A0);

data+="&entry.3.single=";// seconda label temperatura OUT acqua
data+=analogRead(A1);

data+="&entry.4.single=";// terza label Stato elettrovalvola 1
data+=digitalRead(7);

data+="&entry.5.single=";// quarta label Stato circolatore caldaia
data+=digitalRead(3);
data+="&submit=Submit";

if (client.connect()) {
Serial.println("connected");

client.print("POST /formResponse?formkey=");
client.print(formkey);
client.println("&ifq HTTP/1.1");
client.println("Host: spreadsheets.google.com");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Connection: close");
client.print("Content-Length: ");
client.println(data.length());
client.println();
client.print(data);
client.println();

Serial.print("POST /formResponse?formkey=");
Serial.print(formkey);
Serial.println("&ifq HTTP/1.1");
Serial.println("Host: spreadsheets.google.com");
Serial.println("Content-Type: application/x-www-form-urlencoded");
Serial.println("Connection: close");
Serial.print("Content-Length: ");
Serial.println(data.length());
Serial.println();
Serial.print(data);
Serial.println();
time = millis();

}
delay(10);
client.stop();
Serial.println("disconnected..");
}
delay(1000);
}

Spero in voi geni del codice a risolvere questo intricato dilemma e spero che esca qualche genialata perchè m'interesserebbe poter aggiungere ancora altre variabili...aggiungo che alllo sketch caricato ho già provato ad inserire un'altra sola variabile ( uno statoPin digitale) con un "String clear" finale come suggerito da Lesto

scusa, ma tu non fai mai la clear della String data, dopo averla spedita...

ma non ha dato nessun esito positivo ...il loop si blocca dopo il primo invio...poi ho anche provato la soluzione di Devon :

O fai come come dice lui o per lo meno dopo
Code:
time = millis();
ci devi cacciare un
Code:
data= "";

ma anch'esso non ha sortito esiti positivi...
Ora non resta che le vostre idee delle vostre menti geniali...grazie per ora...Ciao..

In ultimo allego immagine della pagina html di google...
![](http://arduino.cc/home/pietro/Scrivania/Schermata-Arduino Temperature - Chromium.png)

il problema degli array (e String è un array di char) è devono essere tutti consecutivi nella ram. Perchè arduino si blocchi non lo so, ma puoi risolvere il problema dividendo i dati in X stringhe da 60-70