Go Down

Topic: COSM + arduino ethernet (Read 626 times) previous topic - next topic

kove3374

Jan 04, 2013, 02:45 pm Last Edit: Jan 04, 2013, 03:03 pm by kove3374 Reason: 1
Carissimi,
volevo sapere se avete problemi con i feed di cosm ?
io invio valori di temperatura e umidità da sensore DHT22 a cosm e tutto funziona bene finchè dopo un pò (variabile a volte 20 min. a volte 2 ore)...si frizza tutto !!!
non capisco ! vi allego il codice...
AIUTO !!!!

Code: [Select]

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

#define APIKEY         "xx"
#define FEEDID         ....
#define USERAGENT      "Cosm Arduino...name

#define DHTPIN         7      // Data pin for the HUMID module
#define DHTTYPE        DHT22  // Sensor used on the HUMID module

DHT dht(DHTPIN, DHTTYPE);

// assign a MAC address for the ethernet controller.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield fill in your address here:
//byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};


///////Your next device could be 0xDE 0xAD 0xBE 0xEF 0xFE 0xEE, for example.
///////Then your third would end in 0xEF, the fourth in 0xF0, and so on.


// 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(173,203,98,29);    // 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 = 30*1000; //delay between updates to Cosm.com
const unsigned long postingInterval = 60000; //delay between updates to Cosm.com

void setup() {
 // start serial port:
 Serial.begin(38400);
 // start the HUMID module:
 dht.begin();
 // 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() {
 
 
 // read the analog sensor:
 int sensorReading = analogRead(A0);  

 // 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 (millis() < lastConnectionTime) lastConnectionTime = millis();    // evita il blocco dopo 50gg poiché millis() si azzera

 // 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)) {
   float temperatureReading = dht.readTemperature();
   Serial.print("Temperature: ");
   Serial.println(temperatureReading);
   float humidityReading    = dht.readHumidity();
   Serial.print("Humidity: ");
   Serial.println(humidityReading);
   sendData(temperatureReading, humidityReading);
 }
 // store the state of the connection for next time through
 // the loop:
 lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
boolean sendData(float thisTemperature, float thisHumidity) {
 if (client.connected()) client.stop();

 // 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: ");

   /*
    work out the length of the string:
    "temperature," = 12 +
    digits of temperature value +
    "humidity," = 9 +
    digits of humidity value +
    "\r\n" = 2
    */
   int length = 12 + countDigits(thisTemperature,2) + 2 + 9 + countDigits(thisHumidity,2) + 2;

   // calculate the length of the sensor reading in bytes:
   client.println(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.print("temperature,");
   client.println(thisTemperature);
   client.print("humidity,");
   client.println(thisHumidity);
   client.println();
   client.println();

   // note the time that the connection was made:
   lastConnectionTime = millis();
   Serial.println("data uploaded");

 }
 else {
   // if you couldn't make a connection:
   Serial.println("connection failed");
 }
}

// Counts digits of a floating point number, to calculate content length
// for an HTTP call.
// Based on Arduino's internal printFloat() function.
int countDigits(double number, int digits)  {
 int n = 0;

 // Handle negative numbers
 if (number < 0.0)
 {
   n++; // "-";
   number = -number;
 }

 // Round correctly so that print(1.999, 2) prints as "2.00"
 double rounding = 0.5;
 for (uint8_t i=0; i<digits; ++i) {
   rounding /= 10.0;
 }
 number += rounding;

 // Extract the integer part of the number and print it
 unsigned long int_part = (unsigned long)number;
 double remainder = number - (double)int_part;

 while (int_part > 0) {
   int_part /= 10;
   n++;
 }
 // Print the decimal point, but only if there are digits beyond
 if (digits > 0) {
   n++; //".";
 }

 // Extract digits from the remainder one at a time
 while (digits-- > 0)
 {
   remainder *= 10.0;
   int toPrint = int(remainder);
   n ++; // += String(toPrint);
   remainder -= toPrint;
 }
 return n;
}

PaoloP

#1
Jan 04, 2013, 02:49 pm Last Edit: Jan 04, 2013, 02:55 pm by PaoloP Reason: 1
Ciao,
potresti rieditare il tuo messaggio? dovresti includere il codice all'interno dei tag CODE
Premi modify (in alto a destra del messaggio). Seleziona tutto il codice e premi il tastino # nella barra dell'editor sopra le faccine.
Salva il mesaggio.
Dovresti otenere una cosa così:
Code: [Select]
codice
Molto più leggibile.

EDIT: Cosi com'è lo sketch non compila.

kove3374


Carissimi,
volevo sapere se avete problemi con i feed di cosm ?
io invio valori di temperatura e umidità da sensore DHT22 a cosm e tutto funziona bene finchè dopo un pò (variabile a volte 20 min. a volte 2 ore)...si frizza tutto !!!
non capisco ! vi allego il codice...
AIUTO !!!!

Code: [Select]

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

#define APIKEY         "xx"
#define FEEDID         ....
#define USERAGENT      "Cosm Arduino...name

#define DHTPIN         7      // Data pin for the HUMID module
#define DHTTYPE        DHT22  // Sensor used on the HUMID module

DHT dht(DHTPIN, DHTTYPE);

// assign a MAC address for the ethernet controller.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield fill in your address here:
//byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};


///////Your next device could be 0xDE 0xAD 0xBE 0xEF 0xFE 0xEE, for example.
///////Then your third would end in 0xEF, the fourth in 0xF0, and so on.


// 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(173,203,98,29);    // 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 = 30*1000; //delay between updates to Cosm.com
const unsigned long postingInterval = 60000; //delay between updates to Cosm.com

void setup() {
 // start serial port:
 Serial.begin(38400);
 // start the HUMID module:
 dht.begin();
 // 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() {
 
 
 // read the analog sensor:
 int sensorReading = analogRead(A0);  

 // 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 (millis() < lastConnectionTime) lastConnectionTime = millis();    // evita il blocco dopo 50gg poiché millis() si azzera

 // 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)) {
   float temperatureReading = dht.readTemperature();
   Serial.print("Temperature: ");
   Serial.println(temperatureReading);
   float humidityReading    = dht.readHumidity();
   Serial.print("Humidity: ");
   Serial.println(humidityReading);
   sendData(temperatureReading, humidityReading);
 }
 // store the state of the connection for next time through
 // the loop:
 lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
boolean sendData(float thisTemperature, float thisHumidity) {
 if (client.connected()) client.stop();

 // 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: ");

   /*
    work out the length of the string:
    "temperature," = 12 +
    digits of temperature value +
    "humidity," = 9 +
    digits of humidity value +
    "\r\n" = 2
    */
   int length = 12 + countDigits(thisTemperature,2) + 2 + 9 + countDigits(thisHumidity,2) + 2;

   // calculate the length of the sensor reading in bytes:
   client.println(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.print("temperature,");
   client.println(thisTemperature);
   client.print("humidity,");
   client.println(thisHumidity);
   client.println();
   client.println();

   // note the time that the connection was made:
   lastConnectionTime = millis();
   Serial.println("data uploaded");

 }
 else {
   // if you couldn't make a connection:
   Serial.println("connection failed");
 }
}

// Counts digits of a floating point number, to calculate content length
// for an HTTP call.
// Based on Arduino's internal printFloat() function.
int countDigits(double number, int digits)  {
 int n = 0;

 // Handle negative numbers
 if (number < 0.0)
 {
   n++; // "-";
   number = -number;
 }

 // Round correctly so that print(1.999, 2) prints as "2.00"
 double rounding = 0.5;
 for (uint8_t i=0; i<digits; ++i) {
   rounding /= 10.0;
 }
 number += rounding;

 // Extract the integer part of the number and print it
 unsigned long int_part = (unsigned long)number;
 double remainder = number - (double)int_part;

 while (int_part > 0) {
   int_part /= 10;
   n++;
 }
 // Print the decimal point, but only if there are digits beyond
 if (digits > 0) {
   n++; //".";
 }

 // Extract digits from the remainder one at a time
 while (digits-- > 0)
 {
   remainder *= 10.0;
   int toPrint = int(remainder);
   n ++; // += String(toPrint);
   remainder -= toPrint;
 }
 return n;
}


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy