Public Repository for IoT demo, leveraging the FRDM-K64F, WNC Cellular Modem, and AT&T M2X platform. Expects GPIO input from a sensor to send a discrete value to M2X.

Dependencies:   ConfigFile M2XStreamClient-JMF PinDetect SDFileSystem WNCInterface jsonlite mbed-rtos mbed

Fork of SVP_IoT_M2X_Cellular by Casey Bleeker

Committer:
geekbleek
Date:
Sun Feb 19 20:30:23 2017 +0000
Revision:
7:5f9a23deaca1
Parent:
6:67203388294b
Child:
8:b18770740a4d
logic for M2X GPIO sensor input;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JMF 0:62feed0f1fd9 1 //
JMF 0:62feed0f1fd9 2 // This file contains an example implementation of M2X using the HTTP interface as the underlying
JMF 0:62feed0f1fd9 3 // transport.
JMF 0:62feed0f1fd9 4 //
JMF 0:62feed0f1fd9 5
JMF 0:62feed0f1fd9 6 #include "mbed.h"
geekbleek 5:f03cda4a4cc9 7 #include "PinDetect.h"
JMF 0:62feed0f1fd9 8 #include "WNCInterface.h"
JMF 0:62feed0f1fd9 9
JMF 0:62feed0f1fd9 10 #define MBED_PLATFORM
JMF 0:62feed0f1fd9 11 #define M2X_ENABLE_READER
JMF 0:62feed0f1fd9 12
JMF 0:62feed0f1fd9 13 #include <jsonlite.h>
JMF 0:62feed0f1fd9 14 #include "M2XStreamClient.h"
JMF 0:62feed0f1fd9 15
JMF 0:62feed0f1fd9 16 #define CRLF "\n\r"
JMF 0:62feed0f1fd9 17
geekbleek 4:b9f2193b27cf 18 char deviceId[] = "3263056a467bc4eacd787bb0af9c1ad6"; // Device you want to post to
geekbleek 4:b9f2193b27cf 19 char m2xKey[] = "0aad274b67c7faa8110769ae9d739033"; // Your M2X API Key or Master API Key
JMF 0:62feed0f1fd9 20
JMF 0:62feed0f1fd9 21 char fromTime[]= "1969-12-31T19:00:01.000Z"; // yyyy-mm-ddTHH:MM:SS.SSSZ
JMF 0:62feed0f1fd9 22 char endTime[25];
JMF 0:62feed0f1fd9 23
geekbleek 6:67203388294b 24 DigitalOut led_green(LED_GREEN);
geekbleek 6:67203388294b 25 DigitalOut led_red(LED_RED);
geekbleek 6:67203388294b 26 DigitalOut led_blue(LED_BLUE);
geekbleek 4:b9f2193b27cf 27
JMF 0:62feed0f1fd9 28 WNCInterface eth;
JMF 0:62feed0f1fd9 29 Client client;
JMF 0:62feed0f1fd9 30 M2XStreamClient m2xClient(&client, m2xKey);
JMF 0:62feed0f1fd9 31 TimeService timeService(&m2xClient);
JMF 1:1c840717deea 32 MODSERIAL pc(USBTX,USBRX,256,256);
JMF 0:62feed0f1fd9 33
geekbleek 4:b9f2193b27cf 34 //********************************************************************************************************************************************
geekbleek 4:b9f2193b27cf 35 //* Set the RGB LED's Color
geekbleek 4:b9f2193b27cf 36 //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue)
geekbleek 4:b9f2193b27cf 37 //********************************************************************************************************************************************
geekbleek 6:67203388294b 38 void SetLedColor(unsigned char ucColor)
geekbleek 6:67203388294b 39 {
geekbleek 6:67203388294b 40 //Note that when an LED is on, you write a 0 to it:
geekbleek 6:67203388294b 41 led_red = !(ucColor & 0x1); //bit 0
geekbleek 6:67203388294b 42 led_green = !(ucColor & 0x2); //bit 1
geekbleek 6:67203388294b 43 led_blue = !(ucColor & 0x4); //bit 2
geekbleek 6:67203388294b 44 } //SetLedColor()
geekbleek 5:f03cda4a4cc9 45
geekbleek 5:f03cda4a4cc9 46
geekbleek 5:f03cda4a4cc9 47
geekbleek 5:f03cda4a4cc9 48 /*
geekbleek 5:f03cda4a4cc9 49 * Note, the PinDetect can be defined thus:-
geekbleek 5:f03cda4a4cc9 50 * PinDetect pin( p21, PullDown );
geekbleek 5:f03cda4a4cc9 51 * This allows you to specify the DigitalIn pinmode
geekbleek 5:f03cda4a4cc9 52 * when you create the PinDetect object. This means
geekbleek 5:f03cda4a4cc9 53 * using pin.mode() later is then no longer required.
geekbleek 5:f03cda4a4cc9 54 */
geekbleek 6:67203388294b 55
geekbleek 6:67203388294b 56 PinDetect pin ( A4, PullUp );
geekbleek 6:67203388294b 57 PinDetect button ( SW3, PullUp );
geekbleek 6:67203388294b 58 int pinState;
geekbleek 6:67203388294b 59
geekbleek 5:f03cda4a4cc9 60 // C function callbacks follow.
geekbleek 5:f03cda4a4cc9 61
geekbleek 5:f03cda4a4cc9 62 void keyPressed( void ) {
geekbleek 6:67203388294b 63 pinState = pinState++;
geekbleek 6:67203388294b 64 SetLedColor(1);
geekbleek 6:67203388294b 65 //pc.printf("Key Pressed\n");
geekbleek 5:f03cda4a4cc9 66 }
geekbleek 5:f03cda4a4cc9 67
geekbleek 5:f03cda4a4cc9 68 void keyReleased( void ) {
geekbleek 6:67203388294b 69 pinState = pinState--;
geekbleek 6:67203388294b 70 if(pinState == 0){
geekbleek 6:67203388294b 71 SetLedColor(4);
geekbleek 6:67203388294b 72 };
geekbleek 6:67203388294b 73 //pc.printf("Key Released\n");
geekbleek 5:f03cda4a4cc9 74 }
geekbleek 5:f03cda4a4cc9 75
geekbleek 5:f03cda4a4cc9 76 void keyPressedHeld( void ) {
geekbleek 6:67203388294b 77 pinState = 2;
geekbleek 6:67203388294b 78 //led3 = 1;
geekbleek 6:67203388294b 79 //pc.printf("Key Pressed Held\n");
geekbleek 5:f03cda4a4cc9 80 }
geekbleek 5:f03cda4a4cc9 81
geekbleek 5:f03cda4a4cc9 82 void keyReleasedHeld( void ) {
geekbleek 6:67203388294b 83 //led4 = 1;
geekbleek 6:67203388294b 84 //pc.printf("Key Released Held\n");
geekbleek 5:f03cda4a4cc9 85 }
geekbleek 7:5f9a23deaca1 86
geekbleek 7:5f9a23deaca1 87 void initModem() {
geekbleek 7:5f9a23deaca1 88 int response;
geekbleek 7:5f9a23deaca1 89 pc.printf("Start m2x-demo-all by initializing the network" CRLF);
geekbleek 7:5f9a23deaca1 90 eth.doDebug(2);
geekbleek 7:5f9a23deaca1 91 response = eth.init(NULL, &pc);
geekbleek 7:5f9a23deaca1 92 pc.printf("Response is: %d" CRLF, response);
geekbleek 7:5f9a23deaca1 93 pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response);
geekbleek 7:5f9a23deaca1 94 while( !response ) {
geekbleek 7:5f9a23deaca1 95 SetLedColor(0);
geekbleek 7:5f9a23deaca1 96 pc.printf(" - - - - - - - WAITING FOR CELL MODEM TO COME ONLINE - - - - - - - " CRLF);
geekbleek 7:5f9a23deaca1 97 wait(30);
geekbleek 7:5f9a23deaca1 98 response = eth.init(NULL, &pc);
geekbleek 7:5f9a23deaca1 99 pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response);
geekbleek 7:5f9a23deaca1 100 };
geekbleek 7:5f9a23deaca1 101
geekbleek 7:5f9a23deaca1 102 if(response){
geekbleek 7:5f9a23deaca1 103 eth.doDebug(0);
geekbleek 7:5f9a23deaca1 104 SetLedColor(2);
geekbleek 7:5f9a23deaca1 105 };
geekbleek 7:5f9a23deaca1 106
geekbleek 7:5f9a23deaca1 107 response = eth.connect();
geekbleek 7:5f9a23deaca1 108 pc.printf("IP Address: %s " CRLF CRLF, eth.getIPAddress());
geekbleek 7:5f9a23deaca1 109
geekbleek 7:5f9a23deaca1 110 }
geekbleek 7:5f9a23deaca1 111
geekbleek 7:5f9a23deaca1 112 void initM2X() {
geekbleek 7:5f9a23deaca1 113 pc.printf("starting M2X data push..." CRLF);
geekbleek 7:5f9a23deaca1 114
geekbleek 7:5f9a23deaca1 115 pc.printf("initialize the M2X time service" CRLF);
geekbleek 7:5f9a23deaca1 116 if (!m2x_status_is_success(timeService.init()))
geekbleek 7:5f9a23deaca1 117 pc.printf("Cannot initialize time service!" CRLF);
geekbleek 7:5f9a23deaca1 118 else {
geekbleek 7:5f9a23deaca1 119 timeService.getTimestamp(timestamp, &length);
geekbleek 7:5f9a23deaca1 120 pc.printf("Current timestamp: %s" CRLF, timestamp);
geekbleek 7:5f9a23deaca1 121 strcpy(endTime,timestamp);
geekbleek 7:5f9a23deaca1 122 SetLedColor(4);
geekbleek 7:5f9a23deaca1 123 }
geekbleek 7:5f9a23deaca1 124 }
geekbleek 5:f03cda4a4cc9 125
geekbleek 5:f03cda4a4cc9 126 // The main program.
geekbleek 5:f03cda4a4cc9 127
JMF 0:62feed0f1fd9 128 int main() {
geekbleek 6:67203388294b 129 pinState = 0;
geekbleek 4:b9f2193b27cf 130 pc.baud(115200);
geekbleek 6:67203388294b 131 pc.printf("Hello World! I am here!" CRLF);
geekbleek 5:f03cda4a4cc9 132 pin.attach_asserted( &keyPressed );
geekbleek 5:f03cda4a4cc9 133 pin.attach_deasserted( &keyReleased );
geekbleek 6:67203388294b 134 button.attach_asserted( &keyPressed );
geekbleek 6:67203388294b 135 button.attach_deasserted( &keyReleased );
geekbleek 6:67203388294b 136 //pin.attach_asserted_held( &keyPressedHeld );
geekbleek 4:b9f2193b27cf 137
geekbleek 5:f03cda4a4cc9 138 // This callback will often be of little use as it's
geekbleek 5:f03cda4a4cc9 139 // called after every assertion/deassertion. However,
geekbleek 5:f03cda4a4cc9 140 // it's provided for completeness. You may find a use
geekbleek 5:f03cda4a4cc9 141 // for it. If not, just don't attach a callback and it
geekbleek 5:f03cda4a4cc9 142 // will not activate.
geekbleek 6:67203388294b 143 //pin.attach_deasserted_held( &keyReleasedHeld );
JMF 0:62feed0f1fd9 144
geekbleek 5:f03cda4a4cc9 145 // You can define how many continuous samples must be
geekbleek 5:f03cda4a4cc9 146 // asserted before the attach_asserted() function is called.
geekbleek 5:f03cda4a4cc9 147 // pin.setSamplesTillAssert( 10 );
geekbleek 5:f03cda4a4cc9 148 // This would mean 10 * 20ms debounce time = 200ms.
geekbleek 5:f03cda4a4cc9 149
geekbleek 5:f03cda4a4cc9 150 // You can define how many continuous samples must be
geekbleek 5:f03cda4a4cc9 151 // asserted before the attach_asserted_held() function is called.
geekbleek 5:f03cda4a4cc9 152 // pin.setSamplesTillHeld( 200 );
geekbleek 5:f03cda4a4cc9 153 // This would mean 200 * 20ms debounce time = 2seconds.
geekbleek 5:f03cda4a4cc9 154
geekbleek 5:f03cda4a4cc9 155 // By default, "asserted" assumes the pin going high from 0volts to 5volts
geekbleek 5:f03cda4a4cc9 156 // and deasserted assumes going from 5volts to 0volts. You can invert this
geekbleek 5:f03cda4a4cc9 157 // logic so that going to 0volts is asserted and going to 5volts is deasserted
geekbleek 5:f03cda4a4cc9 158 // using this setup function:-
geekbleek 6:67203388294b 159 pin.setAssertValue( 0 );
geekbleek 6:67203388294b 160 button.setAssertValue( 0 );
geekbleek 5:f03cda4a4cc9 161
geekbleek 7:5f9a23deaca1 162
geekbleek 7:5f9a23deaca1 163
geekbleek 7:5f9a23deaca1 164
geekbleek 7:5f9a23deaca1 165 char timestamp[25];
geekbleek 7:5f9a23deaca1 166 int length = 25;
geekbleek 7:5f9a23deaca1 167 int m2xresponse, cnt=1;
geekbleek 7:5f9a23deaca1 168 int pinValue;
geekbleek 7:5f9a23deaca1 169
geekbleek 7:5f9a23deaca1 170 wait(20);
geekbleek 7:5f9a23deaca1 171 initModem(); //call function to init modem, wait till it comes online, and get IP address
geekbleek 7:5f9a23deaca1 172 initM2X{};
geekbleek 7:5f9a23deaca1 173
geekbleek 7:5f9a23deaca1 174 // //debug
geekbleek 7:5f9a23deaca1 175 // wait(10); // wait for terminal connected
geekbleek 7:5f9a23deaca1 176 // pc.printf("STARTING WNCInterface" CRLF);
geekbleek 7:5f9a23deaca1 177 // eth.doDebug(0); // if you want a LOT of AT commands logged (1)
geekbleek 7:5f9a23deaca1 178 //
geekbleek 7:5f9a23deaca1 179 // // init and connect the WNCInterface cell modem
geekbleek 7:5f9a23deaca1 180 // pc.printf("init() returned 0x%04X" CRLF, eth.init());
geekbleek 7:5f9a23deaca1 181 // response = eth.connect();
geekbleek 7:5f9a23deaca1 182 //
geekbleek 7:5f9a23deaca1 183 // if(response){
geekbleek 7:5f9a23deaca1 184 // SetLedColor(2);
geekbleek 7:5f9a23deaca1 185 // };
geekbleek 7:5f9a23deaca1 186
geekbleek 7:5f9a23deaca1 187 // pc.printf("IP Address: %s " CRLF, eth.getIPAddress());
geekbleek 7:5f9a23deaca1 188 // pc.printf("-------------------------------------" CRLF);
geekbleek 7:5f9a23deaca1 189
geekbleek 7:5f9a23deaca1 190
geekbleek 7:5f9a23deaca1 191 // Start Pin Samping
geekbleek 5:f03cda4a4cc9 192 // Sampling does NOT begin until you set the frequency. So, until
geekbleek 5:f03cda4a4cc9 193 // you call this function NO callbacks will be made. With no arguments
geekbleek 5:f03cda4a4cc9 194 // passed the default is 20000 microseconds (20ms). Specifiy the sampling
geekbleek 5:f03cda4a4cc9 195 // period in microseconds if you want a different value to 20ms.
geekbleek 5:f03cda4a4cc9 196 // For example, for a sampling period of 10ms do:-
geekbleek 5:f03cda4a4cc9 197 // pin.setSampleFrequency( 10000 );
geekbleek 5:f03cda4a4cc9 198 // Note, if you change the sampling frequency you will probably also
geekbleek 5:f03cda4a4cc9 199 // want to change the number of samples till assert and held as show
geekbleek 5:f03cda4a4cc9 200 // above.
geekbleek 5:f03cda4a4cc9 201 pin.setSampleFrequency(); // Defaults to 20ms.
geekbleek 6:67203388294b 202 button.setSampleFrequency();
geekbleek 6:67203388294b 203
geekbleek 5:f03cda4a4cc9 204 while( 1 ) {
geekbleek 6:67203388294b 205 //pc.printf("Hello World! I am still here!" CRLF);
geekbleek 6:67203388294b 206 pc.printf("Pin state is: %d" CRLF, pinState);
geekbleek 7:5f9a23deaca1 207 if(pinState >= 1){
geekbleek 7:5f9a23deaca1 208 pinValue = 1;
geekbleek 7:5f9a23deaca1 209 }
geekbleek 7:5f9a23deaca1 210 else {
geekbleek 7:5f9a23deaca1 211 pinValue = 0;
geekbleek 7:5f9a23deaca1 212 }
geekbleek 7:5f9a23deaca1 213 pc.printf("Pin value is: %d" CRLF, pinValue);
geekbleek 6:67203388294b 214 pc.printf("cnt=%d\r\n",cnt++);
geekbleek 6:67203388294b 215 // post the temp value
geekbleek 7:5f9a23deaca1 216 pc.printf("Post updateStreamValue (pinValue = %d)..." CRLF, pinState);
geekbleek 7:5f9a23deaca1 217 m2xresponse = m2xClient.updateStreamValue(deviceId, "water-sensor", pinValue);
geekbleek 7:5f9a23deaca1 218 pc.printf("Post response code: %d" CRLF, m2xresponse);
geekbleek 7:5f9a23deaca1 219 if (m2xresponse != 202){
geekbleek 7:5f9a23deaca1 220 SetLedColor(2);
geekbleek 7:5f9a23deaca1 221 pc.printf("Error connecting to M2X" CRLF);
geekbleek 7:5f9a23deaca1 222 //pc.printf("IP Address: %s " CRLF CRLF, eth.getIPAddress());
geekbleek 7:5f9a23deaca1 223 if (m2xresponse == -1){
geekbleek 7:5f9a23deaca1 224 pc.printf("Modem Error - attempting to reconnect" CRLF);
geekbleek 7:5f9a23deaca1 225 initModem();
geekbleek 7:5f9a23deaca1 226 initM2X();
geekbleek 7:5f9a23deaca1 227 }
geekbleek 7:5f9a23deaca1 228 }
geekbleek 6:67203388294b 229 timeService.getTimestamp(timestamp, &length);
geekbleek 6:67203388294b 230 pc.printf("Thats all folks, got to wait 5 seconds... (%s)" CRLF CRLF CRLF, timestamp);
geekbleek 6:67203388294b 231
geekbleek 6:67203388294b 232 // wait 5 secs and then loop
geekbleek 6:67203388294b 233 delay(5000);
geekbleek 4:b9f2193b27cf 234 }
geekbleek 5:f03cda4a4cc9 235 }