Pages: 1 [2]   Go Down
Author Topic: Arduino+ETH Shield e Google Spreadsheet  (Read 3594 times)
0 Members and 1 Guest are viewing this topic.
ITALY
Offline Offline
Full Member
***
Karma: 1
Posts: 188
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Quote
/* Arduino to Google Docs
 created 2011

This example code is in the public domain.

http://www.open-electronics.org

http://www.futurashop.it

https://spreadsheets.google.com/formResponse?formkey=dDBMdUx3TmQ5Y2xvX2Z0V183UVp2U0E6MQ &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);
}


Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 568
Posts: 12521
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Che bello Devon, il tuo primo Topic smiley-lol, 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. smiley-wink
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

http://www.open-electronics.org

http://www.futurashop.it

https://spreadsheets.google.com/formResponse?formkey=dDBMdUx3TmQ5Y2xvX2Z0V183UVp2U0E6MQ &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);
}

Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ITALY
Offline Offline
Full Member
***
Karma: 1
Posts: 188
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Che bello Devon, il tuo primo Topic smiley-lol, non ti sei un po' emozionato a rivederlo in UP?
smiley-yell Effettivamente quando l' ho visto ho subito pensato..ma chi lo ha ripescato??
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. smiley-wink
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.
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";
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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...
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ITALY
Offline Offline
Full Member
***
Karma: 1
Posts: 188
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..

Quote
/* 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
Quote
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 :

Quote
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...
« Last Edit: April 27, 2012, 01:26:38 pm by pietro78 » Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: 1 [2]   Go Up
Jump to: