[Note: xively.com is gone. This system doesn’t work. Post is here for historical reasons only]
Bi-directional communication from Arduino to a xively.com feed using an ethernet shield.
- Initializes an internet connection (DHCP)
- Connects to xively.com servers every minute
- Stores random value in the feed using HTTP PUT
- Retrieves current feed value using HTTP GET
- Lights up LED when transmitting
Arduino circuit
- Use an ethernet shield.
- Connect ethernet cable. (I am using a Netgear WNCE2001 ethernet to wiFi adapter)
- LED is connected to pin 5 and ground. The shorter lead connects to ground.
download
[wpdm_file id=18 title=”true” ]
files
- xively_test1 (Arduino sketch)
Arduino files and libraries
Copy the xively_test1/ folder to Documents/Arduino. This puts it in the Arduino sketchbook.
Notes on installing xively/cosm/pachube libraries for arduino: https://reactivemusic.net/?p=4900
Instructions
- Connect Arduino to Macbook via USB.
- Open the Arduino serial monitor to initialize the ethernet connection and display the IP address.
- Every minute data gets send to the feed
- Monitor feed data here: https://xively.com/feeds/98281/workbench
Arduino sketch
/* 5/20/2014 - Arduino/xively feed interaction
Uses Ethernet Shield and and LED connected between pin D5 and ground
Sends a random value to a xively.com feed every minute The LED lights up during data transmissions
demonstrates:
HTTP PUT - send data to xiveyly feed and store HTTP GET - read xively feed value
*/
#include <SPI.h> #include <Ethernet.h> #include <HttpClient.h> #include <Cosm.h>
int ledPin = 5;
int upCount = 0; // counters for number of times going up and down
#define API_KEY "96PqSh4rj7HzNif3WtTpN7GjX96SAKxrWms3SUhwaDFGUT0g" // your Cosm API key #define FEED_ID 98281 // your Cosm feed ID
// MAC address for your Ethernet shield byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x0B, 0xCE };
// note that pins 0 and 1 are used by the Ethernet shield
unsigned long lastConnectionTime = 0; // last time we connected to Cosm const unsigned long connectionInterval = 60000; // delay between connecting to Cosm in milliseconds
// Initialize the Cosm library
// Define the string for our datastream ID char sensorId[] = "count";
CosmDatastream datastreams[] = { CosmDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT), };
// Wrap the datastream into a feed CosmFeed feed(FEED_ID, datastreams, 1 /* number of datastreams */);
EthernetClient client; CosmClient cosmclient(client);
void setup() { // initialize the detector pins pinMode(ledPin, OUTPUT ); // internet transmitting indicator // start the Monitor (console) serial port Serial.begin(9600);
// display happy messages Serial.println("Xively test"); Serial.println("==========================");
// Keep trying to initialize the Internet connection // Note - we should eventually timeout of this and just run the stairs independently Serial.println("Initializing network"); while (Ethernet.begin(mac) != 1) { Serial.println("Error getting IP address via DHCP, trying again..."); delay(15000); }
Serial.println("Network initialized"); Serial.println(); // print your local IP address: Serial.print("Arduino IP address: "); for (byte thisByte = 0; thisByte < 4; thisByte++) { // print the value of each byte of the IP address: Serial.print(Ethernet.localIP()[thisByte], DEC); Serial.print("."); } Serial.println(); Serial.println(); } // end of setup function
//////////////////////////// control loop ///////////////////////////
void loop() { // main program loop ////////////////////////////// Internet sending/receiving code //////////////////////////////// if (millis() - lastConnectionTime > connectionInterval) { // uncomment this to just send a random value... upCount = random(256); digitalWrite(ledPin, HIGH ); // turn on transmitter light sendData(upCount); // read the datastream back from Cosm - comment out to save time getData(); digitalWrite(ledPin, LOW ); // update connection time so we wait before connecting again lastConnectionTime = millis(); } ///////////////////// end of internet send/receive code ///////////////// } // end of main loop code
/////////////////// additional functions ////////////////////////// ////////////////////////////////////////////////////////////////////
// send the supplied value to Cosm, printing some debug information as we go void sendData(int sensorValue) { datastreams[0].setFloat(sensorValue);
Serial.print("Read sensor value "); Serial.println(datastreams[0].getFloat());
Serial.println("Uploading to Cosm"); int ret = cosmclient.put(feed, API_KEY); Serial.print("PUT return code: "); Serial.println(ret);
Serial.println(); }
// get the value of the datastream from Cosm, printing out the value we received void getData() { Serial.println("Reading data from Cosm");
int ret = cosmclient.get(feed, API_KEY); Serial.print("GET return code: "); Serial.println(ret);
if (ret > 0) { Serial.print("Datastream is: "); Serial.println(feed[0]);
Serial.print("Sensor value is: "); Serial.println(feed[0].getFloat()); }
Serial.println(); }