Capacitive Sensor To Cosm

Below is the code I currently have compiled. I have a capacitive sensor (piece of copper) with a 15 megohm resistor, when running on its own the serial monitor is showing values around 4000. When sensing the values are around 8-9000. I would like to track/log the amount of time that the sensor is active (8-9000+) on Cosm.

I have an Arduino Ethernet shield on top of an Arduino Uno and a breadboard. (See images)

I’m new to this, and would greatly appreciate the support.


#include <CapSense.h>

CapSense cs_4_2 = CapSense(4,2); // 15 megohm resistor between pins 4 & 2, pin 2 is sensor pin, add Material
// CapSense cs_4_5 = CapSense(4,5); // OPTIONAL: for sensor 2, 15 megohm resistor between pins 4 & 6, pin 6 is sensor pin, add Material
// CapSense cs_4_8 = CapSense(4,8); // OPTIONAL: for sensor 3, 15 megohm resistor between pins 4 & 8, pin 8 is sensor pin, add Material

void setup()
{
cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF); // turn off autocalibrate on channel 1 - just as an example
Serial.begin(9600);
}

void loop()

{
long start = millis();
long total1 = cs_4_2.capSense(30);
// long total2 = cs_4_5.capSense(30); // OPTIONAL for sensor 2
// long total3 = cs_4_8.capSense(30); // OPTIONAL for sensor 3

// Serial.print(millis() - start); // OPTIONAL: check on performance in milliseconds
// Serial.print(" "); // OPTIONAL: tab character for debug windown spacing

Serial.println(total1); // OPTIONAL: To use additional sensors,change Serial.println to Serial.print for proper window spacing
//Serial.print(" “); // OPTIONAL: tab character for window spacing for sensor output 2
//Serial.print(total2); // OPTIONAL: print sensor output 2
//Serial.print(” "); // OPTIONAL: tab character character for sensor output 3
//Serial.println(total3); // print sensor output 3

delay(100); // arbitrary delay to limit data to serial port
}

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

#define APIKEY “YdsCzUG0fG4d464RksEUkYWZArCSAKxDRjJHbU5iMmRJST0g” // replace your Cosm api key here
#define FEEDID 69971 // replace your feed ID
#define USERAGENT “Spaces” // 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 = {
0x90, 0xA2, 0xDA, 0x00, 0xD3, 0xE6};

// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,1,65);

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

I merged the 2 pieces of code for you.

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

CapSense   cs_4_2 = CapSense(4,2);         // 15 megohm resistor between pins 4 & 2, pin 2 is sensor pin, add Material

#define APIKEY         "YdsCzUG0fG4d464RksEUkYWZArCSAKxDRjJHbU5iMmRJST0g" // replace your Cosm api key here
#define FEEDID         69971 // replace your feed ID
#define USERAGENT      "Spaces" // 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[] = { 
  0x90, 0xA2, 0xDA, 0x00, 0xD3, 0xE6};

// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,1,65); 

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

   cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);     // turn off autocalibrate on channel 1 - just as an example   

 // 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:
  long sensorReading =  cs_4_2.capSense(30);   

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

This makes sense - Thank you so much. Learning as I go here and greatly appreciate it. I had another question, in regards to the IP address. I had just plugged the ethernet cable from the arduino ethernet shield into my macbook, but will that be able to send the data to Cosm? Or do I need to plug directly into my wireless router? Not sure how that works? I tried both with no luck… see error I received when connecting a cable directly to the wireless router.

Also not sure if anything needs to be edited in the code for the datastream I had setup on the Cosm page? This is the code from the XML

Spaces https://api.cosm.com/v2/feeds/69971.xml frozen Spaces true arduino Spaces 1 Grand Rapids, MI 42.8854150263301 -85.638427734375 time minutes

I had just plugged the ethernet cable from the arduino ethernet shield into my macbook, but will that be able to send the data to Cosm?

No. That ethernet connector is used to connect your Macbook to a network. I assume your Mac is connected to the internet through WiFi, and that's why that ethernet connector is not taken.

Or do I need to plug directly into my wireless router?

Yes.

The last message (403) makes sense. It tells you explicitly "unable to access....." That has something to do with the way you access the site (maybe it needs a valid registration (user) key in the url).

I guess I'm a little confused. So I need to shut off the wi-fi and connect the macbook directly into the wireless router? Do I need another ethernet cable to run from the Arduino Ethernet shield to the router as well then?

Thanks-

florinc:

I had just plugged the ethernet cable from the arduino ethernet shield into my macbook, but will that be able to send the data to Cosm?

No. That ethernet connector is used to connect your Macbook to a network. I assume your Mac is connected to the internet through WiFi, and that's why that ethernet connector is not taken.

Or do I need to plug directly into my wireless router?

Yes.

The last message (403) makes sense. It tells you explicitly "unable to access....." That has something to do with the way you access the site (maybe it needs a valid registration (user) key in the url).

I guess I'm a little confused. So I need to shut off the wi-fi and connect the macbook directly into the wireless router?

No, no, no. Leave your mac on wifi. You will be able to access the internet from it. You just need a second connection to internet, from your Arduino ethernet shield to your router. And yes, you need a cable to connect the two.

florinc:

I guess I'm a little confused. So I need to shut off the wi-fi and connect the macbook directly into the wireless router?

No, no, no. Leave your mac on wifi. You will be able to access the internet from it. You just need a second connection to internet, from your Arduino ethernet shield to your router. And yes, you need a cable to connect the two.

Alright, that's what I was doing when I was receiving those messages in the serial monitor. I have the ethernet cable plugged into port 1 of 4 of the local ethernet ports on the wireless router. You had mentioned needing a valid registration (user) key in the url) where would I find/add that?

I am using the ip address from the network settings that my mac is showing for the wi-fi. 192.168.1.65.

You can use the domain, "cosm.com", with the Ethernet lib, I believe. You get the key from cosm.com site as well, and that identifies you as a user of the site.

florinc: You can use the domain, "cosm.com", with the Ethernet lib, I believe. You get the key from cosm.com site as well, and that identifies you as a user of the site.

I was flipping through here http://arduino.cc/it/Reference/Ethernet - not sure I'm seeing which piece to pull from- and not certain where I would enter this domain/key into this code?

Take a look at the Ethernet example sketch coming with Arduino 1.0. Also google for Ethernet Arduino projects, you will find lots of examples.