Pachube Client

This example shows you how to answer a HTTP request using an Ethernet shield. Specifically, it connects to pachube.com, a free datalogging site. The example requires that you set up a pachube.com account, as well as a pachube feed (for more information on setting up an input feed, please click here). Your Ethernet shield will then connect to that feed and upload sensor data every 10 seconds.

Hardware Required

Circuit

The Ethernet shield allows you to connect a WizNet Ethernet controller to the Arduino via the SPI bus. It uses pins 10, 11, 12, and 13 for the SPI connection to the WizNet. Later models of the Ethernet shield also have an SD Card on board. Digital pin 4 is used to control the slave select pin on the SD card.

The shield should be connected to a network with an ethernet cable. You will need to change the network settings in the program to correspond to your network.

In the above image, your Arduino would be stacked below the Ethernet shield.

Schematic

Pictured: Two CDS photocells with 10k ohm pull down resistors on analog pins 0 and 1.

Code

/*
Pachube sensor client

This sketch connects an analog sensor to Pachube (http://www.pachube.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 Pachube.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.

// 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};

// 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,122);// numeric IP for api.pachube.com//char server[] = "api.pachube.com"; // name address for pachube API

unsignedlong lastConnectionTime =0;// last time you connected to the server, in millisecondsboolean lastConnected =false;// state of the connection last time through the main loop
const unsignedlong postingInterval =10*1000;//delay between updates to Pachube.com

voidsetup(){// Open serial communications and wait for port to open:Serial.begin(9600);while(!Serial){;// wait for serial port to connect. Needed for Leonardo only}

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

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

}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;}