Pages: [1] 2 3 ... 5   Go Down
Author Topic: problema con pachube (www.cosm.com)  (Read 4084 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
   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();
}
« Last Edit: August 06, 2012, 12:58:27 pm by Federico Vanzati » Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 15
Posts: 1163
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

F

Offline Offline
Full Member
***
Karma: 0
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 932
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 932
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Caro elvis,

ti ho inserito il codice come dovrebbe essere strutturato.

Ovviamento non ho avuto modo di testarlo a fondo.

Ettore Massimo Albani

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


Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

 
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 932
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 0
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Full Member
***
Karma: 0
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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



* Schermata 08-2456148 alle 14.24.48.png (92.7 KB, 967x496 - viewed 27 times.)
Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 15
Posts: 1163
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

F

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Full Member
***
Karma: 0
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Rieccomi qua,
     ho eliminato i vari:
Code:
       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:
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!


* Schermata 08-2456149 alle 08.09.31.png (87.74 KB, 834x748 - viewed 20 times.)

* Schermata 08-2456148 alle 22.08.28.png (61.39 KB, 488x573 - viewed 20 times.)
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1] 2 3 ... 5   Go Up
Jump to: