Connessione ad EMONCMS

Buona giornata,
come già postato in hardware (EMONCMS e rilevamento dati temperatura - #15 by system - Hardware - Arduino Forum)
sto tentando di creare un sistema di monitoraggio di temperatura di casa per poi eventualmente comandare degli scambiatori per migliorare la qualità dell'aria.
Per ora mi sono occupato di sensori dht22 e dht11,
Ho risolto il fattore connessioni e recupero dei dati, ora ho il grosso problema di comunicarli al serve EMONCMS in modo corretto e stabile.
Fino a ieri Arduino era connesso alla rete dell'ufficio e funzionava, non benissimo visto che spesso non caricava i dati, ma almeno andava.
Oggi a casa ,,, non c'è stato verso,
Sulla vodafone station pare connesso ma i dati non arrivano al cms.
Potete cortesemente controllare il software di controllo?

/*
 Arduino & OpenEnergyMonitor 
 Invio dati temperatura ed umidit� per futuro controllo vmc
 */
#include <SPI.h>
#include <Ethernet.h>
#include <DHT.h> //includi libreria DHT per sensori temperatura DHT11 e DHT22


int attesa=10*60; //secondi di tattesa per nuovi tentativi di connessione
DHT sala; //sensore in Sala, DHT22
DHT cucina; //sensore in cucina, DHT22
DHT bagnoP; //Sensore nel Bagno Piccol, DHT22
DHT bagnoG; // Sensore nel bagno Grande, DHT22
DHT gaia; // Sensore in camera di Gaia, DHT22
DHT genitori; // Sensore in camera Genitori, DHT22
DHT sud; //Sensore esterno lato SUD, DHT11
DHT nord; //Sensore esterno lato Nord, DHT11
DHT tetto; // Sensore nel sottotetto, DHT22

float SalaT; 
float SalaU;
float CucinaT; 
float CucinaU;
float BPiT; 
float BPiU;
float BGaT; 
float BGaU;
float GaiaT; 
float GaiaU;
float GenT; 
float GenU;
int SudT; 
int SudU;
int NordT; 
int NordU;
float tettoT; 
float tettoU;
int contatore=0;
int a=0;
byte mac[] = {0x80, 0xA0, 0xDA, 0x00, 0x69, 0xD5};//using WIRED
IPAddress ip(192, 168, 1, 186);// fill in an available IP address on your network here,
EthernetClient client;


char server[] = "emoncms.org";     // name address for emoncms.org - IPAddress server(213, 138, 101, 177);  // indirizzo IP di emoncms.org per utilizzo senza DNS

String apikey = "------------------------------------";  //api key (rilevata su registrazione sito emoncms.org)
int node=0;

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 = attesa*1000;  // delay between updates, in milliseconds

void setup() {
  Serial.begin(9600);// apertura serial port:
  Serial.println("Emoncms client starting...");// Benvenuto
  Ethernet.begin(mac, ip);
  sala.setup(3);// assegnazione PIN dei vari sensori
  cucina.setup(5);
  bagnoG.setup(6);
  bagnoP.setup(7);
  genitori.setup(8);
  gaia.setup(9);
  tetto.setup(14);
  nord.setup(16);
  sud.setup(15);
}

void loop() {
  if (client.available()) {
    char c = client.read();
    Serial.println(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("Sconnessione per ripristino invio...");
    client.stop();
  }

  // if you're not connected, and at least <postingInterval> milliseconds have
  // passed sinceyour last connection, then connect again and
  // send data:
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    letturaSensori(); //legge i valori dei sensori
    InviaDati();// invia i dati ad EMONCMS
    a=0;
    Serial.print("Numero di cicli effettuati= ");
    Serial.println(contatore++); 
  }
  else {
    Serial.print("procedura in attesa ");
    Serial.print(a++);
    Serial.println(" volte");
    delay(60*1000);// un minuto di attesa
  }
  lastConnected = client.connected();
}

void letturaSensori(){
  SalaT = sala.getTemperature();
  SalaU = sala.getHumidity();
  CucinaT=cucina.getTemperature();
  CucinaU=cucina.getHumidity();
  BPiT=bagnoP.getTemperature();
  BPiU=bagnoP.getHumidity();
  BGaT=bagnoG.getTemperature();
  BGaU=bagnoG.getHumidity();
  GaiaT=gaia.getTemperature();
  GaiaU=gaia.getHumidity();
  GenT=genitori.getTemperature();
  GenU=genitori.getHumidity();
  SudT=sud.getTemperature();
  SudU=sud.getHumidity();
  NordT=nord.getTemperature();
  NordU=nord.getHumidity();
  tettoT=tetto.getTemperature();
  tettoU=tetto.getHumidity();
  Serial.println("Lettura sensori effettuata ...");
}


void InviaDati(){
  Serial.println("Inzio invio dati ad EmmonCMS");
  if (client.connect(server, 80)) {
    Serial.println("Connessione ...");

    client.print("GET /api/post?apikey=");
    client.print(apikey);
    if (node > 0) {
      client.print("&node=");
      client.print(node);
    }
    client.print("&json={");// send the HTTP GET request:

    client.print("SalaTemp:");
    client.print(SalaT);
    client.print(",SalaUmidit:");
    client.print(SalaU);
    client.print(",CucinaTemp:");
    client.print(CucinaT);
    client.print(",CucinaUmidit:");
    client.print(CucinaU);

    client.print(",BagnoPTemp:");
    client.print(BPiT);
    client.print(",BagnoPUmidit:");
    client.print(BPiU);
    client.print(",BagnoGTemp:");
    client.print(BGaT);
    client.print(",BagnoGUmidit:");
    client.print(BGaU);

    client.print(",GaiaTemp:");
    client.print(GaiaT);
    client.print(",GaiaUmidit:");
    client.print(GaiaU);
    client.print(",GenitoriTemp:");
    client.print(GenT);
    client.print(",GenitoriUmidit:");
    client.print(GenU); 

    client.print(",SudTemp:");
    client.print(SudT);
    client.print(",SudUmidit:");
    client.print(SudU);
    client.print(",NordTemp:");
    client.print(NordT);
    client.print(",NordUmidit:");
    client.print(NordU);
    client.print(",tettoT:");
    client.print(tettoT);
    client.print(",tettoU:");
    client.print(tettoU);

    client.println("} HTTP/1.1");
    client.println("Host:emoncms.org");
    client.println("User-Agent: Arduino-ethernet");
    client.println("Connection: close");
    client.println();

    client.println("Connection: close");
    Serial.println("Invio dati su EMONCMS effettuata .....");// fine sostituzione

    lastConnectionTime = millis();// note the time that the connection was made:
  } 
  else {
    Serial.println("Connessione fallita");// if you couldn't make a connection:
    Serial.println("Sconnessione ...");
    client.stop();
  }
  lastConnected = client.connected();// store the state of the connection for next time through the loop:
}

Altra domanda ... è possibile risparmiare un po' di memoria? questa forma mi occupa il 55% della memoria solo così, ho paure che quando inserirò il controllo dei ventilatori e, forse, il controllo della CO2 (ammesso si fattibile in modo economico) non riuscirò a store nei limiti.
Grazie.

Per diminuire l'uso della memoria devi usare la funzione F() inglobando il codice statico in questo modo:

/*
 Arduino & OpenEnergyMonitor
 Invio dati temperatura ed umidit� per futuro controllo vmc
 */
#include <SPI.h>
#include <Ethernet.h>
#include <DHT.h> //includi libreria DHT per sensori temperatura DHT11 e DHT22


int attesa = 10 * 60; //secondi di tattesa per nuovi tentativi di connessione
DHT sala; //sensore in Sala, DHT22
DHT cucina; //sensore in cucina, DHT22
DHT bagnoP; //Sensore nel Bagno Piccol, DHT22
DHT bagnoG; // Sensore nel bagno Grande, DHT22
DHT gaia; // Sensore in camera di Gaia, DHT22
DHT genitori; // Sensore in camera Genitori, DHT22
DHT sud; //Sensore esterno lato SUD, DHT11
DHT nord; //Sensore esterno lato Nord, DHT11
DHT tetto; // Sensore nel sottotetto, DHT22

float SalaT;
float SalaU;
float CucinaT;
float CucinaU;
float BPiT;
float BPiU;
float BGaT;
float BGaU;
float GaiaT;
float GaiaU;
float GenT;
float GenU;
int SudT;
int SudU;
int NordT;
int NordU;
float tettoT;
float tettoU;
int contatore = 0;
int a = 0;
byte mac[] = {0x80, 0xA0, 0xDA, 0x00, 0x69, 0xD5};//using WIRED
IPAddress ip(192, 168, 1, 186);// fill in an available IP address on your network here,
EthernetClient client;


char server[] = "emoncms.org";     // name address for emoncms.org - IPAddress server(213, 138, 101, 177);  // indirizzo IP di emoncms.org per utilizzo senza DNS

String apikey = "------------------------------------";  //api key (rilevata su registrazione sito emoncms.org)
int node = 0;

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 = attesa * 1000; // delay between updates, in milliseconds

void setup() {
  Serial.begin(9600);// apertura serial port:
  Serial.println(F("Emoncms client starting..."));// Benvenuto
  Ethernet.begin(mac, ip);
  sala.setup(3);// assegnazione PIN dei vari sensori
  cucina.setup(5);
  bagnoG.setup(6);
  bagnoP.setup(7);
  genitori.setup(8);
  gaia.setup(9);
  tetto.setup(14);
  nord.setup(16);
  sud.setup(15);
}

void loop() {
  if (client.available()) {
    char c = client.read();
    Serial.println(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(F("Sconnessione per ripristino invio..."));
    client.stop();
  }

  // if you're not connected, and at least <postingInterval> milliseconds have
  // passed sinceyour last connection, then connect again and
  // send data:
  if (!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    letturaSensori(); //legge i valori dei sensori
    InviaDati();// invia i dati ad EMONCMS
    a = 0;
    Serial.print(F("Numero di cicli effettuati= "));
    Serial.println(contatore++);
  }
  else {
    Serial.print(F("procedura in attesa "));
    Serial.print(a++);
    Serial.println(F(" volte"));
    delay(60 * 1000); // un minuto di attesa
  }
  lastConnected = client.connected();
}

void letturaSensori() {
  SalaT = sala.getTemperature();
  SalaU = sala.getHumidity();
  CucinaT = cucina.getTemperature();
  CucinaU = cucina.getHumidity();
  BPiT = bagnoP.getTemperature();
  BPiU = bagnoP.getHumidity();
  BGaT = bagnoG.getTemperature();
  BGaU = bagnoG.getHumidity();
  GaiaT = gaia.getTemperature();
  GaiaU = gaia.getHumidity();
  GenT = genitori.getTemperature();
  GenU = genitori.getHumidity();
  SudT = sud.getTemperature();
  SudU = sud.getHumidity();
  NordT = nord.getTemperature();
  NordU = nord.getHumidity();
  tettoT = tetto.getTemperature();
  tettoU = tetto.getHumidity();
  Serial.println(F("Lettura sensori effettuata ..."));
}


void InviaDati() {
  Serial.println(F("Inzio invio dati ad EmmonCMS"));
  if (client.connect(server, 80)) {
    Serial.println(F("Connessione ..."));

    client.print(F("GET /api/post?apikey="));
    client.print(apikey);
    if (node > 0) {
      client.print(F("&node="));
      client.print(node);
    }
    client.print(F("&json={"));// send the HTTP GET request:

    client.print(F("SalaTemp:"));
    client.print(SalaT);
    client.print(F(",SalaUmidit:"));
    client.print(SalaU);
    client.print(F(",CucinaTemp:"));
    client.print(CucinaT);
    client.print(F(",CucinaUmidit:"));
    client.print(CucinaU);

    client.print(F(",BagnoPTemp:"));
    client.print(BPiT);
    client.print(F(",BagnoPUmidit:"));
    client.print(BPiU);
    client.print(F(",BagnoGTemp:"));
    client.print(BGaT);
    client.print(F(",BagnoGUmidit:"));
    client.print(BGaU);

    client.print(F(",GaiaTemp:"));
    client.print(GaiaT);
    client.print(F(",GaiaUmidit:"));
    client.print(GaiaU);
    client.print(F(",GenitoriTemp:"));
    client.print(GenT);
    client.print(F(",GenitoriUmidit:"));
    client.print(GenU);

    client.print(F(",SudTemp:"));
    client.print(SudT);
    client.print(F(",SudUmidit:"));
    client.print(SudU);
    client.print(F(",NordTemp:"));
    client.print(NordT);
    client.print(F(",NordUmidit:"));
    client.print(NordU);
    client.print(F(",tettoT:"));
    client.print(tettoT);
    client.print(F(",tettoU:"));
    client.print(tettoU);

    client.println(F("} HTTP/1.1"));
    client.println(F("Host:emoncms.org"));
    client.println(F("User-Agent: Arduino-ethernet"));
    client.println(F("Connection: close"));
    client.println();

    client.println(F("Connection: close"));
    Serial.println(F("Invio dati su EMONCMS effettuata ....."));// fine sostituzione

    lastConnectionTime = millis();// note the time that the connection was made:
  }
  else {
    Serial.println(F("Connessione fallita"));// if you couldn't make a connection:
    Serial.println(F("Sconnessione ..."));
    client.stop();
  }
  lastConnected = client.connected();// store the state of the connection for next time through the loop:
}

Ciao, grazie per l'attewnzione.
Ho provato a documentarmi un po' sulla funzione F(). mi pare di aver capito che così i testi statici vengono caricati più velocemente in quando "archiviati" nella memora interna.
Le dimensioni complessive dello stack rimangono invariate ma il codice diventa molto meno pesante per Arduino.
Ho capito bene?

Dimensione del file binario dello sketch: 16.996 bytes (su un massimo di 32.256 bytes)

Purtroppo non sono ancora venuto a capo su come farlo funzionare a casa =(

"Studiando" un po' in giro pare che il problema con vodafone station sia la necessità di inserire i parametri completi di rete.
Stasera provo questa semplice strada.

ValAnd65:
Ho provato a documentarmi un po' sulla funzione F(). mi pare di aver capito che così i testi statici vengono caricati più velocemente in quando "archiviati" nella memora interna.

Non è una questione di velocità ma di occupazione di memoria.
Usando la funzione F() il microcontrollore invece di caricare il dato dalla flash alla memoria e poi elaborarlo lo elabora direttamente leggendolo dalla flash. Si risparmi in questo modo di occupare una risorsa preziosa come la memoria del sistema che sull'ATmega328 è di soli 2K.
Purtroppo la funzione è utilizzabile solo con contenuti statici.