Version one of final code

Dependencies:   ARCH_GPRS_V2_HW Blinker GPRSInterface HTTPClient_GPRS SDFileSystem USBDevice mbed RTC_WorkingLibrary

Fork of finalV1 by Micah B

Committer:
mbotkinl
Date:
Wed Apr 22 16:46:48 2015 +0000
Revision:
2:5e5c2a000d25
Parent:
1:6746983fa040
added timestamp from RTC;

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