a demo to post your sensor data from ARCH GPRS to Xively

Dependencies:   GPRS mbed

Fork of USB2UART by Yihui Xiong

ARCH GPRS With Xively

IOT Architecture

  • Xively is an on-line database service allowing developers to connect sensor-derived data (e.g. energy and environment data from objects, devices & buildings) to the Web and to build their own applications based on that data,to know more, visit https://xively.com/
  • Here, we use ARCH GPRS to post our sensor data(temperature/light/humidity etc.) to Xively.

ARCH GPRS Introduction

ARCH GPRS

  • Arch GPRS is a wireless network module based on EG-10, it can achive remote data colletion function to communicate with outside world by GPRS network.
  • Arch GPRS has standard Arduino interface and Grove connectors. It’s convenient to connect existing Shields and Grove products to Arch GPRS.
  • You can use the solar panel to charge for battery, and own to its low-power design, so Arch GPRS can work normally in outdoor.
  • For more information, please visit http://www.seeedstudio.com/depot/arch-gprs-p-1657.html?cPath=6_11

Code

  • Description: this demo is used as posting value of sound sensor to Xively every 10 seconds.
  • Attention: you need to replace the PHONE_NUMBER/FEED_ID/SENSOR_ID/XIVELY_KEY with yours.

main.cpp

#include "gprs.h"
 
#define PHONE_NUMBER    "139****7382"
#define IP_ADDRSS       "216.52.233.120" //api.xively.com
#define PORT            "80" //port addr
#define FEED_ID         "your feeed ID"
#define SENSOR_ID       "your sensor ID"
#define XIVELY_KEY      "your Xively Key"
#define REQUEST_LENGTH  36
#define DATA_LENGTH     90
#define HEAD_LEN        270
 
#define NETWORK_APN     "CMNET"  //replace APN in your country
 
#define PINPWR          P1_2    // power on EG 10, low enable
#define PINONOFF        P1_7    // switch of EG10, low enable, low for 2s to turn on EG10
 
DigitalOut eg10_pwr(PINPWR);
DigitalOut eg10_on(PINONOFF);
GPRS gprs(USBTX, USBRX,115200,PHONE_NUMBER);
AnalogIn soundSensor(P0_11);
 
void EG10_PowerUp(void)
{
    eg10_pwr = 1;
    eg10_on  = 1;
    wait(2);
    eg10_pwr = 0;
    eg10_on = 0;
    wait(2);
    eg10_on = 1;
    wait(2);
}
 
int putDataToXively(float sensorValue)
{
    char request[REQUEST_LENGTH];
    char dataStream[DATA_LENGTH];
    char head[HEAD_LEN];
    snprintf(request,REQUEST_LENGTH,"PUT /v2/feeds/%s HTTP/1.1\r\n",FEED_ID);
    snprintf(dataStream,DATA_LENGTH,"{\"version\":\"1.0.0\", \"datastreams\" : [{ \"id\" : \"%s\", \"current_value\" : \"%f\"}]}\r\n",SENSOR_ID,sensorValue);
    int dataLen = strlen(dataStream);
    snprintf(head,HEAD_LEN,"%sHost: api.xively.com\r\nX-ApiKey: %s\r\nUser-Agent: Xively-Arduino-Lib/1.0\r\nContent-Length: %d\r\n\r\n%s",request,XIVELY_KEY,dataLen,dataStream);
    if(0 != gprs.networkInit(NETWORK_APN,NULL,NULL)){ //APN,User,PassWd
        return -1;    
    }
    if(0 != gprs.connectTCP(IP_ADDRSS,PORT)) {
        goto STOP;
    }
    wait(5);
    if(0 != gprs.sendTCPData(head)) {
        goto STOP;
    }
STOP:
    gprs.closeTCP();
    return 0;
}
 
int main()
{
    EG10_PowerUp();
    while(0 != gprs.init()) {
        wait(2);
    }
    while(1) {
        putDataToXively(10*soundSensor.read());
        wait(10);
    }
}
Revision:
3:40d09aa56b86
Parent:
2:427b69ad737c
Child:
5:97b82fe2c712
--- a/main.cpp	Wed Dec 25 03:04:09 2013 +0000
+++ b/main.cpp	Fri Jan 10 06:01:05 2014 +0000
@@ -1,46 +1,64 @@
-/**
- * USB to UART Bridge
- */
- 
-#include "mbed.h"
-#include "USBSerial.h"
+#include "gprs.h"
 
-Serial uart(USBTX, USBRX);
-USBSerial pc;
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-DigitalOut led3(LED3);
+#define PHONE_NUMBER    "139****7382"
+#define IP_ADDRSS       "216.52.233.120" //api.xively.com
+#define PORT            "80" //port addr
+#define FEED_ID         "your feeed ID"
+#define SENSOR_ID       "your sensor ID"
+#define XIVELY_KEY      "your Xively Key"
+#define REQUEST_LENGTH  36
+#define DATA_LENGTH     90
+#define HEAD_LEN        270
+
+#define PINPWR          P1_2    // power on EG 10, low enable
+#define PINONOFF        P1_7    // switch of EG10, low enable, low for 2s to turn on EG10
+
+DigitalOut eg10_pwr(PINPWR);
+DigitalOut eg10_on(PINONOFF);
+GPRS gprs(USBTX, USBRX,115200,PHONE_NUMBER);
+AnalogIn soundSensor(P0_11);
 
-// Called by ISR
-void settingsChanged(int baud, int bits, int parity, int stop)
+void EG10_PowerUp(void)
+{
+    eg10_pwr = 1;
+    eg10_on  = 1;
+    wait(2);
+    eg10_pwr = 0;
+    eg10_on = 0;
+    wait(2);
+    eg10_on = 1;
+    wait(2);
+}
+
+int putDataToXively(float sensorValue)
 {
-    const Serial::Parity parityTable[] = {Serial::None, Serial::Odd, Serial::Even, Serial::Forced0, Serial::Forced1};
-    
-    
-    led1 = 1;
-    if (stop != 2) {
-        stop = 1;   // stop bit(s) = 1 or 1.5
+    char request[REQUEST_LENGTH];
+    char dataStream[DATA_LENGTH];
+    char head[HEAD_LEN];
+    snprintf(request,REQUEST_LENGTH,"PUT /v2/feeds/%s HTTP/1.1\r\n",FEED_ID);
+    snprintf(dataStream,DATA_LENGTH,"{\"version\":\"1.0.0\", \"datastreams\" : [{ \"id\" : \"%s\", \"current_value\" : \"%f\"}]}\r\n",SENSOR_ID,sensorValue);
+    int dataLen = strlen(dataStream);
+    snprintf(head,HEAD_LEN,"%sHost: api.xively.com\r\nX-ApiKey: %s\r\nUser-Agent: Xively-Arduino-Lib/1.0\r\nContent-Length: %d\r\n\r\n%s",request,XIVELY_KEY,dataLen,dataStream);
+    if(0 != gprs.connectTCP(IP_ADDRSS,PORT)) {
+        goto STOP;
     }
-    uart.baud(baud);
-    uart.format(bits, parityTable[parity], stop);
-    led1 = 0;
+    wait(5);
+    if(0 != gprs.sendTCPData(head)) {
+        goto STOP;
+    }
+STOP:
+    gprs.closeTCP();
+    return 0;
 }
 
 int main()
 {
-    pc.attach(settingsChanged);
-    
-    while (1) {
-        while (uart.readable()) {
-            led2 = 1;
-            pc.putc(uart.getc());
-            led2 = 0;
-        }
-        
-        while (pc.readable()) {
-            led3 = 1;
-            uart.putc(pc.getc());
-            led3 = 0;
-        }
+    EG10_PowerUp();
+    while(0 != gprs.init()) {
+        wait(2);
+    }
+    while(1) {
+        putDataToXively(10*soundSensor.read());
+        wait(10);
     }
 }