Tutorial.WiFiPachubeClient History

Hide minor edits - Show changes to output

November 08, 2013, at 04:17 PM by Scott Fitzgerald -
Changed lines 1-47 from:
''Examples > WiFi Library''

!!!WiFi Pachube Client

This example shows you how to answer a HTTP request using a WiFi 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 [[http://community.pachube.com/using_the_website#inputs | click here]]). Your WiFi shield will then connect to that feed and upload sensor data every 10 seconds.

(:div class=BOM :)
!!!Hardware Required
* Arduino WiFi Shield
* Shield-compatible Arduino board
* One analog sensor to attached to AnalogIn pin 0

!!!!Software Required
* pachube.com account
* pachube.com feed that accepts two data items
(:divend:)

!!!Circuit
(:div class=circuit :)

The WiFi shield uses pins 10, 11, 12, and 13 for the SPI connection to the HDG104 module. Digital pin 4 is used to control the slave select pin on the SD card.

You should have access to a 802.11b/g wireless network that connects to the internet for this example. You will need to change the network settings in the sketch to correspond to your particular networks SSID.

For networks using WPA/WPA2 Personal encryption, you need the SSID and password. The shield will not connect to networks using WPA2 Enterprise encryption.

WEP network passwords are hexadecimal strings known as keys. A WEP network can have 4 different keys; each key is assigned a "Key Index" value. For WEP encrypted networks, you need the SSID, the key, and key number.

%height=300px%[[Attach:WiFiPachubeClient_bb.png | Attach:WiFiPachubeClient_bb.png]]

[-image developed using [[http://www.fritzing.org |Fritzing]]. For more circuit examples, see the [[http://fritzing.org/projects/|Fritzing project page]] -]

'''''In the above image, the Arduino would be stacked below the WiFi shield.'''''

(:divend:)



'''Code:'''

(:div class=code :)
(:source http://arduino.cc/en/pub/code/master/libraries/WiFi/examples/WiFiPachubeClient/WiFiPachubeClient.ino lang=arduino tabwidth=4:)
(:divend:)


!!!See Also:
(:include WiFiTutorialSeeAlsoInclude:)
to:
(:redirect WiFiXivelyClient:)
April 11, 2013, at 07:37 PM by Federico -
Changed lines 42-218 from:
(:source lang=arduino tabwidth=4:)
/*
Wifi Pachube sensor client

This sketch connects an analog sensor to Pachube (http://www.pachube.com)
using an Arduino Wifi shield.

This example is written for a network using WPA encryption. For
WEP or WPA, change the Wifi.begin() call accordingly.

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.

Circuit:
* Analog sensor attached to analog in 0
* Wifi shield attached to pins 10, 11, 12, 13

created 13 Mar 2012
modified 23 Apr 2012
by Tom Igoe

This code is in the public domain.

*/
#include <SPI.h>
#include <WiFi.h>

#define APIKEY "YOUR API KEY GOES HERE" // replace your pachube api key here
#define FEEDID 00000 // replace your feed ID
#define USERAGENT "My Arduino Project" // user agent is the project name

char ssid[] = "yourNetwork"; // your network SSID (name)
char pass[] = "secretPassword"; // your network password

int status = WL_IDLE_STATUS;

// initialize the library instance:
WiFiClient 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,122); // numeric IP for api.pachube.com
//char server[] = "api.pachube.com"; // name address for pachube 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 Pachube.com

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

// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
// you're connected now, so print out the status:
printWifiStatus();
}


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.pachube.com");
client.print("X-PachubeApiKey: ");
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;
}

void printWifiStatus() {
// 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.println(" dBm");
}


(:sourceend:)
to:
(:source http://arduino.cc/en/pub/code/master/libraries/WiFi/examples/WiFiPachubeClient/WiFiPachubeClient.ino lang=arduino tabwidth=4:)
September 09, 2012, at 01:15 AM by Scott Fitzgerald -
Changed lines 42-218 from:
(:source http://arduino.cc/en/pub/code/master/libraries/WiFi/examples/WiFiPachubeClient/WiFiPachubeClient.ino lang=arduino tabwidth=4:)
to:
(:source lang=arduino tabwidth=4:)
/*
Wifi Pachube sensor client

This sketch connects an analog sensor to Pachube (http://www.pachube.com)
using an Arduino Wifi shield.

This example is written for a network using WPA encryption. For
WEP or WPA, change the Wifi.begin() call accordingly.

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.

Circuit:
* Analog sensor attached to analog in 0
* Wifi shield attached to pins 10, 11, 12, 13

created 13 Mar 2012
modified 23 Apr 2012
by Tom Igoe

This code is in the public domain.

*/
#include <SPI.h>
#include <WiFi.h>

#define APIKEY "YOUR API KEY GOES HERE" // replace your pachube api key here
#define FEEDID 00000 // replace your feed ID
#define USERAGENT "My Arduino Project" // user agent is the project name

char ssid[] = "yourNetwork"; // your network SSID (name)
char pass[] = "secretPassword"; // your network password

int status = WL_IDLE_STATUS;

// initialize the library instance:
WiFiClient 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,122); // numeric IP for api.pachube.com
//char server[] = "api.pachube.com"; // name address for pachube 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 Pachube.com

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

// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
// you're connected now, so print out the status:
printWifiStatus();
}


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.pachube.com");
client.print("X-PachubeApiKey: ");
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;
}

void printWifiStatus() {
// 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.println(" dBm");
}


(:sourceend:)
April 25, 2012, at 06:36 PM by Scott Fitzgerald -
Changed lines 29-30 from:
%height=300px%[[Attach:PachubeClient_bb.png.png | Attach:PachubeClient_bb.png.png]]
to:
%height=300px%[[Attach:WiFiPachubeClient_bb.png | Attach:WiFiPachubeClient_bb.png]]
April 25, 2012, at 06:22 PM by Scott Fitzgerald -
Changed lines 37-41 from:
!!!Schematic
(:div class=circuit :)
%height=300px%[[Attach:EthernetShield_sch.png | Attach:EthernetShield_sch.png]]
(:divend:)
to:

April 21, 2012, at 12:20 AM by Scott Fitzgerald -
April 21, 2012, at 12:19 AM by Scott Fitzgerald -
Changed lines 29-30 from:
%height=300px%[[Attach:EthernetShield_bb.png | Attach:EthernetShield_bb.png]]
to:
%height=300px%[[Attach:PachubeClient_bb.png.png | Attach:PachubeClient_bb.png.png]]
April 21, 2012, at 12:19 AM by Scott Fitzgerald -
Added lines 1-50:
''Examples > WiFi Library''

!!!WiFi Pachube Client

This example shows you how to answer a HTTP request using a WiFi 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 [[http://community.pachube.com/using_the_website#inputs | click here]]). Your WiFi shield will then connect to that feed and upload sensor data every 10 seconds.

(:div class=BOM :)
!!!Hardware Required
* Arduino WiFi Shield
* Shield-compatible Arduino board
* One analog sensor to attached to AnalogIn pin 0

!!!!Software Required
* pachube.com account
* pachube.com feed that accepts two data items
(:divend:)

!!!Circuit
(:div class=circuit :)

The WiFi shield uses pins 10, 11, 12, and 13 for the SPI connection to the HDG104 module. Digital pin 4 is used to control the slave select pin on the SD card.

You should have access to a 802.11b/g wireless network that connects to the internet for this example. You will need to change the network settings in the sketch to correspond to your particular networks SSID.

For networks using WPA/WPA2 Personal encryption, you need the SSID and password. The shield will not connect to networks using WPA2 Enterprise encryption.

WEP network passwords are hexadecimal strings known as keys. A WEP network can have 4 different keys; each key is assigned a "Key Index" value. For WEP encrypted networks, you need the SSID, the key, and key number.

%height=300px%[[Attach:EthernetShield_bb.png | Attach:EthernetShield_bb.png]]

[-image developed using [[http://www.fritzing.org |Fritzing]]. For more circuit examples, see the [[http://fritzing.org/projects/|Fritzing project page]] -]

'''''In the above image, the Arduino would be stacked below the WiFi shield.'''''

(:divend:)

!!!Schematic
(:div class=circuit :)
%height=300px%[[Attach:EthernetShield_sch.png | Attach:EthernetShield_sch.png]]
(:divend:)

'''Code:'''

(:div class=code :)
(:source http://arduino.cc/en/pub/code/master/libraries/WiFi/examples/WiFiPachubeClient/WiFiPachubeClient.ino lang=arduino tabwidth=4:)
(:divend:)


!!!See Also:
(:include WiFiTutorialSeeAlsoInclude:)

Share