Inviare dati sensori a Emoncms

Buongiorno, con l'utilizzo di arduino rilevo i dati da diversi sensori (temperatura, umidità, ecc...) e vorrei collegarmi a emoncms per poterli collezionare. Per i sensori non ho avuto problemi ma per l'invio dei dati a emoncms, tramite ethernet shield, non riesco a venirne a capo. Da quello che ho capito basterebbe far collegare arduino a questa pagina http://emoncms.org/input/post.json?json={DATO}&apikey=APIKEY inserendo nella parte del dato il valore letto dal sensore. Il mio problema è che non riesco a collegarmi a questo indirizzo, ho provato a seguire le guide per l'utilizzo dell'ethernet shield ma non capisco come modificare lo sketch di esempio per connettermi a questa pagina.

Qualcuno saprebbe indicarmi qualche guida per aiutarmi nel mio intento?

Grazie per l'aiuto. Massimo

Ma ti funziona con altre pagine funziona, tipo riesci a leggere google.it ?

Testato: Ma ti funziona con altre pagine funziona, tipo riesci a leggere google.it ?

Si con la pagina di google non ho problemi.

Ciao, in questa guida: http://playground.arduino.cc/italiano/emoncms trovi anche del codice di esempio che funziona sia con eth shield che con wifi shield.

pitusso:
Ciao,
in questa guida:
http://playground.arduino.cc/italiano/emoncms
trovi anche del codice di esempio che funziona sia con eth shield che con wifi shield.

Buongiorno, grazie per la risposta. Ho provato ad analizzare il codice ma sono fermo a questo punta:

/*
  Arduino & OpenEnergyMonitor 
  
  This sketch connects to an emoncms server and makes a request using
  Arduino Ethernet shield (or other based on Wiznet W5100) or an 
  Arduino Wifi Shield
  
  author Mirco Piccin aka pitusso
  
  based on 
  http://arduino.cc/en/Tutorial/WebClientRepeating
*/

char foo;  //without a simple variable declaration, use of #ifdef at the top of your code raises an error!

//if using a W5100 based Ethernet shield, comment out the following line; 
//leave untouched if using Arduino Wifi Shield
//#define WIFI

#include <SPI.h>
#include "DHT.h"

// Temperatura Umidità
#define DHTPIN 3 
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

#ifdef WIFI
  #include <WiFi.h>
  #include <WiFiClient.h>
#else
  #include <Ethernet.h>
#endif

// Include Emon Library
#include "EmonLib.h"                   

//network configuration, WIRED or WIFI
#ifdef WIFI
  //if using WIFI 
  char ssid[] = "ssid"; //  your network SSID (name) 
  char pass[] = "password";    // your network password (use for WPA, or use as key for WEP)

  int status = WL_IDLE_STATUS;
  int keyIndex = 0;            // your network key Index number (needed only for WEP)
  
  WiFiClient client;
#else
  //if using WIRED
  byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x69, 0xD5};
  
  // fill in an available IP address on your network here,
  // for auto configuration:
  IPAddress ip(192, 168, 1, 2);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress DNS(8, 8, 8, 8);
  IPAddress gw(192, 168, 1, 254);
  
  EthernetClient client;
#endif

// Create an Emon instance
EnergyMonitor emon1;                   

//Emoncms configurations
char server[] = "emoncms.org";     // name address for emoncms.org
//IPAddress server(213, 138, 101, 177);  // numeric IP for emoncms.org (no DNS)

String apikey = "APIKEY";  //api key
int node = 0; //if 0, not used

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, in milliseconds

void setup() {
  // start serial port:
  Serial.begin(9600);

  // Display a welcome message
  Serial.println("Emoncms client starting...");

#ifdef WIFI
  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    // don't continue:
    while(true);
  } 
  
  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. 
    status = WiFi.begin(ssid, pass);
  
    // wait 10 seconds for connection:
    delay(10000);
  } 
  Serial.println("Connected to wifi");
#else
  if (!Ethernet.begin(mac)) {
    // if DHCP fails, start with a hard-coded address:
    Serial.println("Failed to get an IP address using DHCP, forcing manually");
    Ethernet.begin(mac, ip, dns, gw, subnet);
  }
#endif  

  printStatus();
}

void loop() {
  
  // 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 at least <postingInterval> milliseconds have
  // passed sinceyour last connection, then connect again and
  // send data:
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
   
    // Temperatura Umidità
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Temperatura: "); 
    Serial.print(t);
    Serial.println(" *C");
    Serial.print("Umidita': "); 
    Serial.print(h);
    Serial.println(" %\t");
  }
  

      
    //send values
    sendData();
  }
  // 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() {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("Connecting...");
    // send the HTTP GET request:
    client.print("GET /api/post?apikey=");
    client.print(apikey);
    if (node > 0) {
      client.print("&node=");
      client.print(node);
    }
    client.print("&json={TemperaturaS");
    client.print(":");
    client.print(t);
    client.println("} HTTP/1.1");
    client.println("Host:emoncms.org");
    client.println("User-Agent: Arduino-ethernet");
    client.println("Connection: close");
    client.println();


    // note the time that the connection was made:
    lastConnectionTime = millis();
  } 
  else {
    // if you couldn't make a connection:
    Serial.println("Connection failed");
    Serial.println("Disconnecting...");
    client.stop();
  }
}


void printStatus() {
  #ifdef WIFI
    // print the SSID of the network you're attached to:
    Serial.print("SSID: ");
    Serial.println(WiFi.SSID());

    // print your WiFi shield's IP address:
    IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
    Serial.println(ip);

    // print the received signal strength:
    long rssi = WiFi.RSSI();
    Serial.print("signal strength (RSSI):");
    Serial.print(rssi);
    Serial.print(" dBm");
  #else
    // print your local IP address:
    Serial.print("IP address: ");
    for (byte thisByte = 0; thisByte < 4; thisByte++) {
      // print the value of each byte of the IP address:
      Serial.print(Ethernet.localIP()[thisByte], DEC);
      Serial.print("."); 
    }  
  #endif
  Serial.println();
}

Come posso passare le variabili t e h all’url presente in sendData? Scusate ma non sono molto ferrato con il C :cold_sweat:

EDIT: ci sono riuscito :slight_smile:

EDIT: ci sono riuscito

il problema era che usavi delle variabili locali nel loop per la lettura del sensore

float h = dht.readHumidity(); float t = dht.readTemperature();

il che significa che quelle variabili, al di fuori del loop, di fatto non esistono.

Visto che hai risolto, aggiorna anche il perchè e il come, a giovamento di chi verrà un domani.

Grazie, immaginavo che il problema fosse la posizione dove erano dichiarate ma non riuscivo a capire come farlo in modo corretto :sweat_smile:

Stavo finendo di scrivere il codice, premetto che non ho basi di programmazione… quindi ogni critica è ben accetta :wink:

/*
  Arduino & OpenEnergyMonitor 
  
  This sketch connects to an emoncms server and makes a request using
  Arduino Ethernet shield (or other based on Wiznet W5100) or an 
  Arduino Wifi Shield
  
  author Mirco Piccin aka pitusso
  
  based on 
  http://arduino.cc/en/Tutorial/WebClientRepeating
*/

char foo;  //without a simple variable declaration, use of #ifdef at the top of your code raises an error!

//if using a W5100 based Ethernet shield, comment out the following line; 
//leave untouched if using Arduino Wifi Shield
//#define WIFI

#include <SPI.h>
#include "DHT.h"
#include <OneWire.h>
#include <DallasTemperature.h>

// DHT22
#define DHTPIN 3 
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// Temperatura DALLAS
#define ONE_WIRE_BUS 4

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Fotoresistenza
int fotoresistenzaPin = 0;     // il centro del partitore lo colleghiamo al pin 0
int fotoresistenzaReading;     // il valore che conterrà la lettura

#ifdef WIFI
  #include <WiFi.h>
  #include <WiFiClient.h>
#else
  #include <Ethernet.h>
#endif

// Include Emon Library
#include "EmonLib.h"                   

//network configuration, WIRED or WIFI
#ifdef WIFI
  //if using WIFI 
  char ssid[] = "ssid"; //  your network SSID (name) 
  char pass[] = "password";    // your network password (use for WPA, or use as key for WEP)

  int status = WL_IDLE_STATUS;
  int keyIndex = 0;            // your network key Index number (needed only for WEP)
  
  WiFiClient client;
#else
  //if using WIRED
  byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x69, 0xD5};
  
  // fill in an available IP address on your network here,
  // for auto configuration:
  IPAddress ip(192, 168, 1, 2);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress DNS(8, 8, 8, 8);
  IPAddress gw(192, 168, 1, 254);
  
  EthernetClient client;
#endif

float t = 0;
float h = 0;
float ti = 0;
int pioggia = 0;

// Create an Emon instance
EnergyMonitor emon1; 

//Emoncms configurations
char server[] = "emoncms.org";     // name address for emoncms.org
//IPAddress server(213, 138, 101, 177);  // numeric IP for emoncms.org (no DNS)

String apikey = "APIKEY";  //api key
int node = 0; //if 0, not used

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

void setup() {
  // start serial port:
  Serial.begin(9600);
  
  // led
  pinMode(2, OUTPUT);
  
  // Start up the library
  sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement

  // Display a welcome message
  Serial.println("Emoncms client starting...");

#ifdef WIFI
  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    // don't continue:
    while(true);
  } 
  
  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. 
    status = WiFi.begin(ssid, pass);
  
    // wait 10 seconds for connection:
    delay(10000);
  } 
  Serial.println("Connected to wifi");
#else
  if (!Ethernet.begin(mac)) {
    // if DHCP fails, start with a hard-coded address:
    Serial.println("Failed to get an IP address using DHCP, forcing manually");
    Ethernet.begin(mac, ip, dns, gw, subnet);
  }
#endif  

  printStatus();
}



void loop() {
   
  // 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 at least <postingInterval> milliseconds have
  // passed sinceyour last connection, then connect again and
  // send data:
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
         
  // Led inizio ciclo
  digitalWrite(2, HIGH);
  
    // Temperatura 
    ti = (sensors.getTempCByIndex(0));
    sensors.requestTemperatures(); // Send the command to get temperatures  
    Serial.print("Temperatura interna: ");
    Serial.print(ti); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire 
    Serial.println(" *C");
    
    // Fotoresistenza
    fotoresistenzaReading = analogRead(fotoresistenzaPin);  // lettura grezza dall'adc

  Serial.print("Luce: ");
  Serial.print(fotoresistenzaReading); 

    //soglie di giudizio
    if (fotoresistenzaReading< 10) {
    Serial.println(" - Buio");
    } else if (fotoresistenzaReading< 200) {
    Serial.println(" - Ombra");
    } else if (fotoresistenzaReading< 500) {
    Serial.println(" - Luce");
    } else if (fotoresistenzaReading< 800) {
    Serial.println(" - Luminoso");
    } else {
    Serial.println(" - Molto luminoso");
    }
    
    // DHT22
    // Reading temperature or humidity takes about 250 milliseconds!
    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
    h = dht.readHumidity();
    t = dht.readTemperature();
  
    // check if returns are valid, if they are NaN (not a number) then something went wrong!
    if (isnan(t) || isnan(h)) {
      Serial.println("Failed to read from DHT");
    } else {
      Serial.print("Temperatura: "); 
      Serial.print(t);
      Serial.println(" *C");
      Serial.print("Umidita': "); 
      Serial.print(h);
      Serial.println(" %\t");
    }
    
    // Sensore pioggia
    pioggia = (analogRead(1));
    Serial.print("Pioggia: ");
    Serial.println(pioggia);
  
  //send values
  sendData();
 }
  // 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() {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("Connecting...");
    // send the HTTP GET request:
    client.print("GET /api/post?apikey=");
    client.print(apikey);
    if (node > 0) {
      client.print("&node=");
      client.print(node);
    }
    client.print("&json={Temperatura");
    client.print(":");
    client.print(t); 
    client.print(",Umidit:"); 
    client.print(h); 
    client.print(",TemperaturaI:"); 
    client.print(ti); 
    client.print(",Luce:"); 
    client.print(fotoresistenzaReading);
    client.print(",Pioggia:"); 
    client.print(pioggia);
    client.println("} HTTP/1.1");
    client.println("Host:emoncms.org");
    client.println("User-Agent: Arduino-ethernet");
    client.println("Connection: close");
    client.println();


    // note the time that the connection was made:
    lastConnectionTime = millis();
  } 
  else {
    // if you couldn't make a connection:
    Serial.println("Connection failed");
    Serial.println("Disconnecting...");
    client.stop();
  }
   
  // led fine ciclo
  digitalWrite(2, LOW);
}


void printStatus() {
  #ifdef WIFI
    // print the SSID of the network you're attached to:
    Serial.print("SSID: ");
    Serial.println(WiFi.SSID());

    // print your WiFi shield's IP address:
    IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
    Serial.println(ip);

    // print the received signal strength:
    long rssi = WiFi.RSSI();
    Serial.print("signal strength (RSSI):");
    Serial.print(rssi);
    Serial.print(" dBm");
  #else
    // print your local IP address:
    Serial.print("IP address: ");
    for (byte thisByte = 0; thisByte < 4; thisByte++) {
      // print the value of each byte of the IP address:
      Serial.print(Ethernet.localIP()[thisByte], DEC);
      Serial.print("."); 
    }  
  #endif
  Serial.println();
 
}

Ho seguito con successo gli eccellenti posts per collegare i sensori in arduino al sito publico emomcms.org. Mi chiedo quale modifica bisogna operare nello sketch per mandare i dati ad un server su rete locale. Il mio setup e WAMP con emoncms installato sotto root www/emoncms all indirizzo interno 192.168.xxx.xxx/emoncms. Ho usato il formato No DNS e ricevo un errore 404 (da serial monitor vedo che si collega, ma probabilmente non trova la directory /emoncms). La soluzione sarebbe quella di specificare il numero IP + la directory, cosa dovrei aggiungere? Devo anche menzionare che il manual post eseguito con un valore random funziona bene con GET mandato ad indirizzo localhost/emoncms via browser, quindi sono sicuro che la installazione funziona ed è' accessibile. grazie

gabacca: Ho seguito

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento: Regolamento - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

pitusso: Ciao, in questa guida: http://playground.arduino.cc/italiano/emoncms trovi anche del codice di esempio che funziona sia con eth shield che con wifi shield.

Ciao Pitusso ho letto il tuo tutorial su emoncms. Tutto bene. ora vorrei utilizzare un convertitore AD a 16 bit 4 canali che si interfaccia con i2c ad Arduino. Il problema è che quando tento di inviare i dati su emoncms non invia i valori ma caratteri grafici. Usando il monitor locale i valori invece appaiono correttamente. Hai qualche consiglio? saluti

@profmarzi: non avendolo tu ancora fatto, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO … Grazie.

Guglielmo

gpb01: @profmarzi: non avendolo tu ancora fatto, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

Mi sono presentato nell'apposito spazio. Devo riproporre il mio quesito a Pitusso oppure viene accettato in automatico? Il mio quesito è a qualche riga qui sopra. grazie

profmarzi: Mi sono presentato nell'apposito spazio. Devo riproporre il mio quesito a Pitusso oppure viene accettato in automatico?

Grazie per la presentazione :)

No, no, il tuo quesito è qua sopra e li resta visibile :) ... piuttosto ... ... è Pitusso che invece "latita" da parecchio tempo ... :confused:

Guglielmo

gpb01: Grazie per la presentazione :)

No, no, il tuo quesito è qua sopra e li resta visibile :) ... piuttosto ... ... è Pitusso che invece "latita" da parecchio tempo ... :confused:

Guglielmo

Grazie. Allora a chi posso chiedere? Magari il problema è banale per molti. Utilizzando un convertitore ads1115 della Texas che fornisce dati a 16 bit in complemento a 2 non riesco ad inviare ad Emoncms il corrispondente valore decimale. Tutto qui

Non conosco Emoncms ... in quale formato si aspetta di ricevere i dati ? Perché è tutto li il punto ... ::)

Guglielmo

Hola,

@gabacca non so se hai già risolto o meno, in ogni caso:

Il mio setup e WAMP con emoncms installato sotto root www/emoncms all indirizzo interno 192.168.xxx.xxx/emoncms

in questo caso il server sarà 192.168.xxx.xxx e la GET dovrà contenre il path /emoncms/ es:

...
client.print("GET /emoncms/api/post?apikey=");
...

@profmarzi mi dicevi che stavi usando questo convertitore: ADS1115 Quello che devi fare è costruire una stringa (che è la GET), il che è indipendente dal server a cui devi inviarla, questa stringa! Puoi postare lo sketch o la parte di esso in cui la costruisci?