Arduino Forum

International => Italiano => Software => Topic started by: elvis on Aug 06, 2012, 06:42 pm

Title: problema con pachube (www.cosm.com)
Post by: elvis on Aug 06, 2012, 06:42 pm
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


Code: [Select]
   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();
}

Title: Re: problema con pachube (www.cosm.com)
Post by: Federico_Vanzati on Aug 06, 2012, 08:04 pm
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.
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 06, 2012, 10:26 pm
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
Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 07, 2012, 12:35 am
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
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 07, 2012, 06:15 pm
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... :-) (anonimo)
Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 07, 2012, 07:16 pm
Caro elvis,

ti ho inserito il codice come dovrebbe essere strutturato.

Ovviamento non ho avuto modo di testarlo a fondo.

Ettore Massimo Albani

Code: [Select]

/* 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();
}


Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 08, 2012, 01:38 am
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

Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 08, 2012, 02:24 am
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.
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 08, 2012, 09:30 am
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...
Title: Re: problema con pachube (www.cosm.com)
Post by: lestofante on Aug 08, 2012, 10:14 am
non sono sicurissimo, ma dopo il
Quote
client.println(thisData);

non dovrebbe esserci uno o due
Quote
client.println();



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


Quote
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.
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 08, 2012, 02:51 pm
Ciao Lesto,
grazie anche a te stiamo facendo progressi!
:-)
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.

Code: [Select]

/* 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();
}

Title: Re: problema con pachube (www.cosm.com)
Post by: Federico_Vanzati on Aug 08, 2012, 09:25 pm

non sono sicurissimo, ma dopo il
Quote
client.println(thisData);

non dovrebbe esserci uno o due
Quote
client.println();



Cosa intendi?

Se vuoi avere due arduini collegati alla stessa rete, devi assegnargli due MAC address diversi, cambiane uno dei due:
Quote
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};


Questo è sbagliato:
Quote
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
Title: Re: problema con pachube (www.cosm.com)
Post by: lestofante on Aug 08, 2012, 11:18 pm
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.
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 09, 2012, 08:18 am
Rieccomi qua,
     ho eliminato i vari:
Code: [Select]

       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:
Code: [Select]

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!
Title: Re: problema con pachube (www.cosm.com)
Post by: lestofante on Aug 09, 2012, 09:47 am
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ù.
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 09, 2012, 03:01 pm
Ciao Lesto,
    mi puoi spiegare come fare a visualizzare le stringe di cui mi parli?
Grazie
Title: Re: problema con pachube (www.cosm.com)
Post by: lestofante on Aug 09, 2012, 05:06 pm
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
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 11, 2012, 08:53 am
Ciao Lesto,
     ti allego una foto del debug di cosm... è quello che mi dicevi di controllare?
Grazie
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 11, 2012, 08:56 am
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
Title: Re: problema con pachube (www.cosm.com)
Post by: Federico_Vanzati on Aug 11, 2012, 10:00 am
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:
Quote
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
Code: [Select]
client.println(thisData);
aggiungi:
Code: [Select]
Serial.println(thisData);
Title: Re: problema con pachube (www.cosm.com)
Post by: lestofante on Aug 11, 2012, 11:23 am
da ll'immagine sembra che il problema sia solo a lato arduino, tranne per uno spazio prima di "sensor1"
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 11, 2012, 11:57 am
Grazie lesto e grazie Federico,
    a dir il vero sto usando ancora il codice riscritto da Cyberhs, ma in effetti, e non ne capivo i motivi, l'altra sera si sonbo "inkiodate" entrambe le schede che sto usando, sia quella dei test che ho in studio che quella che ho montata vicino al bollitore del termosolare.
Le ho lasciate spente qualche ora ed ho ricaricato il codice, adesso funzionano, ma mi sembra di capire che si ribloccherano a breve...
Quindi, ricarico lo sketch che ho pubblicato all'inizio di questo topic e ci aggiungo i due comandi che mi hai detto?
Grazie
Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 11, 2012, 01:54 pm
Per Federico Vanzati:

guarda che la variabile String dataString viene resettata nel loop con la riga:   dataString = "sensor1,";

Ettore Massimo Albani

PS: ho risolto il problema di Alba e Tramonto riscrivendo una routine che funziona. Il problema della tua libreria non risiede (a quanto pare) nel cambio di IDE, ma nella sua logica. Ho confrontato con dei calcolatori on line e la tua libreria non fornisce risultati corretti. Fammi sapere. Ciao!



Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 11, 2012, 02:22 pm
Ciao Ettore,
   qundi, mantengo la tua libreria ed aggiungo:

Code: [Select]

client.println(thisData);aggiungi:

Serial.println(thisData);


in modo tale da vedere che dati escono da arduino?
Grazie
Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 11, 2012, 02:38 pm
Caro elvis,

mandami il codice così lo esamino meglio.

Ettore Massimo Albani
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 11, 2012, 02:46 pm
Ho aggiunto
Code: [Select]

Serial.println(thisData);

ma non vedo cose diverse da prima sulla stampa della seriale...

ecco il codice che sto usando ora su cosm username: gelholder "test Termosolare":
Code: [Select]


/* 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, 0xBD};

// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,11,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 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);
    Serial.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();
}




Grazie
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 11, 2012, 03:11 pm
In questo momento ho una scheda Arduino + ethernet in studio ed un'altra Arduino + ethernet accanto al bollitore termosolare ed entrambe connesse alla stessa rete.
Se andate su cosm e cercate gelholder noterete che la scheda Termosolare fa il refresh ogni 20min. circa, mentre quella in studio ogni 70sec. circa.
Considerato che lo sketch è lo stesso (con le uniche differenze di mac address, IP e impostazioni cosm...) è la temperatura ambiente che influenza la velocità di aggiornamento dei dati?
In studio ci sono 24°C, accanto al bollitore termosolare 32°C...
Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 11, 2012, 04:33 pm
Caro elvis,

il codice aveva un errore piuttosto grave che forse inficiava la ricezione da parte del sito.

L'assegnazione:
dataString += otherSensorReading;
funziona con stringhe e non con interi o peggio float!

Poiché non era scritto molto chiaro, mi sono permesso di modificarlo.

Prova adesso.

Ettore Massimo Albani

Code: [Select]

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

byte mac[] = {                                              // MAC address of Ethernet controller
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xBD};

IPAddress ip(192, 168, 11, 12);                             // IP address on your network here

EthernetClient client;                                      // initialize the library instance:

// 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 = 10000;                // delay between updates to Cosm.com

String DataString = "";                                     // stringa per invio dati
char Buffer[10];                                            // buffer per dftostr()

int CaldaiaStato = 0;                                       // INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA
int VentolaStato = 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;                                      // lettura sensori

void setup() {
 
  pinMode(A0, INPUT_PULLUP);                                // stato caldaia
  pinMode(A1, INPUT_PULLUP);                                // sensore di temperatura aria (LM35DZ)
  pinMode(A2, INPUT_PULLUP);                                // stato ventola
  pinMode(A3, INPUT_PULLUP);                                // sensore di temperatura acqua (LM35DZ)

  pinMode(8, OUTPUT);                                       // relay caldaia ON/OFF
  pinMode(6, OUTPUT);                                       // relay caldaia ON/OFF (replica)
 
  pinMode(9, OUTPUT);                                       // relay ventola ON/OFF
  pinMode(5, OUTPUT);                                       // relay ventola ON/OFF (replica)

  Serial.begin(9600);

  if (Ethernet.begin(mac) == 0) {                           // start the Ethernet connection
    Ethernet.begin(mac, ip);                                // DHCP failed, so use a fixed IP address
    Serial.println("Failed to configure Ethernet using DHCP");
  }
}

void loop() {

  TempAria = analogRead(A1) * 0.5;                          // temperatura aria

  Serial.print("Temp. Aria: ");
  Serial.println(TempAria, 1);

  if ((TempAria > 0) and (TempAria < 35)) {
    digitalWrite(9, LOW);                                   // relay ventola OFF
    digitalWrite(5, LOW);                                   // relay ventola OFF (replica)
    Serial.println("Aria fredda - Ventola OFF");
  }
  else if ((TempAria > 35) and (TempAria < 100)) {
    digitalWrite(9, HIGH);                                  // relay ventola ON
    digitalWrite(5, HIGH);                                  // relay ventola ON (replica)
    Serial.println("Aria calda - Ventola ON");
  }

  TempAcqua = analogRead(A3) * 0.5 + 4;                     // temperatura acqua

  Serial.print("Temp. Acqua: ");
  Serial.println(TempAcqua, 1);

  if ((TempAcqua > 0) and (TempAcqua < 42)) {
    digitalWrite(8, HIGH);                                  // relay caldaia ON
    digitalWrite(6, HIGH);                                  // relay caldaia ON (replica)
    Serial.println("Acqua fredda - Caldaia ON");
  }
  else if ((TempAcqua > 42) and (TempAcqua < 100)) {
    digitalWrite(8, LOW);                                  // relay caldaia OFF
    digitalWrite(6, LOW);                                  // relay caldaia OFF (replica)
    Serial.println("Acqua Calda - Caldaia OFF");
  }

  CaldaiaStato = analogRead(A0);                           // stato caldaia
  VentolaStato = analogRead(A2);                           // stato ventola

  DataString = "Sensor1,";
  DataString += FloatFormat(TempAria, 10, 1, false, true);
  DataString += "\nSensor2,";
  DataString += FloatFormat(TempAcqua, 10, 1, false, true);
  DataString += "\nsensor3,";
  DataString += String(CaldaiaStato, DEC);
  DataString += "\nsensor4,";
  DataString += String(VentolaStato, DEC);

  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);
    Serial.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();
}

String FloatFormat(float X, char Size, unsigned char Decimal, boolean Plus, boolean AutoReduce) {

  char Buffer[Size + 1];

  String Z = dtostrf(X, Size, Decimal, Buffer);
  if (Plus && X > 0) Z[Z.lastIndexOf(' ')] = '+';
  if (AutoReduce) Z.trim();

  return Z;
}
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 11, 2012, 04:51 pm
Provo subito.
Grazie
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 11, 2012, 05:05 pm
Ciao Ettore,
    ho caricato lo sketch sull'arduino che ho in studio, ma se vai vedere la mia pagina in cosm, vedrai che adesso abbiamo dei valori di temperatura molto sballati.
In compenso il refresh avviene ogni 50sec. circa...
Title: Re: problema con pachube (www.cosm.com)
Post by: Federico_Vanzati on Aug 11, 2012, 05:17 pm
@Ettore: sulla stringa hai ragionissimo, m'era sfuggito. Riguardo la libreria per il calcolo di alba e tramonto mi hai fatto ricordare una mail che mi hai mandato un po' di tempo fa. Però sarà opportuno ripescare il vecchio topi oppure aprirne uno nuovo o continuare per email.


Con Arduino puoi sommare un intero ad una stringa perchè le dovute conversioni vengono fatte dalla apposita libreria per le stringhe (fino a 4 cifre). Con i float non è stato implementato. Elvis alla fine si salvava perchè tramite l'assegnamento di un float ad int otteneva solo la parte intera del float...un piccolo spreco di variabili ma funzionale.
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 12, 2012, 10:24 am
Bene, sono arrivato alla conclusione che i dati dalle due schede arduino che ho installato hanno unntenpo di refresh molto diverso perché lavorano a temperature diverse.
Come posso fare per avere un refresh ogni 30sec. circa? C'è un modo per inviare i dati a cosm ogni X  cicli di lettura dei sensori?
Grazie
Title: Re: problema con pachube (www.cosm.com)
Post by: lestofante on Aug 12, 2012, 02:43 pm
è vero che ci possono essere delle differenze per via della temperatura, ma parliamo di minuto al giorno a dir tanto, prendendo come base i dati del swrtc.
comunque in caso la soluzione è appunto un RTC, ovvero un piccolo orologio indipendente. Prendili che copensano la temperatura
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 12, 2012, 03:48 pm
Caspita, allora cosa può essere? ho invertito entrambi le schede ma ottengo lo stesso risultato, l'unica differenza è che uno dei sensori LM35 montati sull'impianto termosolare ha un cavo lungo 80cm circa. Per il resto è tutto identico.
Vedo che il led giallo (L) della scheda ethernet lampeggia veramente a frequenze diverse. E' molto più veloce sulla scheda che ho in laboratorio a 24°C, ma in effetti, oggi in centrale termica ci sono solo 28°C...
Non capisco dove sia il problema...
Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 12, 2012, 05:16 pm
Ti sei accorto, vero, che nel mio sketch ho inviato nell'ordine Temp. Aria, Temp Acqua, Ventola e Caldaia?

In COSM ho notato che l'ordine è Temp. Aria, Ventola, Temp Acqua e Caldaia.

Quindi basta che rimetti a posto l'ordine nello sketch, scambiando la posizione di Temp Acqua e Ventola.

Comunque, credo proprio sia impossibile scendere al di sotto dei 50 s di refresh.

Ettore Massimo Albani
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 12, 2012, 07:05 pm
Ciao Ettore,
    sull'Arduino che ho in studio ho ricaricato il file che mi hai passato, se vai a vedere il device "Ettore" su cosm (gelholder) noterai che le letture dei sensori LM35 danno dei valori molto strani.
Di positivo però è che il refresh avviene ogni 50sec. circa. (tempo ottimo).

Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 13, 2012, 02:15 am
Ho modificato il codice per calcolare meglio le temperature secondo le cartteristiche del tuo sensore (alim. 5V e range tra +2°C e 100°C).

Inoltre ho portato i due segnali "finti" analogici (Caldaia e Ventola) allo stato di digitali (0 e 1).

CI sarebbe un'altra cosa da fare, il "resampling" delle misure di temperatura per evitare il rumore, ma per ora prova così.

Ettore Massimo Albani

Code: [Select]

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

byte mac[] = {                                              // MAC address of Ethernet controller
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xBD};

IPAddress ip(192, 168, 11, 12);                             // IP address on your network here

EthernetClient client;                                      // initialize the library instance:

// 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 = 10000;                // delay between updates to Cosm.com

String DataString = "";                                     // stringa per invio dati
char Buffer[10];                                            // buffer per dftostr()

int CaldaiaStato = 0;                                       // INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA
int VentolaStato = 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;                                      // lettura sensori

void setup() {

  analogReference(DEFAULT);                                 // DEFAULT (5V), INTERNAL (1,1V), EXTERNAL (0÷5V)

  pinMode(A0, INPUT_PULLUP);                                // stato caldaia
  pinMode(A1, INPUT_PULLUP);                                // sensore di temperatura aria (LM35DZ) alim. 5V
  pinMode(A2, INPUT_PULLUP);                                // stato ventola
  pinMode(A3, INPUT_PULLUP);                                // sensore di temperatura acqua (LM35DZ) alim. 5V

  pinMode(8, OUTPUT);                                       // relay caldaia ON/OFF
  pinMode(6, OUTPUT);                                       // relay caldaia ON/OFF (replica)

  pinMode(9, OUTPUT);                                       // relay ventola ON/OFF
  pinMode(5, OUTPUT);                                       // relay ventola ON/OFF (replica)

  Serial.begin(9600);

  if (Ethernet.begin(mac) == 0) {                           // start the Ethernet connection
    Ethernet.begin(mac, ip);                                // DHCP failed, so use a fixed IP address
    Serial.println("Failed to configure Ethernet using DHCP");
  }
}

void loop() {

  CaldaiaStato = analogRead(A0);                            // stato caldaia
  delayMicroseconds(120);                                   // 120 µs (min time reading = 100 µs x channel)

  TempAria = analogRead(A1) * (100 - 2) / 1024 + 2;         // temperatura aria in °C (10 mV/°C, range +2°C - +100°C)
  delayMicroseconds(120);                                   // 120 µs (min time reading = 100 µs x channel)

  VentolaStato = analogRead(A2);                            // stato ventola
  delayMicroseconds(120);                                   // 120 µs (min time reading = 100 µs x channel)

  TempAcqua = analogRead(A3) * (100 - 2) / 1024 + 2;        // temperatura acqua in °C (10 mV/°C, range +2°C - +100°C)
  delayMicroseconds(120);                                   // 120 µs (min time reading = 100 µs x channel)

  CaldaiaStato = map(CaldaiaStato, 0, 1023, 0, 1);         
  VentolaStato = map(VentolaStato, 0, 1023, 0, 1);

  Serial.print("Temp. Aria: ");
  Serial.println(TempAria, 1);

  if ((TempAria > 0) and (TempAria < 35)) {
    digitalWrite(9, LOW);                                   // relay ventola OFF
    digitalWrite(5, LOW);                                   // relay ventola OFF (replica)
    Serial.println("Aria fredda - Ventola OFF");
  }
  else if ((TempAria > 35) and (TempAria < 100)) {
    digitalWrite(9, HIGH);                                  // relay ventola ON
    digitalWrite(5, HIGH);                                  // relay ventola ON (replica)
    Serial.println("Aria calda - Ventola ON");
  }

  Serial.print("Temp. Acqua: ");
  Serial.println(TempAcqua, 1);

  if ((TempAcqua > 0) and (TempAcqua < 42)) {
    digitalWrite(8, HIGH);                                  // relay caldaia ON
    digitalWrite(6, HIGH);                                  // relay caldaia ON (replica)
    Serial.println("Acqua fredda - Caldaia ON");
  }
  else if ((TempAcqua > 42) and (TempAcqua < 100)) {
    digitalWrite(8, LOW);                                  // relay caldaia OFF
    digitalWrite(6, LOW);                                  // relay caldaia OFF (replica)
    Serial.println("Acqua Calda - Caldaia OFF");
  }

  DataString = "TempAria,";
  DataString += FloatFormat(TempAria, 10, 1, false, true);
  DataString += "\nVentola,";
  DataString += String(VentolaStato, DEC);
  DataString += "\nTempAcqua,";
  DataString += FloatFormat(TempAcqua, 10, 1, false, true);
  DataString += "\nCaldaia,";
  DataString += String(CaldaiaStato, DEC);

  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);
    Serial.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();
}

String FloatFormat(float X, char Size, unsigned char Decimal, boolean Plus, boolean AutoReduce) {

  char Buffer[Size + 1];

  String Z = dtostrf(X, Size, Decimal, Buffer);
  if (Plus && X > 0) Z[Z.lastIndexOf(' ')] = '+';
  if (AutoReduce) Z.trim();

  return Z;
}
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 13, 2012, 01:03 pm
Ho capito!
Un macello, ho smontato tutto ho invertito le schede nuovamente ... etc...etc... ed alla fine ho capito dov'è il problema del refresh con tempi abissali!
Code: [Select]

/* 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         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // 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,22);

// 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 = 1;  //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 < 27)){
    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 > 27) 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);
    Serial.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();
}


Accade che se l'acqua all'interno del bollitore è ad una temperatura <42°C va tutto bene perché non è impostato nessun delay, se invece l'acqua ha una temperatura >42°C il codice è:
Code: [Select]

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);
  }


ed il delay(2000) sullo spegnimento della caldaia mi manda in crisi tutto e per non so quale motivo il refresh avviene ogni 20/30min circa.

Il delay per lo spegnimento della caldaia è molto importante per evitare che per differenze di 0,5°C o di 1°C la caldaia si accenda e si spenga in continuazione.

A questo punto non ho la minima idea di come risolvere la cosa...

P.S. x Ettore: Ho provato il nuovo codice ma continuo ad avere letture di temperatura completamente sballate. Io però non sono in grado di capirne il  motivo...
Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 13, 2012, 06:59 pm
Cominciamo dall'inizio.
Non so dove tu abbia trovato quello schema, ma è errato! Infatti il resistore sull'uscita del LM35DZ deve essere in SERIE e, per sicurezza, deve avere un valore di 2k. Non deve essere posto a massa. Se il cavo (rigorosamente schermato) è molto lungo, potrebbe essere necessario un filtro composto da un condensatore da 1uF con in serie un resistore da 75 ohm verso massa, entrambi posti vicino all'integrato (vedi Typical Applications http://www.ti.com/lit/ds/symlink/lm35.pdf (http://www.ti.com/lit/ds/symlink/lm35.pdf)).
Nessuno si è accorto (me compreso) che l'istruzione if ((TempAcqua > 0) and (TempAcqua <= 42)) è sbagliata! L'istruzione corretta è if ((TempAcqua > 0.0) && (TempAcqua <= 42.0)).
Non è necessario un secondo else if, ma può bastare un semplice else.
Non è necessario usare per Ventola e Caldaia gli ingressi analogici per COSM, quindi lo sketch e lo schema risultano molto più semplici.
Questa volta spero che ci siamo.
Ettore Massimo Albani
Code: [Select]

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

byte mac[] = {                                              // MAC address of Ethernet controller
 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xBD};

IPAddress ip(192, 168, 11, 12);                             // IP address on your network here

EthernetClient client;                                      // initialize the library instance:

// 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 = 10000;                // delay between updates to Cosm.com

String DataString = "";                                     // stringa per invio dati
char Buffer[10];                                            // buffer per dftostr()

boolean Caldaia = LOW;                                      // stato caldaia (LED Caldaia)
boolean Ventola = LOW;                                      // stato ventola (LED Ventola)

int Valore = 0;                                             // valore sensori analogici
float TempAria = 0.0;                                       // sensore di temperatura LM35DZ aria
float TempAcqua = 0.0;                                      // sensore di temperatura LM35DZ acqua

void setup() {

 analogReference(DEFAULT);                                 // DEFAULT (5V), INTERNAL (1,1V), EXTERNAL (0÷5V)

 pinMode(A1, INPUT);                                       // sensore di temperatura aria (LM35DZ) alim. 5V, out con res. 2k in serie
 pinMode(A3, INPUT);                                       // sensore di temperatura acqua (LM35DZ) alim. 5V, out con res. 2k in serie

 pinMode(8, OUTPUT);                                       // relay caldaia ON/OFF
 pinMode(9, OUTPUT);                                       // relay ventola ON/OFF

 Serial.begin(9600);

 if (Ethernet.begin(mac) == 0) {                           // start the Ethernet connection
   Ethernet.begin(mac, ip);                                // DHCP failed, so use a fixed IP address
   Serial.println("Failed to configure Ethernet using DHCP");
 }
}

void loop() {

 Valore = analogRead(A1);                                  // valore sensore aria
 TempAria = float(Valore * 5 * (100 - 2) / 1024 + 2);      // temperatura aria in °C (10 mV/°C, range +2°C - +100°C)
 delayMicroseconds(120);                                   // 120 µs (min time reading = 100 µs x channel)

 Valore = analogRead(A3);                                  // valore sensore acqua
 TempAcqua = float(Valore * 5 * (100 - 2) / 1024 + 2);     // temperatura acqua in °C (10 mV/°C, range +2°C - +100°C)
 delayMicroseconds(120);                                   // 120 µs (min time reading = 100 µs x channel)

 Serial.print("Temp. Aria: ");
 Serial.println(TempAria, 1);

 Serial.print("Temp. Acqua: ");
 Serial.println(TempAcqua, 1);

 if ((TempAria > 0.0) && (TempAria <= 35.0)) {
   digitalWrite(9, LOW);                                   // relay ventola OFF
   Serial.println("Aria fredda - Ventola OFF");
  }
  else {
   digitalWrite(9, HIGH);                                  // relay ventola ON
   Serial.println("Aria calda - Ventola ON");
 }

 if ((TempAcqua > 0.0) && (TempAcqua <= 42.0)) {
   digitalWrite(8, HIGH);                                  // relay caldaia ON
   Serial.println("Acqua fredda - Caldaia ON");
 }
 else {
   digitalWrite(8, LOW);                                   // relay caldaia OFF
   Serial.println("Acqua Calda - Caldaia OFF");
 }

 DataString = "TempAria,";
 DataString += FloatFormat(TempAria, 10, 1, false, true);
 DataString += "\nVentola,";
 DataString += String(Ventola, DEC);
 DataString += "\nTempAcqua,";
 DataString += FloatFormat(TempAcqua, 10, 1, false, true);
 DataString += "\nCaldaia,";
 DataString += String(Caldaia, DEC);

 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);
   Serial.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();
}

String FloatFormat(float X, char Size, unsigned char Decimal, boolean Plus, boolean AutoReduce) {

 char Buffer[Size + 1];

 String Z = dtostrf(X, Size, Decimal, Buffer);
 if (Plus && X > 0) Z[Z.lastIndexOf(' ')] = '+';
 if (AutoReduce) Z.trim();

 return Z;
}  


Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 13, 2012, 09:30 pm
PERFETTO!
Ettore, so che oramai ne ho approfittato un po' troppo della tua pazienza...
ma come faccio ad inserire un delay per lo spegnimento della caldaia senza che questo mi blocchi il refresh ogni 60sec?
Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 14, 2012, 04:38 am
Sono contento che tutto ora funzioni (ne avevo fatto un punto d'onore!)  :D

La soluzione al problema non è un ritardo, ma l'inserimento di un'isteresi (diciamo 0,5 - 1 °C).

Ora non ho tempo, ma se hai un po' di pazienza ti risolvo il problema.

Ettore Massimo Albani
Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 14, 2012, 06:51 am
Ogni promessa è debito...

Modificato il codice aggiungendo, tra le altre cose, l'isteresi settata ad 1°C, ma modicabile come tutti gli altri parametri.

Perciò la caldaia si accenderà con una temperatura superiore a 42+1 °C e si spegnerà  con una temperatura di 42-1 °C.

Lo stesso vale per la ventola.

I sensori, avendo solo una tensione positiva, non possono misurare meno di 2°C

Ettore Massimo Albani

PS: mi devi da bere... :D
Code: [Select]


/* IDE 1.0.1
Ethernet shield attached to pins 10, 11, 12, 13
Arduino uno
modified by Ettore Massimo Albani
*/

#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

byte mac[] = {                                              // MAC address of Ethernet controller
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xBD};

IPAddress ip(192, 168, 11, 12);                             // IP address on your network here

EthernetClient client;                                      // initialize the library instance:

// 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 = 10000;                // delay between updates to Cosm.com (10 s)

String DataString = "";                                     // stringa per invio dati
char Buffer[10];                                            // buffer per dftostr()

boolean Caldaia = LOW;                                      // stato caldaia (LED Caldaia)
boolean Ventola = LOW;                                      // stato ventola (LED Ventola)

const float AnaRef = 5.0;                                   // valore tensione (5V)
const unsigned int Risoluzione = 1024;                      // risoluzione (10 bit)

const float RangeMin = 2.0;                                 // temperatura minima °C sensore LM35DZ (alim. 5V, out con res. 2k in serie)
const float RangeMax = 100.0;                               // temperatura massima °C sensore LM35DZ (alim. 5V, out con res. 2k in serie)
const float Incremento = 0.01;                              // incremento (10 mV/°C)

float Volt = 0;                                             // valore sensori analogici in volt

const float Isteresi = 1.0;                                 // isteresi (1 °C)

float TempAria = 0.0;                                       // temperatura aria
float TempAriaMin = 2.0;                                    // soglia inferiore temperatura aria (min 2 °C = RangeMin)
float TempAriaMax = 35.0;                                   // soglia superiore temperatura aria (max 100 °C = RangeMax)

float TempAcqua = 0.0;                                      // temperatura acqua
float TempAcquaMin = 2.0;                                   // soglia inferiore temperatura acqua (min 2 °C)
float TempAcquaMax = 42.0;                                  // soglia superiore temperatura acqua (max 100 °C)

void setup() {

  analogReference(DEFAULT);                                 // DEFAULT (5V), INTERNAL (1,1V), EXTERNAL (0÷5V)

  pinMode(A1, INPUT);                                       // sensore di temperatura aria
  pinMode(A3, INPUT);                                       // sensore di temperatura acqua

  pinMode(8, OUTPUT);                                       // relay caldaia ON/OFF
  pinMode(9, OUTPUT);                                       // relay ventola ON/OFF

  Serial.begin(9600);

  if (Ethernet.begin(mac) == 0) {                           // start the Ethernet connection
    Ethernet.begin(mac, ip);                                // DHCP failed, so use a fixed IP address
    Serial.println("Failed to configure Ethernet using DHCP");
  }
}

void loop() {

  Volt = analogRead(A1) * AnaRef / Risoluzione;             // valore sensore aria in volt
  TempAria = Volt / Incremento + RangeMin;                  // temperatura aria in °C
  delayMicroseconds(120);                                   // 120 µs (min time reading = 100 µs x channel)

  Volt = analogRead(A3) * AnaRef / Risoluzione;             // valore sensore acqua in volt
  TempAcqua = Volt / Incremento + RangeMin;                 // temperatura acqua in °C
  delayMicroseconds(120);                                   // 120 µs (min time reading = 100 µs x channel)

  Serial.print("Temp. Aria: ");
  Serial.println(TempAria, 1);

  Serial.print("Temp. Acqua: ");
  Serial.println(TempAcqua, 1);

  if (TempAria > (TempAriaMax + Isteresi)) {
    digitalWrite(9, HIGH);                                  // relay ventola ON
    Serial.println("Aria calda - Ventola ON");
  }
  else if (TempAria < (TempAriaMax - Isteresi)) {
    digitalWrite(9, LOW);                                   // relay ventola OFF
    Serial.println("Aria fredda - Ventola OFF");
  }

  if (TempAcqua > (TempAcquaMax + Isteresi)) {
    digitalWrite(8, LOW);                                   // relay caldaia OFF
    Serial.println("Acqua Calda - Caldaia OFF");
  }
  else if (TempAcqua < (TempAcquaMax - Isteresi)) {
    digitalWrite(8, HIGH);                                  // relay caldaia ON
    Serial.println("Acqua fredda - Caldaia ON");
  }

  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)) {
    DataString = "TempAria,";
    DataString += FloatFormat(TempAria, 10, 1, false, true);
    DataString += "\nVentola,";
    DataString += String(Ventola, DEC);
    DataString += "\nTempAcqua,";
    DataString += FloatFormat(TempAcqua, 10, 1, false, true);
    DataString += "\nCaldaia,";
    DataString += String(Caldaia, DEC);
    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);
    Serial.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();
}

String FloatFormat(float X, char Size, unsigned char Decimal, boolean Plus, boolean AutoReduce) {

  char Buffer[Size + 1];

  String Z = dtostrf(X, Size, Decimal, Buffer);
  if (Plus && X > 0) Z[Z.lastIndexOf(' ')] = '+';
  if (AutoReduce) Z.trim();

  return Z;



Title: Re: problema con pachube (www.cosm.com)
Post by: lestofante on Aug 14, 2012, 10:01 am
se posso dire la mia, elvis non imparerà mai nulla finchè gli scrivi il codice.
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 14, 2012, 11:33 am
Caro Lesto,
   tu hai anche ragione, ma da autodidatta e con i capelli oramai biancastri non è così facile...
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 14, 2012, 04:19 pm
Ciao Ettore,
   spero veramente di riuscir ad offrirti una birra!

Alla fine ho fatto un mix del tuo codice e di quello che avevo originalmente perché anche con caldaia e ventola accesa il valore su pachube rimaneva a 0.
Adesso lo testo per un paio di giorni e poi lo installo sul sistema termosolare.
Veramente grazie ancora, non essendo un programmatore, ma solo un elettricista, confrontare i codici e trovarne gli errori mi aiuta ad imparare tanto.
Title: Re: problema con pachube (www.cosm.com)
Post by: testato on Aug 14, 2012, 05:53 pm
lesto hai ragione, ma e' comodissimo avere qualcuno che ti scrive il codice  :D
ce ne fossero di piu'  :smiley-yell:

Ettore benvenuto sul forum, ti faccio i complimenti sia per la preparazione che per la voglia di condivisione

x elvis, se vuoi cmq implementare un delay, magari per omodita' tua o per altri progetti, che non blocchi l'esecusione del codice devi usare millis, guardati l'esempio di "blink without delay" presente nell'IDE
Title: Re: problema con pachube (www.cosm.com)
Post by: cyberhs on Aug 15, 2012, 02:23 am
Per Lesto: hai ragione, ma non hai idea di quanto si impari, vedendo come come uno sketch dovrebbe essere fatto.

Per Testato: grazie del tuo caloroso benvenuto!

Per  Elvis: facciamo pure una cassa di birra! Accetto anche altri pagamento in natura... alimentare! (cosa avevi capito?  :D)

Ettore Massimo Albani
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 15, 2012, 03:19 pm
Bene, sperando che tutto questo lavoro possa servire a qualcun altro, il codice che ho installato è:
Code: [Select]


/* IDE 1.0.1
Ethernet shield attached to pins 10, 11, 12, 13
Arduino uno
modified by Ettore Massimo Albani
*/

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

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

byte mac[] = {                                              // MAC address of Ethernet controller
 0xDE, 0xAD, 0xBC, 0xEF, 0xFE, 0xBD};

IPAddress ip(192, 168, 11, 21);                             // IP address on your network here

EthernetClient client;                                      // initialize the library instance:

// 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 = 10000;                // delay between updates to Cosm.com (10 s)

String DataString = "";                                     // stringa per invio dati
char Buffer[10];                                            // buffer per dftostr()

int otherSensorReadingAria = 0;  
int otherSensorReadingCaldaia = 0;

int caldaiaON = 0;                                          //*INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA
int Ventola = 0;                                            //*INGRESSO ANALOGICO PER CONTROLLO WEB STATO VENTOLA

const float AnaRef = 5.0;                                   // valore tensione (5V)
const unsigned int Risoluzione = 1024;                      // risoluzione (10 bit)

const float RangeMin = 2.0;                                 // temperatura minima °C sensore LM35DZ (alim. 5V, out con res. 2k in serie)
const float RangeMax = 100.0;                               // temperatura massima °C sensore LM35DZ (alim. 5V, out con res. 2k in serie)
const float Incremento = 0.01;                              // incremento (10 mV/°C)

float Volt = 0;                                             // valore sensori analogici in volt

const float Isteresi = 2.5;                                 // isteresi (1 °C)

float TempAria = 0.0;                                       // temperatura aria
float TempAriaMin = 2.0;                                    // soglia inferiore temperatura aria (min 2 °C = RangeMin)
float TempAriaMax = 25.0;                                   // soglia superiore temperatura aria (max 100 °C = RangeMax)

float TempAcqua = 0.0;                                      // temperatura acqua
float TempAcquaMin = 2.0;                                   // soglia inferiore temperatura acqua (min 2 °C)
float TempAcquaMax = 42.0;                                  // soglia superiore temperatura acqua (max 100 °C)

void setup() {

 analogReference(DEFAULT);                                 // DEFAULT (5V), INTERNAL (1,1V), EXTERNAL (0÷5V)

 pinMode(A1, INPUT);                                       // sensore di temperatura aria
 pinMode(A3, INPUT);                                       // sensore di temperatura acqua

 pinMode(5, OUTPUT);                                       //*USCITA IN PARALLELO AL RELE CALDAIA PER VISUALIZZAZIONE WEB STATO VENTOLA  
 pinMode(6, OUTPUT);                                       //*USCITA IN PARALLELO AL RELE CALDAIA PER VISUALIZZAZIONE WEB STATO CALDAIA  
 
 pinMode(8, OUTPUT);                                       // relay caldaia ON/OFF
 pinMode(9, OUTPUT);                                       // relay ventola ON/OFF

 Serial.begin(9600);

 if (Ethernet.begin(mac) == 0) {                           // start the Ethernet connection
   Ethernet.begin(mac, ip);                                // DHCP failed, so use a fixed IP address
   Serial.println("Failed to configure Ethernet using DHCP");
 }
}

void loop() {
caldaiaON = analogRead(A0);                                //*INGRESSO ANALOGICO PER CONTROLLO WEB STATO CALDAIA
 Ventola = analogRead(A2);                                 //*INGRESSO ANALOGICO PER CONTROLLO WEB STATO VENTOLA
 
 Volt = analogRead(A1) * AnaRef / Risoluzione;             // valore sensore aria in volt
 TempAria = Volt / Incremento + RangeMin;                  // temperatura aria in °C
 delayMicroseconds(120);                                   // 120 µs (min time reading = 100 µs x channel)

 Volt = analogRead(A3) * AnaRef / Risoluzione;             // valore sensore acqua in volt
 TempAcqua = ((Volt / Incremento + RangeMin)+4);           // temperatura acqua in °C +4°C PER COMPENSAZIONE TERMOMETRO TRIVALVOLA
 delayMicroseconds(120);                                   // 120 µs (min time reading = 100 µs x channel)

 Serial.print("Temp. Aria: ");
 Serial.println(TempAria, 1);
   otherSensorReadingAria = Ventola;  

 Serial.print("Temp. Acqua: ");
 Serial.println(TempAcqua, 1);
  otherSensorReadingCaldaia = caldaiaON;


 if (TempAria > (TempAriaMax + Isteresi)) {
   digitalWrite(9, HIGH);                                 // relay ventola ON
   digitalWrite(5, HIGH);                                 //*VENTILAZIONE ATTIVATA
   Serial.println("Aria calda - Ventola ON");
 }
 else if (TempAria < (TempAriaMax - Isteresi)) {
   digitalWrite(9, LOW);                                   // relay ventola OFF
   digitalWrite(5, LOW);                                    //*VENTILAZIONE DISATTIVATA
   Serial.println("Aria fredda - Ventola OFF");
 }

 if (TempAcqua > (TempAcquaMax + Isteresi)) {
   digitalWrite(8, LOW);                                   // relay caldaia OFF
      digitalWrite(6, LOW);                               //*USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
   Serial.println("Acqua Calda - Caldaia OFF");
 }
 else if (TempAcqua < (TempAcquaMax - Isteresi)) {
   digitalWrite(8, HIGH);                                  // relay caldaia ON
       digitalWrite(6, HIGH);                               //*USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
   Serial.println("Acqua fredda - Caldaia ON");
 }

 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)) {
   DataString = "TempAria,";
   DataString += FloatFormat(TempAria, 10, 1, false, true);
   DataString += "\nVentola,";
 DataString += otherSensorReadingAria;
   DataString += "\nTempAcqua,";
   DataString += FloatFormat(TempAcqua, 10, 1, false, true);
   DataString += "\nCaldaia,";
 DataString += otherSensorReadingCaldaia;
   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);
   Serial.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();
}

String FloatFormat(float X, char Size, unsigned char Decimal, boolean Plus, boolean AutoReduce) {

 char Buffer[Size + 1];

 String Z = dtostrf(X, Size, Decimal, Buffer);
 if (Plus && X > 0) Z[Z.lastIndexOf(' ')] = '+';
 if (AutoReduce) Z.trim();

 return Z;
}  



Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 15, 2012, 03:27 pm
Ed ora che si fa?
... vorrei cercar di capire sia i millis che come inviare a pachube i dati di uscita di una porta digitale senza far rientrare il segnale in una porta  analogica usando delle resistenze come in schema.

e... giusto per non annoiarsi... il prossimo progetto sarà inviare i dati del mio impianto fotovoltaico a pachube. Attendo solo che mi arrivino un paio di integrati dalla cina per installare i TA (trasformatori amperometri) sui conduttori.

Grazie veramente a tutti per il supporto ed in particolare ad Ettore che spero di ubbbbriacare presto. :-)
Elvis

P.S.: nel caso dovessi far aggiornamenti sul progetto "termosolare" li troverete pubblicati sul mio sito http://www.24frames.it/Arduino.html.

Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 16, 2012, 01:15 am
Ciao Testato,
    mi sto "impegnando" con millis, ma riesco ad utilizzarlo solo per ritardare l'accensione della caldaia?
Code: [Select]


if (TempAcqua > (TempAcquaMax + Isteresi)) {
    digitalWrite(8, LOW);                                   // relay caldaia OFF
       digitalWrite(6, LOW);                               //*USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
    Serial.println("Acqua Calda - Caldaia OFF");
  }
  else if (TempAcqua < (TempAcquaMax - Isteresi)) {
    digitalWrite(8, HIGH);                                  // relay caldaia ON
        digitalWrite(6, HIGH);                               //*USCITA IN PARALLELO AL SEGNALE CALDAIA PER TELECONTROLLO
    Serial.println("Acqua fredda - Caldaia ON");
  }



Grazie
Title: Re: problema con pachube (www.cosm.com)
Post by: testato on Aug 16, 2012, 11:02 pm
Dipende da quanti e di che entita' sono gli altri delay in gioco.
Il delay fa il suo mestiere, cioe' blocca l'esecuzione, quindi se tu usi millis solo per la caldaia, ma poi metti un bel delay di 10 secondi da qualche parte, quei 10 secondi sempre delay blocco sono.

In genere se si vuole usare millis lo si fa in tutto lo sketch, tranne i delay "tecnici" quelli che obbligatoriamente devono bloccare tutto, ad esempio in fase di inizializzazione di qualcosa, di qualche protocollo.
Anche nelle librerie ci possono essere delay, e quelli sono nascosti sotto al cofano, ma non credo sia il tuo caso
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 17, 2012, 12:01 am
io avrei bisogno solo di ritardare lo spegnimento della caldaia
Title: Re: problema con pachube (www.cosm.com)
Post by: GINGARDU on Aug 17, 2012, 12:43 pm

io avrei bisogno solo di ritardare lo spegnimento della caldaia


puoi  provare così    metti in alto nello sketch  prima del void setup

extern unsigned long timer0_millis;
float mela;

nel void setup metti

mela=1;


poi modifichi le righe incriminate cosi

if ((TempAcqua > (TempAcquaMax + Isteresi)) && mela==1) (timer0_millis = 0, mela = 0 )


if (TempAcqua > (TempAcquaMax + Isteresi)) && (millis()>30000) {
   digitalWrite(8, LOW);                                  
      digitalWrite(6, LOW);          
   Serial.println("Acqua Calda - Caldaia OFF");
 }


if (TempAcqua < (TempAcquaMax - Isteresi)) {
   digitalWrite(8, HIGH);                                
   digitalWrite(6, HIGH);
    mela=1;
                         
   Serial.println("Acqua fredda - Caldaia ON");
 }




spiegazione=  
appena si verificano le condizioni per spegnere la caldaia
viene resettato millis()-------- e la variabile mela 1 viene  portata 0
appena millis supera i millisecondi che metti (in questo caso 30000 che sono 30 secondi)
porta a LOW i pin 6,8,
la variabile mela 1 che passa a mela 0   serve perche altrimenti   resterebbe sempre mela 1 e si continuerebbe a portare il millis() a zero ad ogni ciclo,

l'ho provato a modo mio e funziona
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 17, 2012, 01:24 pm
Grazie Gingardu,
    in questi giorno non sono in casa e non riesco a testarlo, ma appena posso ti faccio sapere come va.
Ho cercato di far un po' di esperimenti con millis... ma non mi entra in testa... Uff!
Grazie ancora ed a presto.
Title: Re: problema con pachube (www.cosm.com)
Post by: GINGARDU on Aug 17, 2012, 02:39 pm
ok  ,  millis non e troppo facile da comprendere nemmeno per  me
metto qui il codice messo su al volo per provare quello che interessava  a te
ho adoperato solo arduino uno  e un potenziometro su A0

appena giro il potenziometro (che dovrebbe simulare TempAcqua )
millis()  si azzera  (si vede nel monitor seriale )   
passano 6 secondi
e il led pin 13 si spegne
se giro il pot al comtrario il led si riaccende


Code: [Select]
extern unsigned long timer0_millis;
float a;
float b;
float c;
float mela;

void setup () { 
  pinMode (13, OUTPUT); 
digitalWrite(13, HIGH);
  Serial.begin(9600);
  mela=1;


}

void loop ()
{
 
   
a=analogRead  (A0);
b=10;
c=20;





if ((a > (b + c))&& mela==1)(timer0_millis = 0, mela  = 0 );


if ((a > (b + c))&&(millis() > 6000)) { (digitalWrite(13, LOW)); //

       
    Serial.println("Acqua Calda - Caldaia OFF");
  }

if (a < (b + c)){(digitalWrite(13, HIGH),mela=1);


                         
    Serial.println("Acqua fredda - Caldaia ON");
  }

 
Serial.println(millis());

}
Title: Re: problema con pachube (www.cosm.com)
Post by: leo72 on Aug 17, 2012, 03:08 pm
Millis non è altro che una funzione che restituisce il numero di millisecondi passati dall'avvio dell'Arduino.
I controlli con millis possono essere bloccanti come nel caso dei delay oppure non bloccanti, dipende da come si struttura il codice.
L'esempio di BlinkWithoutDelay è del secondo tipo: periodicamente viene controllato se è passato l'intervallo predefinito, nel caso cambia lo stato del led.
Il vantaggio è che nel frattempo si possono compiere altre operazioni.

Per capire meglio, immaginiamo una persona che guarda la televisione mentre aspetta di andare fuori con gli amici. Sa che prima delle 22 al bar sotto casa non ci sarà nessuno e la cena termina alle 21, momento in cui si mette di fronte al televisore. Dalle 21 alle 22 la persona guarderà i programmi televisivi ed ogni tanto butterà un'occhiata all'orologio per vedere se sono arrivate le 22. Se non sono arrivate le 22, continuerà a guardare la TV, se sono arrivate si alzerà ed uscirà di casa.

Ora immaginate che la persona sia il vostro Arduino. Gli date 2 compiti da fare: il primo, il principale, equivale al guardare la TV. Il secondo, il controllo dell'orario, è secondario e va fatto ogni tanto. Il micro esegue il primo compito e, terminato questo, controlla l'orario con millis: se non è ancora scattato l'allarme, riesegue il primo altrimenti esegue il secondo compito.
Title: Re: problema con pachube (www.cosm.com)
Post by: GINGARDU on Aug 17, 2012, 08:21 pm
he... he....    una volta compreso appieno lo so che non ci sono piu problemi,
bisogna arrivarci però a quel punto

ci vuole pazienza e sopratutto "pratica"  vedendo gli sketch  spiegati a dovere aiuta moltissimo,
studiarseli e comprendere
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 18, 2012, 01:18 pm
Grazie Leo72 e grazie Gingardu,
    ci sono dei concetti che per un elettricista (meccanico-old stile) come me non sono proprio immediati da comprendere, però l'esempio del tipo che guarda la TV mi ha reso abbastanza chiaro il concetto.
In settimana, appena rientro a casa e riprendo per mano Arduino, faccio un po' di esperimenti e vediamo come va!
Grazie e buon week and.
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 23, 2012, 03:24 pm
Ciao Gingardu,
   ho finalmente avuto modo di testare le modifiche che mi hai consigliato e... FUNZIONA!
Fa esattamente ciò che speravo.
Grazie veramente.
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Aug 30, 2012, 04:43 pm
Sul mio sito:

http://www.24frames.it/Arduino.html

troverete pubblicato lo schema e lo sketch dell'impianto che ho installato.


Alla pagina:

https://cosm.com/feeds/69741

troverete pubblicati i dati inviati da arduino a Pachube.

Il refresh avviene ogni 50sec. circa.
Title: Re: problema con pachube (www.cosm.com)
Post by: testato on Aug 30, 2012, 10:38 pm
bel lavoro elvis,
e grazie della condivisione.

approfitto per chiederti qualcocsa su cosm, ho visto che la massima larghezza del grafico e' 3 mesi, dopo 3 mesi i vecchi valore vengono persi ?
si puo' salvare, o tenere sul sito, uno storico grafico senza limiti ?
Title: Re: problema con pachube (www.cosm.com)
Post by: elvis on Sep 01, 2012, 09:26 pm
Ciao Testato,
    Immagino che i dati su cosm, essendo un servizio gratuito, dopo tre mesi vengano persi...
Potresti pero' salvarli su una micro SD... So che si può fare.