problema con pachube (www.cosm.com)

Ciao a tutti,
ho scritto uno sketch che mi dovrebbe permettere di controllare i parametri del mio impianto termosolare dalla pagina web "gelholder" del sito www.cosm.com.
Sto inviando i dati di 2 sensori LM35DZ e di 2 ingressi analogici (il cui segnare arriva da due uscite digitali, in parallelo con le uscite che mi controllano una ventola e la caldaia, attraverso una resistenza da 1Kohm) a cosm (ex Pachube).

Quando ho provato il programma con 1 solo sensore il refresh dei dati era ogni 30 sec, adesso mi trovo che l'aggiornamento avviene mimino ogni 20 min, ma a volte anche dopo ore.

La mia linea internet mi sembra ok in quanto, con un altro arduino, nella stessa pagina di coms ho caricato un'altro sketch che mi controlla la temperatura dello studio usando una sonda ds18b20 e vedo che il refresh dei dati è molto veloce.
Da cosa può dipendere?
Mi piacerebbe avere un aggiornamento al massimo ogni 30 sec.
Il mio username si www.cosm.com è gelholder
Grazie

    IDE 1.01
    Ethernet shield attached to pins 10, 11, 12, 13
    Arduino uno

 
  This code is in the public domain.
 
 */

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


#define APIKEY         "xxxxxxxxxxxxxxxxxxxxx" // replace your Cosm api key here
#define FEEDID         xxxxx // replace your feed ID
#define USERAGENT      "TEST 2" // user agent is the project name

// assign a MAC address for the ethernet controller.
// fill in your address here:
  byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(10,0,1,20);

// initialize the library instance:
EthernetClient client;

// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(216,52,233,121);      // numeric IP for api.cosm.com
char server[] = "api.cosm.com";   // name address for Cosm API

unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
boolean lastConnected = false;                 // state of the connection last time through the main loop
const unsigned long postingInterval = 10*1000;  //delay between updates to Cosm.com

void setup() {
  // start serial port:
  Serial.begin(9600);
  // give the ethernet module time to boot up:
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // DHCP failed, so use a fixed IP address:
    Ethernet.begin(mac, ip);
  }
}

void loop() {
    int caldaiaON=analogRead(A0);  //INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA 
    int Ventola=analogRead(A2);  //INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA 
   pinMode(5,OUTPUT);  //USCITA IN PARALLELO AL RELE CALDAIA PER VISUALIZZAZIONE WEB STATO CALDAIA   
    pinMode(6,OUTPUT);  //USCITA IN PARALLELO AL RELE CALDAIA PER VISUALIZZAZIONE WEB STATO CALDAIA   
   pinMode(8,OUTPUT);  //relay controllo ACQUA
   pinMode(9,OUTPUT);  //relay controllo ARIA
   // read the analog sensor:
  float tempAria = analogRead(A1)*0.5;    //sensore di temperatura LM35DZ ARIA
  int sensorReading = tempAria;
  Serial.print ("Temp. Aria:  ");
  Serial.println (tempAria);

  String dataString = "sensor1,";
  dataString += sensorReading;
   if ((tempAria>0) and (tempAria<35)){
   Serial.println("Aria fredda"); 
   digitalWrite(9,LOW);      //VENTILAZIONE DISATTIVATA
   digitalWrite(5,LOW);      //VENTILAZIONE DISATTIVATA
   Serial.print ("Ventola Spenta  ");
   Serial.println (Ventola,DEC);
  }
   else if ((tempAria>35) and (tempAria<100)){
   Serial.println ("Aria calda");
   digitalWrite(9,HIGH);    //VENTILAZIONE ATTIVATA
   digitalWrite(5,HIGH);    //VENTILAZIONE ATTIVATA
   Serial.print ("Ventola Accesa  ");
   Serial.println (Ventola,DEC);
 }
 int otherSensorReadingAria = Ventola;  
  dataString += "\nsensor2,";
  dataString += otherSensorReadingAria;
  // you can append multiple readings to this String if your
  // Cosm feed is set up to handle multiple values:
       float tempAcqua = (analogRead(A3)*0.5)+4;    // sensore di temperatura LM35DZ ACQUA
       int otherSensorReading = tempAcqua;
       Serial.print ("Temp. Acqua:  ");
       Serial.println (tempAcqua);
       
  dataString += "\nsensor3,";
  dataString += otherSensorReading;
  
  if ((tempAcqua>0) and (tempAcqua<42)){
   Serial.println("Acqua fredda"); 
   digitalWrite(8,HIGH);    // ACCENSIONA CALDAIA
    digitalWrite(6,HIGH);    //USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
    Serial.print("Caldaia Accesa  ");
      Serial.println (caldaiaON,DEC);
   
  }
   else if ((tempAcqua>42) and (tempAcqua<100)){
     delay(2000);
   Serial.println ("Acqua Calda");
   digitalWrite(8,LOW);    //SPEGNIMENTO CALDAIA
    digitalWrite(6,LOW);    //USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
    Serial.print("Caldaia Spenta  ");
      Serial.println (caldaiaON,DEC);
   
    }
    
     int otherSensorReadingCaldaia = caldaiaON;
   dataString += "\nsensor4,";
   dataString += otherSensorReadingCaldaia; 
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if there's no net connection, but there was one last time
  // through the loop, then stop the client:
  if (!client.connected() && lastConnected) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }

  // if you're not connected, and ten seconds have passed since
  // your last connection, then connect again and send data: 
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    sendData(dataString);
  }
  // store the state of the connection for next time through
  // the loop:
  lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
void sendData(String thisData) {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
    client.print("PUT /v2/feeds/");
    client.print(FEEDID);
    client.println(".csv HTTP/1.1");
    client.println("Host: api.cosm.com");
    client.print("X-ApiKey: ");
    client.println(APIKEY);
    client.print("User-Agent: ");
    client.println(USERAGENT);
    client.print("Content-Length: ");
    client.println(thisData.length());

    // last pieces of the HTTP PUT request:
    client.println("Content-Type: text/csv");
    client.println("Connection: close");
    client.println();

    // here's the actual content of the PUT request:
    client.println(thisData);
  } 
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
  // note the time that the connection was made or attempted:
  lastConnectionTime = millis();
}

Lo sketch così com'è dovrebbe (se riesce a collegarsi) inviare lo stream di dati ogni 10 secondi. Hai cambiato il MAC address all'altro arduino che ti legge i dati nello studio?

Perche metti pinMode() all'interno del loop()?

PS: ti ho aggiunto la formattazione del codice, hai sbagliato modo di usare il tag per racchiuderlo. La prossima volta premi sul pulsante col simbolo cancelletto.

Ciao e grazie per aver controllato il codice.
Io non ho cambiato il MAC address della scheda in studio, l'ho installata oggi pomeriggio per capire se il ritardo poteva dipendere dalla mia connessione internet ma invece vedo che dalla scheda Arduino che ho in studio il refresh dei dati è praticamente continuo, mentre dalla scheda di controllo del termosolare i refresh dei dati avviene ogni "decine" di minuti.
Può dipendere dal fatto che il cavo di rete è lungo 20mt?

Per quanto riguarda i pinMode()... in effetti ho sbagliato... ma a parte questo, secondo te ho commesso altri errori che rallentano l'invio dei dati?

Grazie

Caro elvis,

ritengo che tu debba modificare il codice in modo da evitare ripetute dichiarazioni: nel loop vengono ridichiarate delle variabil che sarebbe meglio fossero globali, soprattutto la variabile datastring.

Inoltre, verifichi che millis() - lastConnectionTime > postingInterval

dimenticando che millis() si resetta dopo circa 50 giorni e ti potrebbe bloccare il sistema

Ettore Massimo Albani

Ciao Ettore,
grazie veramente dei tuoi consigli che... però ahimè... non so interpretare... sono un elettricista e mi sto appassionando ad Arduino, ma forse sto cercando di fare qualcosa di troppo difficile!
Ho praticamente usato il codice di www.cosm.com (quello che ti scrivono al momento dell'installazione del primo sensore) ed ho aggiunto altri 3 sensori.
Ho provato ad eliminare " millis() - lastConnectionTime > postingInterval " ma da qual momento non ho più visto aggiornamenti sul sito di cosm.com.
Adesso ho re-installato lo sketch di ieri con la differenza di aver sistemato i pinMode nel setup... ma ciò non mi ha risolto il problema dei rari refresh...

Da quando ho il computer risolvo problemi che prima non avevo... :slight_smile: (anonimo)

Caro elvis,

ti ho inserito il codice come dovrebbe essere strutturato.

Ovviamento non ho avuto modo di testarlo a fondo.

Ettore Massimo Albani

/* IDE 1.01
 Ethernet shield attached to pins 10, 11, 12, 13
 Arduino uno
 This code is in the public domain.
 */

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

#define APIKEY         "xxxxxxxxxxxxxxxxxx" // replace your Cosm api key here
#define FEEDID         xxxxx // replace your feed ID
#define USERAGENT      "TEST 2" // user agent is the project name

// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(10,0,1,20);

// initialize the library instance:
EthernetClient client;

// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
// IPAddress server(216,52,233,121);      // numeric IP for api.cosm.com
char server[] = "api.cosm.com";   // name address for Cosm API

unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
boolean lastConnected = false;                 // state of the connection last time through the main loop
const unsigned long postingInterval = 10 * 1000;  //delay between updates to Cosm.com

int caldaiaON = 0;               //INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA 
int Ventola = 0;  //INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA 
float tempAria = 0.0;  //sensore di temperatura LM35DZ ARIA
float tempAcqua = 0.0;    // sensore di temperatura LM35DZ ACQUA
int sensorReading = 0;
String dataString = "";
int otherSensorReading = 0;  
int otherSensorReadingAria = 0;  
int otherSensorReadingCaldaia = 0;

void setup() {
  
  pinMode(5, OUTPUT);  //USCITA IN PARALLELO AL RELE CALDAIA PER VISUALIZZAZIONE WEB STATO CALDAIA   
  pinMode(6, OUTPUT);  //USCITA IN PARALLELO AL RELE CALDAIA PER VISUALIZZAZIONE WEB STATO CALDAIA   
  pinMode(8, OUTPUT);  //relay controllo ACQUA
  pinMode(9, OUTPUT);  //relay controllo ARIA

  // start serial port:
  Serial.begin(9600);
  // give the ethernet module time to boot up:
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // DHCP failed, so use a fixed IP address:
    Ethernet.begin(mac, ip);
  }
}

void loop() {

  caldaiaON = analogRead(A0);  //INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA 
  Ventola = analogRead(A2);  //INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA 
  // read the analog sensor:
  tempAria = analogRead(A1) * 0.5;    //sensore di temperatura LM35DZ ARIA
  sensorReading = tempAria;
  Serial.print ("Temp. Aria:  ");
  Serial.println (tempAria);

  dataString = "sensor1,";
  dataString += sensorReading;

  if ((tempAria > 0) and (tempAria < 35)){
    Serial.println("Aria fredda"); 
    digitalWrite(9, LOW);      //VENTILAZIONE DISATTIVATA
    digitalWrite(5, LOW);      //VENTILAZIONE DISATTIVATA
    Serial.print ("Ventola Spenta  ");
    Serial.println (Ventola, DEC);
  }
  else if ((tempAria > 35) and (tempAria < 100)){
    Serial.println ("Aria calda");
    digitalWrite(9, HIGH);    //VENTILAZIONE ATTIVATA
    digitalWrite(5, HIGH);    //VENTILAZIONE ATTIVATA
    Serial.print ("Ventola Accesa  ");
    Serial.println (Ventola,DEC);
  }

  otherSensorReadingAria = Ventola;  
  dataString += "\nsensor2,";
  dataString += otherSensorReadingAria;
  // you can append multiple readings to this String if your
  // Cosm feed is set up to handle multiple values:
  tempAcqua = (analogRead(A3) * 0.5) + 4;    // sensore di temperatura LM35DZ ACQUA
  otherSensorReading = tempAcqua;
  Serial.print("Temp. Acqua: ");
  Serial.println(tempAcqua);

  dataString += "\nsensor3,";
  dataString += otherSensorReading;

  if ((tempAcqua > 0) and (tempAcqua < 42)) {
    Serial.println("Acqua fredda"); 
    digitalWrite(8, HIGH);    // ACCENSIONA CALDAIA
    digitalWrite(6, HIGH);    //USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
    Serial.print("Caldaia Accesa ");
    Serial.println(caldaiaON, DEC);
  }
  else if ((tempAcqua > 42) and (tempAcqua < 100)){
    delay(2000);
    Serial.println ("Acqua Calda");
    digitalWrite(8, LOW);    //SPEGNIMENTO CALDAIA
    digitalWrite(6, LOW);    //USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
    Serial.print("Caldaia Spenta ");
    Serial.println(caldaiaON, DEC);
  }

  otherSensorReadingCaldaia = caldaiaON;
  dataString += "\nsensor4,";
  dataString += otherSensorReadingCaldaia; 
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if there's no net connection, but there was one last time
  // through the loop, then stop the client:
  if (!client.connected() && lastConnected) {
    Serial.println();
    Serial.println("disconnecting...");
    client.stop();
  }

  // if you're not connected, and ten seconds have passed since
  // your last connection, then connect again and send data: 

  if (millis() < lastConnectionTime) lastConnectionTime = millis();    // evita il blocco dopo 50gg poiché millis() si azzera

  if (!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    sendData(dataString);
  }
  // store the state of the connection for next time through
  // the loop:
  lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:

void sendData(String thisData) {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
    client.print("PUT /v2/feeds/");
    client.print(FEEDID);
    client.println(".csv HTTP/1.1");
    client.println("Host: api.cosm.com");
    client.print("X-ApiKey: ");
    client.println(APIKEY);
    client.print("User-Agent: ");
    client.println(USERAGENT);
    client.print("Content-Length: ");
    client.println(thisData.length());

    // last pieces of the HTTP PUT request:
    client.println("Content-Type: text/csv");
    client.println("Connection: close");
    client.println();

    // here's the actual content of the PUT request:
    client.println(thisData);
  } 
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    Serial.println();
    Serial.println("disconnecting...");
    client.stop();
  }
  // note the time that the connection was made or attempted:
  lastConnectionTime = millis();
}

Ciao Ettore,
grazie veramente dell'aiuto, il refresh è nettamente migliorato, ora l'aggiornamento avviene ogni 20 minuti.
Credi si riesca a far si che l'aggiornamento avvenga ogni 30 sec?
Mi servirebbe per controllare le accensioni della caldaia. Vorrei accertarmi che Arduino, per qualche motivo x, non mi faccia accidentalmente arrivare energia accidentalmente alla caldaia. Ciò dovrebbe succedere solo quando la temperatura dell'acqua all'interno del bollitore dell'impianto termosolare scende al di sotto dei 42°C.
Grazie

Se non ho capito male come funziona il codice, ogni 10 secondi (che mi sembrano veramente pochi) tu scarichi su un portale i dati che poi tramite il browser, immagino, tu voglia leggere.

Se è così mi viene un dubbio: fai il "refresh" della pagina quando sei collegato al sito?

Se non lo fai è possibile che i dati siano stato correttamente trasmessi, ricevuti e memorizzati sul server, ma che non vedi, perché la pagina non viene aggiornata se non dal temporizzatore di refresh del server che (ci scommetto) è appunto 20 minuti.

hè!... bella domanda... io faccio il refresh sulla pagina web ma finché non arriva l'aggiornamento dei dati non cambia nulla.
Non ho idea se ci siano dei "blocchi" da parte di pachube, in realtà può essere che ci siano dei rallentamenti voluti..., la cosa "curiosa" è che quando ho provato lo sketch con un solo sensore LM35 il tutto funzionava perfettamente... con 4 è rallentato tutto...

non sono sicurissimo, ma dopo il

client.println(thisData);

non dovrebbe esserci uno o due

client.println();

tra l'altro che output da sulla seriale? sarebbe molto utile

Ho provato ad eliminare " millis() - lastConnectionTime > postingInterval " ma da qual momento non ho più visto aggiornamenti sul sito di cosm.com

togliendoil controllo ad ogni ciclo (e parliamo di centinaia se non migliaia di cicli al secondo) stai a tutti gli effetti facendo un DOS sul server... Il fatto che i dati non vengano accettati mi porta a pensare che il sito "se ne freghi" delle richieste che arrivano troppo in fretta, se è così è prevedibile trovare qualche info sul sito.

Ciao Lesto,
grazie anche a te stiamo facendo progressi!
:slight_smile:
Dopo il comando "client.println();" ho aggiunto: " client.print("sensor1,"); client.print("sensor2,"); client.print("sensor3,"); client.print("sensor4,"); " adesso il rinnovo dei dati avviene ogni 70sec circa. Dal led TX della scheda ethernet noto che è proprio l'invio dei dati che avviene ogni 70sec. circa, quindi non è pachube che non rinnova il grafico ma è lo sketch che rallenta l'invio.
Ho provato anche a portare il valore: "const unsigned long postingInterval = 10 * 1000; " a 1*1000, ma non cambia quasi nulla.
I test adesso li sto facendo su una scheda "gemella" che ho in studio ed i dati si possono vedere on line su www.cosm.com, utente gelholder - Test temp. studio-
Per il momento la scheda Termosolare non è cablata al router.

/* IDE 1.01
 Ethernet shield attached to pins 10, 11, 12, 13
 Arduino uno
 This code is in the public domain.
 */

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

#define APIKEY         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // replace your Cosm api key here
#define FEEDID         XXXXX // replace your feed ID
#define USERAGENT      "TEST 2" // user agent is the project name

// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,1,12);

// initialize the library instance:
EthernetClient client;

// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
IPAddress server(216,52,233,121);      // numeric IP for api.cosm.com
//char server[] = "api.cosm.com";   // name address for Cosm API

unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
boolean lastConnected = false;                 // state of the connection last time through the main loop
const unsigned long postingInterval = 10 * 1000;  //delay between updates to Cosm.com

int caldaiaON = 0;               //INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA 
int Ventola = 0;  //INGRESSO ANALOGICO PER CONTROLLO WEB STATO VENTOLA 
float tempAria = 0.0;  //sensore di temperatura LM35DZ ARIA
float tempAcqua = 0.0;    // sensore di temperatura LM35DZ ACQUA
int sensorReading = 0;
String dataString = "";
int otherSensorReading = 0;  
int otherSensorReadingAria = 0;  
int otherSensorReadingCaldaia = 0;

void setup() {
  
  pinMode(5, OUTPUT);  //USCITA IN PARALLELO AL RELE CALDAIA PER VISUALIZZAZIONE WEB STATO ARIA   
  pinMode(6, OUTPUT);  //USCITA IN PARALLELO AL RELE CALDAIA PER VISUALIZZAZIONE WEB STATO CALDAIA   
  pinMode(8, OUTPUT);  //relay controllo ACQUA
  pinMode(9, OUTPUT);  //relay controllo ARIA

  // start serial port:
  Serial.begin(9600);
  // give the ethernet module time to boot up:
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // DHCP failed, so use a fixed IP address:
    Ethernet.begin(mac, ip);
  }
}

void loop() {

  caldaiaON = analogRead(A0);  //INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA 
  Ventola = analogRead(A2);  //INGRESSO ANALOGICO PER CONTROLLO WEB STATO VENTOLA 
  // read the analog sensor:
  tempAria = analogRead(A1) * 0.5;    //sensore di temperatura LM35DZ ARIA
  sensorReading = tempAria;
  Serial.print ("Temp. Aria:  ");
  Serial.println (tempAria);

  dataString = "sensor1,";
  dataString += sensorReading;

  if ((tempAria > 0) and (tempAria < 35)){
    Serial.println("Aria fredda"); 
    digitalWrite(9, LOW);      //VENTILAZIONE DISATTIVATA
    digitalWrite(5, LOW);      //VENTILAZIONE DISATTIVATA
    Serial.print ("Ventola Spenta  ");
    Serial.println (Ventola, DEC);
  }
  else if ((tempAria > 35) and (tempAria < 100)){
    Serial.println ("Aria calda");
    digitalWrite(9, HIGH);    //VENTILAZIONE ATTIVATA
    digitalWrite(5, HIGH);    //VENTILAZIONE ATTIVATA
    Serial.print ("Ventola Accesa  ");
    Serial.println (Ventola,DEC);
  }

  otherSensorReadingAria = Ventola;  
  dataString += "\nsensor2,";
  dataString += otherSensorReadingAria;
  // you can append multiple readings to this String if your
  // Cosm feed is set up to handle multiple values:
  tempAcqua = (analogRead(A3) * 0.5) + 5;    // sensore di temperatura LM35DZ ACQUA
  otherSensorReading = tempAcqua;
  Serial.print("Temp. Acqua: ");
  Serial.println(tempAcqua);

  dataString += "\nsensor3,";
  dataString += otherSensorReading;

  if ((tempAcqua > 0) and (tempAcqua < 42)) {
    Serial.println("Acqua fredda"); 
    digitalWrite(8, HIGH);    // ACCENSIONA CALDAIA
    digitalWrite(6, HIGH);    //USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
    Serial.print("Caldaia Accesa ");
    Serial.println(caldaiaON, DEC);
  }
  else if ((tempAcqua > 42) and (tempAcqua < 100)){
    delay(2000);
    Serial.println ("Acqua Calda");
    digitalWrite(8, LOW);    //SPEGNIMENTO CALDAIA
    digitalWrite(6, LOW);    //USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
    Serial.print("Caldaia Spenta ");
    Serial.println(caldaiaON, DEC);
  }

  otherSensorReadingCaldaia = caldaiaON;
  dataString += "\nsensor4,";
  dataString += otherSensorReadingCaldaia; 
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if there's no net connection, but there was one last time
  // through the loop, then stop the client:
  if (!client.connected() && lastConnected) {
    Serial.println();
    Serial.println("disconnecting...");
    client.stop();
  }

  // if you're not connected, and ten seconds have passed since
  // your last connection, then connect again and send data: 

  if (millis() < lastConnectionTime) lastConnectionTime = millis();    // evita il blocco dopo 50gg poiché millis() si azzera

  if (!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    sendData(dataString);
  }
  // store the state of the connection for next time through
  // the loop:
  lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:

void sendData(String thisData) {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
    client.print("PUT /v2/feeds/");
    client.print(FEEDID);
    client.println(".csv HTTP/1.1");
    client.println("Host: api.cosm.com");
    client.print("X-ApiKey: ");
    client.println(APIKEY);
    client.print("User-Agent: ");
    client.println(USERAGENT);
    client.print("Content-Length: ");
    client.println(thisData.length());

    // last pieces of the HTTP PUT request:
    client.println("Content-Type: text/csv");
    client.println("Connection: close");
    client.println();

    // here's the actual content of the PUT request:

    client.println(thisData);
     client.print("sensor1,");
      client.print("sensor2,");
       client.print("sensor3,");
       client.print("sensor4,");
    
  } 
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    Serial.println();
    Serial.println("disconnecting...");
    client.stop();
  }
  // note the time that the connection was made or attempted:
  lastConnectionTime = millis();
}

lesto:
non sono sicurissimo, ma dopo il

client.println(thisData);

non dovrebbe esserci uno o due

client.println();

Cosa intendi?

Se vuoi avere due arduini collegati alla stessa rete, devi assegnargli due MAC address diversi, cambiane uno dei due:

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

Questo è sbagliato:

client.print("sensor1,");
client.print("sensor2,");
client.print("sensor3,");
client.print("sensor4,");

perchè i dati li hai già inseriti nella stringa "thisData" e poi stai inviando solo le etichette...formattate nel modo sbagliato.

Dicci cosa succede quando apri il monitor seriale, come vengono scritti gli output?

Per di più, su Cosm c'è anche una pagina per il debug, dove puoi vedere il codice html che viene ricevuto dal server ed altre cose, prova a dargli un'occhiata

secondo standard le richieste get devono terminare con 2 \n\r consecutivi, non mi stupirei se fosse così anche per le post.

quoto sul fatto che le print che ha aggiunto siano errate, il fatto ceh gli facciano vedere dei dati in più mi fa tanto pensare che appunto la post sia formattata male, in particolare la "soddisfazione" del Content-Length inviato potrfebbe essere la chiave.

Rieccomi qua,
ho eliminato i vari:

       client.print("sensor1,");
       client.print("sensor2,");
       client.print("sensor3,");
       client.print("sensor4,");

Procede bene, il refresh è ogni 45sec. circa.

Online sto collegando una sola scheda, quella che ho in studio, di tanto in tanto provo anche l'altra, ma è sempre solo una connessa alla rete. Comunque avendo su una il MAC address:

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

come dovrei impostare il MAC address dell'altra per non aver conflitti?

Ritornando al discorso refresh, scusami lesto, ma no ho idea di come dovrei inserire i 2\n\r ed il Content.Lenght...

Allego una foto del Debug Info ed una seconda degli output della seriale.

In questo momento il led verde TX della scheda ethernet lampeggia ogni 45sec. circa, che corrisponde più o meno con le tempistiche che si vedono sul Debug info.
Dai che ce la facciamo!

stampa a video la stringa che invii dei dati, e poi mostra dal sito la richiesta che invece ha ricevuto...

in oltre dopo che hai inviato i dati, dovresti attendere una risposta dal server, che mi piacerebbe vedere dato che contiene un codice che identifica l'ok (200) o gli eventuali errori.
è anche possibile che se chiudi la connessione PRIMA che il server ti risponda, allora il tuo dato non sia stato ancora elaborato, ed il server vedendo che la connessione è chiusa decide, per risparmiare tempo e risorse, di non elaborarla più.

Ciao Lesto,
mi puoi spiegare come fare a visualizzare le stringe di cui mi parli?
Grazie

nel tuo codice con delle Serial.println, dal sito sotto al grafico hai le varie richieste con un pulsante (log mi pare), CREDo che ti faccia vedere la richiesta come l'ha "capita" il server

Ciao Lesto,
ti allego una foto del debug di cosm... è quello che mi dicevi di controllare?
Grazie

Ciao lesto,
scusa se ne approfitto, tu mi sai dire come dovrei impostare il MAC adderss di una seconda scheda ethernet nella stessa rete di quella che è già installata?
Grazie

per impostare un MAC address diverso da quello dell'altro arduino (e diverso anche da ogni altro oggetto collegato in rete), basta che nell'array dove specifichi il MAC address cambi uno o più dei 6 valori, ad ognuno puoi associare un valore compreso tra 0 e 255 esprimendoli in esadecimale (quindi da 0x00 a 0xFF) oppure, puoi scrivere quelli che trovi sull'etichetta attaccata sotto lo shield.

Per risolvere molto alla spicciolata dovrebbe essere sufficiente invertire due elementi dell'aray:

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xED, 0xFE};

Domanda: stai ancora usando il codice originale, non quello di cyberhs vero? In quello modificato da cyberhs la variabile String viene dichiarata globalmente, ma poi dentro il loop non viene mai resettata da qualche parte, questo significa che ad ogni loop aggiungi in coda le nuove letture, quindi Cosm.com potrebbe avere dei problemi ad interpretarle, ma fatto ancor più grave, quella stringa continua a crescere fino ad occupare tutta la RAM dell'Arduino con la conseguenza di imprevedibili da parte dell'Arduino.

Quello che intendeva dire lesto è di aggiungere anche una stampa sulla seriale di quello che stai mandado a Cosm.com, quindi in parole povere, sotto

client.println(thisData);

aggiungi:

Serial.println(thisData);