Caro contivalentino io ho riscritto uno sketch abbastanza modificato il quale invia ogni 3 minuti esatti
n.4 temperature + uno stato Pin di una elettrovalvola al sito Google Spread sheet o meglio Google Drive...
Il sistema stà funzionando dal 1 Novembre 2012 e fino ad oggi ha inviato per n.64298 di volte la stringa con le temperature e la scheda ethernet non si è mai fermata...ma dico mai e proprio mai...
Ti posso confermare e straconfermare che se l'invio si ferma è un problema di scrittura dello sketch...
Io primo di arrivare alla soluzione definitiva per svariati mesi ho avuto i tuoi stessi problemi e ho notato che il Delay non và assolutamente usato e come puoi notare dallo sketch postato ho usato solo il Millis...
spero d'esserti stato d'aiuto...
//RX da seriale 4 temperature+stato valvola a Google ULTIMO
// compilato con Arduino Ide 1.03
#include <SoftwareSerial.h> // libreria creazione porta seriale virtuale
#include <Ethernet.h>
#include <SPI.h>
SoftwareSerial mySerial(7, 8); // RX, TX
char formkey[] = "dFJfLVJfdXM0QVI0NE40NXEzUmdtTFE6MQ"; //Replace with your Key
byte mac[] = { 0x90,0xA2,0xDA,0x0D,0x1C,0xDA}; //Replace with your Ethernet shield MAC
byte subnet[] = { 255,255,255,0};
byte gateway[] = { 192,168,0,1};
byte ip[] = { 192,168,0,140};
String stv = "" ;
byte server[] = { 173,194,35,46 };
EthernetClient client;
//unsigned long time;
//IPAddress ip(192,168,0,140);
int I = 0;
int J = 0;
String Z = "";
byte Decimali = 1;
String SerRx = ""; // azzera buffer ricezione
const unsigned long TimeOut = 5000; // timeout 1 s
unsigned long Timer = millis();// timer partito
unsigned long Timer1 = millis();// timer partito
int Temp1=0 ;
int Temp2=0 ;
int Temp3=0 ;
int Temp4=0 ;
int Valvola=0 ;
void setup() {
Serial.begin(9600); // inizializza porta seriale
//Ethernet.begin(mac, ip , gateway , subnet);
//if (Ethernet.begin(mac) == 0) { // start the Ethernet connection
Ethernet.begin(mac, ip, gateway, gateway, subnet ); // DHCP failed, so use a fixed IP address
Serial.println("Failed to configure Ethernet using DHCP");
client.connect(server, 80);
Serial.println("seriale rx inizio");
mySerial.begin(19200);
mySerial.println("seriale virtuale rx inizio"); // inizializza porta seriale ausiliaria
Serial.println("connecting...");
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
}
void loop() {
Serial.println("inizio loop");
SerRx = ""; // azzera buffer ricezione
Timer = millis(); // timer partito
Timer1 = millis();
while (millis() - Timer < TimeOut) { // attesa timeout
while (mySerial.available() > 0) { // ricezione da modulo
SerRx += char(mySerial.read()); // aggiungi carattere al buffer
Timer = millis(); // reset timer
}
}
if (SerRx.length() > 0) {
{ // ci sono dei dati nel buffer (Temp1<CR><LF>Temp2<CR><LF>...Temp5<CR><LF>
J = 0;
I = SerRx.indexOf(13, J); // cerca CR (carriage return) a partire dal carattere J
if (I > 0) {
Z = SerRx.substring(J, I); // sotto stringa dal carattere J al carattere I-1
Temp1 = Z.toInt();
J = I + 2; // nuova posizione di ricerca
mySerial.println(Temp1, Decimali);
Serial.print("Temp1 = ");
Serial.println(Temp1, Decimali);
}
I = SerRx.indexOf(13, J); // cerca CR (carriage return) a partire dal carattere J
if (I > 0) {
Z = SerRx.substring(J, I); // sotto stringa dal carattere J al carattere I-1
Temp2 = Z.toInt();
J = I + 2; // nuova posizione di ricerca
mySerial.println(Temp2, Decimali);
Serial.print("Temp2 = ");
Serial.println(Temp2, Decimali);
}
I = SerRx.indexOf(13, J); // cerca CR (carriage return) a partire dal carattere J
if (I > 0) {
Z = SerRx.substring(J, I); // sotto stringa dal carattere J al carattere I-1
Temp3 = Z.toInt();
J = I + 2; // nuova posizione di ricerca
mySerial.println(Temp3, Decimali);
Serial.print("Temp3 = ");
Serial.println(Temp3, Decimali);
}
I = SerRx.indexOf(13, J); // cerca CR (carriage return) a partire dal carattere J
if (I > 0) {
Z = SerRx.substring(J, I); // sotto stringa dal carattere J al carattere I-1
Temp4 = Z.toInt();
J = I + 2; // nuova posizione di ricerca
mySerial.println(Temp4, Decimali);
Serial.print("Temp4 = ");
Serial.println(Temp4, Decimali);
}
I = SerRx.indexOf(13, J); // cerca CR (carriage return) a partire dal carattere J
if (I > 0) {
Z = SerRx.substring(J, I); // sotto stringa dal carattere J al carattere I-1
Valvola = Z.toInt();
mySerial.println(Valvola);
Serial.print("Valvola = ");
Serial.println(Valvola);
}
}
Serial.println("inizio stringa");
String data;
if ( millis() > Timer1 + 5000)
{
Serial.println("inizio dati");
data+="";
data+="entry.0.single=";// prima label temperatura IN acqua
data+=Temp1;
data+="&entry.3.single=";// seconda label temperatura OUT acqua
data+=Temp2;
data+="&entry.4.single=";// terza label Stato elettrovalvola 1
data+=Temp3;
data+="&entry.5.single=";// quarta label Stato circolatore caldaia
data+=Temp4;
data+="&entry.6.single=";// quinta label Stato valvola
if (Valvola == 1){
stv = ("aperta"); // stampa aperta
}
if (Valvola == 0) {
stv = ("chiusa"); // stampa chiusa
}
//data+=Valvola;
data+=stv;
data+="&submit=Submit";
Serial.println("connecting Ethernet");
client.connect(server,80) ;
//if (client.connected(server, 80)) {
if (client.connected()) {
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();
Timer1 = millis();
}
client.stop();
}
delay(500);
}
}