Sto cercando, per ora invano, una soluzione ad un problema di blocco di uno sketch che gira su Arduino Ethernet con IDE 022.
Lo sketch invia, ogni 3 minuti circa, i valori di un piccolo impianto fotovoltaico letti sulle 6 porte analogiche e su una porta digitale a Google Spreadsheet tramite una interfaccia autocostruita.
Per alcuni giorni funziona regolarmente e poi si inchioda inspiegabilmente.
Lo sketch è stato copiato da un website e opportunamente modificato.
/* 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 <OneWire.h>
#include <DallasTemperature.h>
#include <Ethernet.h>
#include <SPI.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 12
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
char formkey[] = "xxxxxxxxxxxxxxxx"; //Replace with your Key
byte mac[] = { 0x90,0xA2,0xDA,0x0D,0xBC,0x69}; //Replace with your Ethernet shield MAC
byte ip[] = { 192,168,2,165}; //The Arduino device IP address
byte subnet[] = { 255,255,255,0};
byte gateway[] = { 192,168,2,1};
byte server[] = { 173,194,35,152 }; // Google IP
Client client(server, 80);
int analogIn0 = 0;
int analogIn1 = 0;
int analogIn2 = 0;
int analogIn3 = 0;
int analogIn4 = 0;
int analogIn5 = 0;
int TempOut = 0;
int TempIn = 0;
//char Tout [10];
//char Tin [10];
int analog1 = 0;
int analog3 = 0;
int analog5 = 0;
int media1 = 0;
int media3 = 0;
int media5 = 0;
void setup()
{
Serial.begin(9600);
Ethernet.begin(mac, ip , gateway , subnet);
delay(1000);
Serial.println("connecting...");
}
void loop(){
sensors.requestTemperatures(); // Send the command to get temperatures
TempOut = 100 * sensors.getTempCByIndex(1);
TempIn = 100 * sensors.getTempCByIndex(0);
//dtostrf(TempOut ,1 ,2 ,Tout);
//dtostrf(TempIn ,1 ,2 ,Tin);
//campiono il valore di tensione analogica
//in ingresso sul pin0 ella borad Arduino UNO
analogIn0 = analogRead(0);
analogIn1 = analogRead(1);
analogIn2 = analogRead(2);
analogIn3 = analogRead(3);
analogIn4 = analogRead(4);
analogIn5 = analogRead(5);
float average1 = 0;
float average3 = 0;
float average5 = 0;
for(int i = 0; i < 10000; i++) {
analogIn1 = analogRead(1);
analogIn3 = analogRead(3);
analogIn5 = analogRead(5);
//Serial.println(analogIn1);
//Serial.println(analogIn3);
//Serial.println(analogIn5);
average1 = (average1 + analogIn1); // 1000;
average3 = (average3 + analogIn3); // 1000;
average5 = (average5 + analogIn5); // 1000;
delay(10);
}
media1 = average1 / 10000;
media3 = average3 / 10000;
media5 = average5 / 10000;
//media1 = ((media1-87)*0.05)+5
//analog1 = average1;
//analog3 = average3;
//analog5 = average5;
//Serial.println(average1);
//Serial.println(average3);
//Serial.println(average5);
String data;
data+="";
data+="entry.0.single=";
data+=analogIn0;
data+="&entry.1.single=";
data+=media1;
data+="&entry.2.single=";
data+=analogIn2;
data+="&entry.3.single=";
data+=media3;
data+="&entry.4.single=";
data+=analogIn4;
data+="&entry.5.single=";
data+=media5;
data+="&entry.6.single=";
data+=TempIn;
data+="&entry.7.single=";
data+=TempOut;
data+="&submit=Submit";
//Serial.println(data);
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();
client.stop();
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();
}
delay(1000);
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
delay(60000);
}
Può essere una soluzione inserire un watchdog ? Mi sto informando e ho visto che serve una libreria che però non riesco a trovare.
Altro piccolo problema, ho scoperto che ogni tanto Google cambia gli indirizzi IP dei server.
In tal caso Arduino chiama un indirizzo che non può rispondere.
Esiste la possibilità di chiamare un server DNS per ovviare al problema ?
Grazie per l'aiuto !