Created
February 26, 2012 00:54
-
-
Save mbparks/1911965 to your computer and use it in GitHub Desktop.
Arduino and Pachube Light Sensor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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. | |
Circuit: | |
* Analog sensor attached to analog in 0 | |
* Ethernet shield attached to pins 10, 11, 12, 13 | |
created 15 March 2010 | |
updated 26 Oct 2011 | |
by Tom Igoe | |
http://www.tigoe.net/pcomp/code/category/arduinowiring/873 | |
This code is in the public domain. | |
Modified by Mike Parks | |
25 Feb 2012 | |
*/ | |
#include <SPI.h> | |
#include <Ethernet.h> | |
// 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[] = {0x00, 0xA2, 0xDA, 0x1D, 0x07, 0x94}; | |
// fill in an available IP address on your network here, | |
// for manual configuration: | |
IPAddress ip(192,168,1,135); | |
// initialize the library instance: | |
EthernetClient client; | |
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 int postingInterval = 10000; //delay between updates to Pachube.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"); | |
// no point in carrying on, so do nothing forevermore: | |
for(;;) | |
; | |
} | |
// give the ethernet module time to boot up: | |
delay(1000); | |
// start the Ethernet connection: | |
if (Ethernet.begin(mac) == 0) { | |
Serial.println("Failed to configure Ethernet using DHCP"); | |
// Configure manually: | |
Ethernet.begin(mac, ip); | |
} | |
} | |
void loop() { | |
// read the analog sensor: | |
int sensorReading = analogRead(0); | |
// 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("api.pachube.com", 80)) { | |
Serial.println("connecting..."); | |
// send the HTTP PUT request. | |
// fill in your feed address here: | |
client.print("PUT /v2/feeds/YOUR_FEED_ID_HERE/datastreams/0.csv HTTP/1.1\r\n"); | |
client.print("Host: api.pachube.com\r\n"); | |
// fill in your Pachube API key here: | |
client.print("X-PachubeApiKey: YOUR_API_KEY_HERE\r\n"); | |
client.print("Content-Length: "); | |
// calculate the length of the sensor reading in bytes: | |
int thisLength = getLength(thisData); | |
client.println(thisLength, DEC); | |
// last pieces of the HTTP PUT request: | |
client.print("Content-Type: text/csv\r\n"); | |
client.println("Connection: close\r\n"); | |
// here's the actual content of the PUT request: | |
client.println(thisData, DEC); | |
// note the time that the connection was made: | |
lastConnectionTime = millis(); | |
} | |
else { | |
// if you couldn't make a connection: | |
Serial.println("connection failed"); | |
} | |
} | |
// 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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment