Page 1 sur 1

[Résolu] Arduino ETHshield SD et Cosm

Message non luPosté: Jeu 20 Sep 2012 15:42
de subreptice
Bonjour.

Depuis quelques semaines, je réalise une expérience avec Cosm :
avec une Uno,
un ETHshield SD,
un LM35DZ ( sur A0 ),
et ce code :
Code: Tout sélectionner
 /*
  Cosm sensor client
 
 This sketch connects an analog sensor to Cosm (http://www.cosm.com)
 using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or
 the Adafruit Ethernet shield, either one will work, as long as it's got
 a Wiznet Ethernet module on board.
 
 This example has been updated to use version 2.0 of the Cosm.com API.
 To make it work, create a feed with a datastream, and give it the ID
 sensor1. Or change the code below to match your feed.
 
 
 Circuit:
 * Analog sensor attached to analog in 0
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 15 March 2010
 updated 16 Mar 2012
 by Tom Igoe with input from Usman Haque and Joe Saavedra
 
http://arduino.cc/en/Tutorial/PachubeClient
 This code is in the public domain.
 
 */

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

#define APIKEY         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // your cosm api key
#define FEEDID         72237 // your feed ID
#define USERAGENT      "automonitoring uno voltage regulator temperature (72237)" // user agent is the project name

// 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[] = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX};

// 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);
 // 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 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(sensorReading);
  }
  // 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(int 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: ");

    // calculate the length of the sensor reading in bytes:
    // 8 bytes for "sensor1," + number of digits of the data:
    int thisLength = 8 + getLength(thisData);
    client.println(thisLength);

    // 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("sensor1,");
    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();
}


// This method calculates the number of digits in the
// sensor reading.  Since each digit of the ASCII decimal
// representation is a byte, the number of digits equals
// the number of bytes:

int getLength(int someValue) {
  // there's at least one byte:
  int digits = 1;
  // continually divide the value by ten,
  // adding one to the digit count for each
  // time you divide, until you're at 0:
  int dividend = someValue /10;
  while (dividend > 0) {
    dividend = dividend /10;
    digits++;
  }
  // return the number of digits:
  return digits;
}


Depuis quelques heures ça ne fonctionne plus ; je n'arrive pas à déterminer pourquoi ;
l'ensemble du hard (câbles inclus) a été testé, et s'avère fonctionnel.
Je ne comprends pas de quel serveur/service parle le message de debug du terminal série :

disconnecting.
connecting...
HTTP/1.1 503 Service Unavailable
Date: Thu, 20 Sep 2012 14:37:29 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Cache-Control: no-cache

6b
<html><body><h1>503 Service Unavailable</h1>
No server is available to handle this request.
</body></html>

0

EDIT:
J'ai essayé de mettre une autre adresse à
// fill in an available IP address on your network here,
// for manual configuration
, sans succès.

Coté Cosm, ça a l'air de fonctionner pour les autres utilisateurs;
selon l'entrée "débug my Feed" de la console de gestion, aucune requête ne leur parviens.
EDIT

Si quelqu'un a une idée, un test à effectuer, qu'il n'hésite pas.
Merci.

Re: Arduino ETHshield SD et Cosm

Message non luPosté: Jeu 20 Sep 2012 17:52
de eco3x
Bonjour, j'utilise presque le même script.

tu as :
IPAddress server(216,52,233,121); // numeric IP for api.cosm.com
//char server[] = "api.cosm.com"; // name address for cosm API

moi j'ai :
//IPAddress server(216,52,233,121); // numeric IP for api.cosm.com
char server[] = "api.cosm.com"; // name address for cosm API

chez moi pas de problème. tout fonctionne bien.

Re: Arduino ETHshield SD et Cosm

Message non luPosté: Jeu 20 Sep 2012 23:07
de subreptice
Bonsoir Eco3x.

Et bien vu : j'avais omis d'essayer l'alternative contenue dans cette partie du sketch !
De plus, en continuant d'investiguer de mon côté j'ai finit par tomber sur ce fil dans les forums de Cosm :
http://community.cosm.com/node/1438 et je pense que tu as trouvé.

Je vais essayer de tester ce soir pour confirmer.

Dans la foulée, je répondrais dans ton fil en te passant un exemple de sketch qui "remonte" de l'analogique et fait la conversion dans la page html.

Merci !

Re: Arduino ETHshield SD et Cosm

Message non luPosté: Jeu 20 Sep 2012 23:57
de subreptice
OK ! Ça remarche, c'était ça !

Bon un peu cavalier de la part de Cosm ce changement d'adresse sans annoncer ...

De plus dans la partie qui posait problème il est dit :
Code: Tout sélectionner
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:

or j'ai 15606 de taille de sketch en utilisant l'IP
et 15540 en utilisant l'adresse du serveur.