Version one of final code

Dependencies:   ARCH_GPRS_V2_HW Blinker GPRSInterface HTTPClient_GPRS SDFileSystem USBDevice mbed

Committer:
mbotkinl
Date:
Thu Apr 16 19:46:40 2015 +0000
Revision:
0:a2a4d0d432b3
Code from Micah and Z

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbotkinl 0:a2a4d0d432b3 1 //SEED Team 20 Final Code draft 1 4/16/15
mbotkinl 0:a2a4d0d432b3 2
mbotkinl 0:a2a4d0d432b3 3 #include "mbed.h"
mbotkinl 0:a2a4d0d432b3 4 #include "SDFileSystem.h"
mbotkinl 0:a2a4d0d432b3 5 #include "ARCH_GPRS_V2_HW.h"
mbotkinl 0:a2a4d0d432b3 6 #include "HTTPClient.h"
mbotkinl 0:a2a4d0d432b3 7 #include "GPRSInterface.h"
mbotkinl 0:a2a4d0d432b3 8 #include "Blinker.h"
mbotkinl 0:a2a4d0d432b3 9 #include "DHT.h"
mbotkinl 0:a2a4d0d432b3 10 #include "i2c_uart.h"
mbotkinl 0:a2a4d0d432b3 11 #include "ARCH_GPRS_Sleep.h"
mbotkinl 0:a2a4d0d432b3 12
mbotkinl 0:a2a4d0d432b3 13 #define PIN_TX P1_27
mbotkinl 0:a2a4d0d432b3 14 #define PIN_RX P1_26
mbotkinl 0:a2a4d0d432b3 15
mbotkinl 0:a2a4d0d432b3 16 #define BROADCAST_TIME 20
mbotkinl 0:a2a4d0d432b3 17 //LED Blink
mbotkinl 0:a2a4d0d432b3 18 Blinker yellowLED(LED1), redLED(LED2), greenLED(LED3), blueLED(LED4);
mbotkinl 0:a2a4d0d432b3 19
mbotkinl 0:a2a4d0d432b3 20 //USBSerial pc;
mbotkinl 0:a2a4d0d432b3 21 SDFileSystem sd(P1_22, P1_21, P1_20, P1_23, "sd"); // the pinout on the /Arch GPRS v2 mbed board.
mbotkinl 0:a2a4d0d432b3 22
mbotkinl 0:a2a4d0d432b3 23 //variables for reading data from SD card
mbotkinl 0:a2a4d0d432b3 24 char APIKey[17];
mbotkinl 0:a2a4d0d432b3 25 char sensors[3][5];
mbotkinl 0:a2a4d0d432b3 26 char sensorBuff[5];
mbotkinl 0:a2a4d0d432b3 27 int tempField, humField, lightField;
mbotkinl 0:a2a4d0d432b3 28 int field1, field2, field3;
mbotkinl 0:a2a4d0d432b3 29 int numSensors;
mbotkinl 0:a2a4d0d432b3 30 bool tempSensorflag=false, lightSensorflag=false, SomeotherSensorflag=false;
mbotkinl 0:a2a4d0d432b3 31
mbotkinl 0:a2a4d0d432b3 32 //GPRS setup
mbotkinl 0:a2a4d0d432b3 33 GPRSInterface gprs(PIN_TX,PIN_RX,115200,"internetd.gdsp",NULL,NULL);
mbotkinl 0:a2a4d0d432b3 34 HTTPClient http;
mbotkinl 0:a2a4d0d432b3 35 char* thingSpeakUrl = "http://api.thingspeak.com/update";
mbotkinl 0:a2a4d0d432b3 36 char urlBuffer[256];
mbotkinl 0:a2a4d0d432b3 37 char str[1024];
mbotkinl 0:a2a4d0d432b3 38
mbotkinl 0:a2a4d0d432b3 39 //Sensors
mbotkinl 0:a2a4d0d432b3 40 DHT sensor(P1_14,SEN51035P);
mbotkinl 0:a2a4d0d432b3 41 AnalogIn lightSensor(P0_12);
mbotkinl 0:a2a4d0d432b3 42
mbotkinl 0:a2a4d0d432b3 43
mbotkinl 0:a2a4d0d432b3 44 int tempData,humData, lightData;
mbotkinl 0:a2a4d0d432b3 45
mbotkinl 0:a2a4d0d432b3 46
mbotkinl 0:a2a4d0d432b3 47 void connectGPRS(void) {
mbotkinl 0:a2a4d0d432b3 48 iot_hw.init(); // power on SIM900
mbotkinl 0:a2a4d0d432b3 49
mbotkinl 0:a2a4d0d432b3 50 int count = 0;
mbotkinl 0:a2a4d0d432b3 51 while(false == gprs.connect() && count < 5) {
mbotkinl 0:a2a4d0d432b3 52 wait(2);
mbotkinl 0:a2a4d0d432b3 53 count += 1;
mbotkinl 0:a2a4d0d432b3 54 }
mbotkinl 0:a2a4d0d432b3 55 }
mbotkinl 0:a2a4d0d432b3 56
mbotkinl 0:a2a4d0d432b3 57 void getTempHumid(int* tempData,int* humData){
mbotkinl 0:a2a4d0d432b3 58 int err = 1;
mbotkinl 0:a2a4d0d432b3 59 int count = 0;
mbotkinl 0:a2a4d0d432b3 60 iot_hw.grovePwrOn();
mbotkinl 0:a2a4d0d432b3 61 wait(1); // wait 1 second for device stable status
mbotkinl 0:a2a4d0d432b3 62 while (err != 0 && count < 4) {
mbotkinl 0:a2a4d0d432b3 63 err = sensor.readData();
mbotkinl 0:a2a4d0d432b3 64 count += 1;
mbotkinl 0:a2a4d0d432b3 65 *tempData = sensor.ReadTemperature(FARENHEIT);
mbotkinl 0:a2a4d0d432b3 66 *humData = sensor.ReadHumidity();
mbotkinl 0:a2a4d0d432b3 67
mbotkinl 0:a2a4d0d432b3 68 wait(1);
mbotkinl 0:a2a4d0d432b3 69 }
mbotkinl 0:a2a4d0d432b3 70 iot_hw.grovePwrOff();
mbotkinl 0:a2a4d0d432b3 71 }
mbotkinl 0:a2a4d0d432b3 72
mbotkinl 0:a2a4d0d432b3 73 void getLightReading(int* lightData)
mbotkinl 0:a2a4d0d432b3 74 {
mbotkinl 0:a2a4d0d432b3 75 *lightData = lightSensor*1000;
mbotkinl 0:a2a4d0d432b3 76 }
mbotkinl 0:a2a4d0d432b3 77
mbotkinl 0:a2a4d0d432b3 78
mbotkinl 0:a2a4d0d432b3 79 int ReadFile (void) {
mbotkinl 0:a2a4d0d432b3 80 mkdir("/sd", 0777); // All other times open file in append mode
mbotkinl 0:a2a4d0d432b3 81 FILE *fp = fopen("/sd/config.txt","r");
mbotkinl 0:a2a4d0d432b3 82 if (fp==NULL) {
mbotkinl 0:a2a4d0d432b3 83 fclose(fp);
mbotkinl 0:a2a4d0d432b3 84 return 0;
mbotkinl 0:a2a4d0d432b3 85
mbotkinl 0:a2a4d0d432b3 86 } else if (fp) {
mbotkinl 0:a2a4d0d432b3 87 fscanf(fp,"%16c %d %s %s", APIKey, &numSensors, sensors[0],sensors[1]);
mbotkinl 0:a2a4d0d432b3 88 // fscanf(fp,"%16c",APIKey);
mbotkinl 0:a2a4d0d432b3 89 // pc.printf("APIKEY= %s\r\n",APIKey);
mbotkinl 0:a2a4d0d432b3 90 //
mbotkinl 0:a2a4d0d432b3 91 // fscanf(fp,"%d",&numSensors);
mbotkinl 0:a2a4d0d432b3 92 // pc.printf("number of sensors = %d \r\n",numSensors);
mbotkinl 0:a2a4d0d432b3 93 //
mbotkinl 0:a2a4d0d432b3 94 // for (int i = 0; i<numSensors;i=i+1) {
mbotkinl 0:a2a4d0d432b3 95 // //fscanf(fp,"%s",sensors[i]);
mbotkinl 0:a2a4d0d432b3 96 // fscanf(fp,"%s",sensorBuff);
mbotkinl 0:a2a4d0d432b3 97 // strcpy(sensors[i],sensorBuff);
mbotkinl 0:a2a4d0d432b3 98 // pc.printf("sensor %d = %s\r\n",i,sensors[i]);
mbotkinl 0:a2a4d0d432b3 99 // }
mbotkinl 0:a2a4d0d432b3 100
mbotkinl 0:a2a4d0d432b3 101
mbotkinl 0:a2a4d0d432b3 102 fclose(fp);
mbotkinl 0:a2a4d0d432b3 103 return 1;
mbotkinl 0:a2a4d0d432b3 104
mbotkinl 0:a2a4d0d432b3 105 } else {
mbotkinl 0:a2a4d0d432b3 106 fclose(fp);
mbotkinl 0:a2a4d0d432b3 107 return 0;
mbotkinl 0:a2a4d0d432b3 108 }
mbotkinl 0:a2a4d0d432b3 109
mbotkinl 0:a2a4d0d432b3 110 }
mbotkinl 0:a2a4d0d432b3 111
mbotkinl 0:a2a4d0d432b3 112 bool stringComparison (const char *string1, const char *string2) {
mbotkinl 0:a2a4d0d432b3 113 int count = 0;
mbotkinl 0:a2a4d0d432b3 114 while (string1[count] != 0) {
mbotkinl 0:a2a4d0d432b3 115 if (string1[count] != string2[count])
mbotkinl 0:a2a4d0d432b3 116 return false;
mbotkinl 0:a2a4d0d432b3 117 count++;
mbotkinl 0:a2a4d0d432b3 118 }
mbotkinl 0:a2a4d0d432b3 119 return true;
mbotkinl 0:a2a4d0d432b3 120 }
mbotkinl 0:a2a4d0d432b3 121
mbotkinl 0:a2a4d0d432b3 122
mbotkinl 0:a2a4d0d432b3 123 void sendData1(int sensor1Data, int field1) {
mbotkinl 0:a2a4d0d432b3 124 connectGPRS();
mbotkinl 0:a2a4d0d432b3 125 urlBuffer[0] = 0;
mbotkinl 0:a2a4d0d432b3 126 sprintf(urlBuffer, "%s?key=%s&field%d=%d", thingSpeakUrl, APIKey, field1, sensor1Data);
mbotkinl 0:a2a4d0d432b3 127 HTTPResult res = http.get(urlBuffer, str,128);
mbotkinl 0:a2a4d0d432b3 128 if (res != HTTP_OK) {
mbotkinl 0:a2a4d0d432b3 129 redLED.blink(5);
mbotkinl 0:a2a4d0d432b3 130 } else {
mbotkinl 0:a2a4d0d432b3 131 greenLED.blink(5);
mbotkinl 0:a2a4d0d432b3 132 }
mbotkinl 0:a2a4d0d432b3 133 iot_hw.init_io(); //power down SIM900
mbotkinl 0:a2a4d0d432b3 134 }
mbotkinl 0:a2a4d0d432b3 135
mbotkinl 0:a2a4d0d432b3 136 void sendData2(int sensor1Data, int field1, int sensor2Data, int field2) {
mbotkinl 0:a2a4d0d432b3 137 connectGPRS();
mbotkinl 0:a2a4d0d432b3 138 urlBuffer[0] = 0;
mbotkinl 0:a2a4d0d432b3 139 sprintf(urlBuffer, "%s?key=%s&field%d=%d&field%d=%d", thingSpeakUrl, APIKey, field1, sensor1Data, field2, sensor2Data);
mbotkinl 0:a2a4d0d432b3 140 HTTPResult res = http.get(urlBuffer, str,128);
mbotkinl 0:a2a4d0d432b3 141 if (res != HTTP_OK) {
mbotkinl 0:a2a4d0d432b3 142 redLED.blink(5);
mbotkinl 0:a2a4d0d432b3 143 } else {
mbotkinl 0:a2a4d0d432b3 144 greenLED.blink(5);
mbotkinl 0:a2a4d0d432b3 145 }
mbotkinl 0:a2a4d0d432b3 146 iot_hw.init_io(); //power down SIM900
mbotkinl 0:a2a4d0d432b3 147 }
mbotkinl 0:a2a4d0d432b3 148
mbotkinl 0:a2a4d0d432b3 149 void sendData3(int sensor1Data, int field1, int sensor2Data, int field2, int sensor3Data, int field3) {
mbotkinl 0:a2a4d0d432b3 150 connectGPRS();
mbotkinl 0:a2a4d0d432b3 151 urlBuffer[0] = 0;
mbotkinl 0:a2a4d0d432b3 152 sprintf(urlBuffer, "%s?key=%s&field%d=%d&field%d=%d&field%d=%d", thingSpeakUrl, APIKey, field1, sensor1Data, field2, sensor2Data, field3, sensor3Data);
mbotkinl 0:a2a4d0d432b3 153 HTTPResult res = http.get(urlBuffer, str,128);
mbotkinl 0:a2a4d0d432b3 154 if (res != HTTP_OK) {
mbotkinl 0:a2a4d0d432b3 155 redLED.blink(5);
mbotkinl 0:a2a4d0d432b3 156 } else {
mbotkinl 0:a2a4d0d432b3 157 greenLED.blink(5);
mbotkinl 0:a2a4d0d432b3 158 }
mbotkinl 0:a2a4d0d432b3 159 iot_hw.init_io(); //power down SIM900
mbotkinl 0:a2a4d0d432b3 160 }
mbotkinl 0:a2a4d0d432b3 161
mbotkinl 0:a2a4d0d432b3 162 void sdWrite1(int sensor1Data)
mbotkinl 0:a2a4d0d432b3 163 {
mbotkinl 0:a2a4d0d432b3 164
mbotkinl 0:a2a4d0d432b3 165 mkdir("/sd", 0777);
mbotkinl 0:a2a4d0d432b3 166 FILE *fp = fopen("/sd/node1.csv","a");
mbotkinl 0:a2a4d0d432b3 167 if (fp == NULL) {
mbotkinl 0:a2a4d0d432b3 168 //no sd card
mbotkinl 0:a2a4d0d432b3 169 redLED.blink(10);
mbotkinl 0:a2a4d0d432b3 170 } else {
mbotkinl 0:a2a4d0d432b3 171
mbotkinl 0:a2a4d0d432b3 172 fprintf(fp,"timestamp, %d \r\n",sensor1Data);
mbotkinl 0:a2a4d0d432b3 173 fclose(fp);
mbotkinl 0:a2a4d0d432b3 174 blueLED.blink(5);
mbotkinl 0:a2a4d0d432b3 175 }
mbotkinl 0:a2a4d0d432b3 176 }
mbotkinl 0:a2a4d0d432b3 177
mbotkinl 0:a2a4d0d432b3 178 void sdWrite2(int sensor1Data, int sensor2Data)
mbotkinl 0:a2a4d0d432b3 179 {
mbotkinl 0:a2a4d0d432b3 180 mkdir("/sd", 0777);
mbotkinl 0:a2a4d0d432b3 181 FILE *fp = fopen("/sd/node1.csv","a");
mbotkinl 0:a2a4d0d432b3 182 if (fp == NULL) {
mbotkinl 0:a2a4d0d432b3 183 //no sd card
mbotkinl 0:a2a4d0d432b3 184 redLED.blink(10);
mbotkinl 0:a2a4d0d432b3 185 } else {
mbotkinl 0:a2a4d0d432b3 186
mbotkinl 0:a2a4d0d432b3 187 fprintf(fp,"timestamp, %d, %d\r\n",sensor1Data, sensor2Data);
mbotkinl 0:a2a4d0d432b3 188 fclose(fp);
mbotkinl 0:a2a4d0d432b3 189 blueLED.blink(5);
mbotkinl 0:a2a4d0d432b3 190 }
mbotkinl 0:a2a4d0d432b3 191 }
mbotkinl 0:a2a4d0d432b3 192
mbotkinl 0:a2a4d0d432b3 193 void sdWrite3(int sensor1Data, int sensor2Data,int sensor3Data)
mbotkinl 0:a2a4d0d432b3 194 {
mbotkinl 0:a2a4d0d432b3 195 mkdir("/sd", 0777);
mbotkinl 0:a2a4d0d432b3 196 FILE *fp = fopen("/sd/node1.csv","a");
mbotkinl 0:a2a4d0d432b3 197 if (fp == NULL) {
mbotkinl 0:a2a4d0d432b3 198 //no sd card
mbotkinl 0:a2a4d0d432b3 199 redLED.blink(10);
mbotkinl 0:a2a4d0d432b3 200 } else {
mbotkinl 0:a2a4d0d432b3 201
mbotkinl 0:a2a4d0d432b3 202 fprintf(fp,"timestamp, %d, %d, %d\r\n",sensor1Data, sensor2Data, sensor3Data);
mbotkinl 0:a2a4d0d432b3 203 fclose(fp);
mbotkinl 0:a2a4d0d432b3 204 blueLED.blink(5);
mbotkinl 0:a2a4d0d432b3 205 }
mbotkinl 0:a2a4d0d432b3 206 }
mbotkinl 0:a2a4d0d432b3 207
mbotkinl 0:a2a4d0d432b3 208
mbotkinl 0:a2a4d0d432b3 209
mbotkinl 0:a2a4d0d432b3 210
mbotkinl 0:a2a4d0d432b3 211 int main() {
mbotkinl 0:a2a4d0d432b3 212 wdt_sleep.wdtClkSetup(WDTCLK_SRC_IRC_OSC); //set up sleep
mbotkinl 0:a2a4d0d432b3 213
mbotkinl 0:a2a4d0d432b3 214 //read SD card
mbotkinl 0:a2a4d0d432b3 215 while (ReadFile()==0) {
mbotkinl 0:a2a4d0d432b3 216 wait(5);
mbotkinl 0:a2a4d0d432b3 217 redLED.blink(5);
mbotkinl 0:a2a4d0d432b3 218 }
mbotkinl 0:a2a4d0d432b3 219 greenLED.blink(10);
mbotkinl 0:a2a4d0d432b3 220
mbotkinl 0:a2a4d0d432b3 221 //identify sensors and find order of fields
mbotkinl 0:a2a4d0d432b3 222 int field=1;
mbotkinl 0:a2a4d0d432b3 223 for (int i=0;i<numSensors;i=i+1) {
mbotkinl 0:a2a4d0d432b3 224 if (stringComparison(sensors[i],"temp")==true) {
mbotkinl 0:a2a4d0d432b3 225 tempSensorflag=true;
mbotkinl 0:a2a4d0d432b3 226 tempField=field;
mbotkinl 0:a2a4d0d432b3 227 humField=field+1;
mbotkinl 0:a2a4d0d432b3 228 field=field+1;
mbotkinl 0:a2a4d0d432b3 229 } else if (stringComparison(sensors[i],"light")==true) {
mbotkinl 0:a2a4d0d432b3 230 lightSensorflag=true;
mbotkinl 0:a2a4d0d432b3 231 lightField=field;
mbotkinl 0:a2a4d0d432b3 232 } else if (stringComparison(sensors[i],"some other sensor")==true) {
mbotkinl 0:a2a4d0d432b3 233 SomeotherSensorflag=true;
mbotkinl 0:a2a4d0d432b3 234 }
mbotkinl 0:a2a4d0d432b3 235 field=field+1;
mbotkinl 0:a2a4d0d432b3 236 }
mbotkinl 0:a2a4d0d432b3 237
mbotkinl 0:a2a4d0d432b3 238 while(1)
mbotkinl 0:a2a4d0d432b3 239 {
mbotkinl 0:a2a4d0d432b3 240
mbotkinl 0:a2a4d0d432b3 241 if (numSensors == 3) {
mbotkinl 0:a2a4d0d432b3 242
mbotkinl 0:a2a4d0d432b3 243 } else if (numSensors ==2) {
mbotkinl 0:a2a4d0d432b3 244 if (tempSensorflag==true) {
mbotkinl 0:a2a4d0d432b3 245 if (lightSensorflag==true) {
mbotkinl 0:a2a4d0d432b3 246 getLightReading(&lightData);
mbotkinl 0:a2a4d0d432b3 247 getTempHumid(&tempData,&humData);
mbotkinl 0:a2a4d0d432b3 248 sendData3(tempData,tempField,humData,humField,lightData,lightField);
mbotkinl 0:a2a4d0d432b3 249 sdWrite3(tempData,humData,lightData);
mbotkinl 0:a2a4d0d432b3 250 } else if (SomeotherSensorflag==true) {
mbotkinl 0:a2a4d0d432b3 251
mbotkinl 0:a2a4d0d432b3 252 }
mbotkinl 0:a2a4d0d432b3 253 } else if (lightSensorflag==true) {
mbotkinl 0:a2a4d0d432b3 254 if (SomeotherSensorflag==true) {
mbotkinl 0:a2a4d0d432b3 255 getLightReading(&lightData);
mbotkinl 0:a2a4d0d432b3 256
mbotkinl 0:a2a4d0d432b3 257
mbotkinl 0:a2a4d0d432b3 258 }
mbotkinl 0:a2a4d0d432b3 259 }
mbotkinl 0:a2a4d0d432b3 260 } else {
mbotkinl 0:a2a4d0d432b3 261 if (tempSensorflag==true) {
mbotkinl 0:a2a4d0d432b3 262 getTempHumid(&tempData,&humData);
mbotkinl 0:a2a4d0d432b3 263 sendData2(tempData,tempField,humData,humField);
mbotkinl 0:a2a4d0d432b3 264 sdWrite2(tempData,humData);
mbotkinl 0:a2a4d0d432b3 265 } else if (lightSensorflag==true) {
mbotkinl 0:a2a4d0d432b3 266 getLightReading(&lightData);
mbotkinl 0:a2a4d0d432b3 267 sendData1(lightData,lightField);
mbotkinl 0:a2a4d0d432b3 268 sdWrite1(lightData);
mbotkinl 0:a2a4d0d432b3 269 } else if (SomeotherSensorflag==true) {
mbotkinl 0:a2a4d0d432b3 270
mbotkinl 0:a2a4d0d432b3 271 }
mbotkinl 0:a2a4d0d432b3 272 }
mbotkinl 0:a2a4d0d432b3 273 wdt_sleep.sleep(BROADCAST_TIME);
mbotkinl 0:a2a4d0d432b3 274
mbotkinl 0:a2a4d0d432b3 275 }
mbotkinl 0:a2a4d0d432b3 276 }