Hello.I have a question about sending data to xively.I am using a photoelectric sensor,arduino uno and gsm shield.But i don't know how to implemet read sensor data section program with gsm example library and send them to xively.
Here is the Read Sensor data function:
#include <GSM.h>
#define APIKEY "" // replace your pachube api key here
#define FEEDID 12345 // replace your feed ID
#define USERAGENT "" // user agent is the project name
#define PINNUMBER ""
#define GPRS_APN "" // replace your GPRS APN
#define GPRS_LOGIN "" // replace with your GPRS login
#define GPRS_PASSWORD "" // replace with your GPRS password
#include <PinChangeInt.h>
#define DATA 8
unsigned long time;
int cont=0;
void setup() {
Serial.begin(9600);
pinMode(DATA, INPUT);
PCintPort::attachInterrupt(DATA,&cambio,FALLING);
}
void loop()
{
time = millis()/999;
Serial.println(cont);
delay(800);//Only to see serial monitor outputs
}
void change() {
cont++;
}
Could be the compatibility of libraries the problem?
// libraries
#include <GSM.h>
#include <PinChangeInt.h>
// Pachube Client data
#define APIKEY "" // replace your pachube api key here
#define FEEDID 12345 // replace your feed ID
#define USERAGENT "" // user agent is the project name
#define DATA 8
int contador=0;
// PIN Number
#define PINNUMBER ""
// APN data
#define GPRS_APN "" // replace your GPRS APN
#define GPRS_LOGIN "" // replace with your GPRS login
#define GPRS_PASSWORD "" // replace with your GPRS password
// initialize the library instance:
GSMClient client;
GPRS gprs;
GSM gsmAccess(true);
// 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.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()
{
// initialize serial communications and wait for port to open:
Serial.begin(9600);
pinMode(DATA, INPUT);//line from PinChangeInt
PCintPort::attachInterrupt(DATA,&cambio,FALLING);//line from PinChangeInt
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// connection state
boolean notConnected = true;
// After starting the modem with GSM.begin()
// attach the shield to the GPRS network with the APN, login and password
while(notConnected)
{
if((gsmAccess.begin(PINNUMBER)==GSM_READY) &
(gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD)==GPRS_READY))
notConnected = false;
else
{
Serial.println("Not connected");
delay(1000);
}
}
}
void loop()
{
PCintPort::attachInterrupt(DATA,&cambio,FALLING);//line from PinChangeInt
// 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)
{
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(contador);
}
// 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-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;
}
void cambio() {
contador=contador+1;
}
PCintPort::attachInterrupt(DATA,&cambio,FALLING);//line from PinChangeInt
Maybe you need a few more calls to attach the interrupt handler, in case it falls off.
The code you posted does something. It is not clear what.
You want the code to do something. It is not clear what.
All we can tell is that what it does is not what you want.
#include <PinChangeInt.h>
#define DATA 8
int cont=0;
void setup() {
Serial.begin(9600);
pinMode(DATA, INPUT);
PCintPort::attachInterrupt(DATA,&cambio,FALLING);
}
void loop()
{
Serial.println(cont);//to see the serial monitor outputs
delay(800);
}
void cambio() {
cont++;
}
reads interrupts from a photoelectric sensor in Pin 8 connected to GSM Shield and with the second program(GSMPachubeClient from examples Arduino ide) send the interrupts stored in a variable(cont in this case ) to Xively web or another store data on web.The problem comes when i use <PinChangeInt.h> and <GSM.h> together in the two programs union.
Thanks
Hi.It doesn' compile with two libraries together and send an error mensaje:
GSM\GSM3SoftSerial.cpp.o: In function __vector_5': C:\Program Files (x86)\Arduino\libraries\GSM/GSM3SoftSerial.cpp:525: multiple definition of __vector_5'
GSMPachubeClient.cpp.o:C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:543: first defined here
GSM\GSM3SoftSerial.cpp.o: In function __vector_4': C:\Program Files (x86)\Arduino\libraries\GSM/GSM3SoftSerial.cpp:518: multiple definition of __vector_4'
GSMPachubeClient.cpp.o:C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:533: first defined here
GSM\GSM3SoftSerial.cpp.o: In function __vector_3': C:\Program Files (x86)\Arduino\libraries\GSM/GSM3SoftSerial.cpp:511: multiple definition of __vector_3'
GSMPachubeClient.cpp.o:C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:523: first defined here
I suggest you get a Leonardo, which has two hardware serial ports - one using the USB so you can communicate with the PC, and one using pins 0 and 1, so you can use Serial1 to communicate with the GSM thing. Then, the external interrupt pins will be available for you to use.