basic lightning detector with gps and sd card logging

Dependencies:   AS3935 AdafruitGPS SDFileSystem TSI mbed ConfigFile

Committer:
cmkachur
Date:
Tue Jun 23 21:01:40 2015 +0000
Revision:
2:3edb129c60b2
Parent:
1:10d2a051285e
Child:
3:e3974328d808
Add method for reading energy of lightning strike. Add energy data to the log file. Remove call to powerUp() since this was only setting outdoor mode which was done elsewhere.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ftagius 0:3328df4c3116 1 #include "mbed.h"
ftagius 0:3328df4c3116 2 #include "GPS.h"
ftagius 0:3328df4c3116 3 #include "main.h"
ftagius 0:3328df4c3116 4 #include "TSISensor.h"
ftagius 0:3328df4c3116 5 #include "SDFileSystem.h"
ftagius 0:3328df4c3116 6 #include "AS3935.h"
ftagius 0:3328df4c3116 7
ftagius 0:3328df4c3116 8 // frdm-kl25z sd card connections for spi1
ftagius 0:3328df4c3116 9 // ------------------------------------------------
ftagius 0:3328df4c3116 10 // Header -- kl25z -- SD/MMC
ftagius 0:3328df4c3116 11 // J2-20 -- PTE1 -- MOSI
ftagius 0:3328df4c3116 12 // J9-13 -- PTE4 -- CS
ftagius 0:3328df4c3116 13 // J2-14 -- GND -- Vss (GND)
ftagius 0:3328df4c3116 14 // J9-9 -- PTE2 -- SCK
ftagius 0:3328df4c3116 15 // J9-11 -- PTE3 -- MISO
ftagius 0:3328df4c3116 16
ftagius 0:3328df4c3116 17 AS3935 ld(PTE1, PTE3, PTE2, PTE4, "ld", 1000000); // MOSI, MISO, SCK, CS, SPI bus freq (hz)
ftagius 0:3328df4c3116 18 InterruptIn IntLightning(PTA12); //IRQ AS3935
ftagius 0:3328df4c3116 19
ftagius 0:3328df4c3116 20
ftagius 0:3328df4c3116 21 // frdm-kl25z sd card connections spi0
ftagius 0:3328df4c3116 22 // ------------------------------------------------
ftagius 0:3328df4c3116 23 // Header -- kl25z -- SPI
ftagius 0:3328df4c3116 24 // J2-8 -- PTD2 -- MOSI
ftagius 0:3328df4c3116 25 // J2-6 -- PTD0 -- CS
ftagius 0:3328df4c3116 26 // J9-12 -- GND -- Vss (GND)
ftagius 0:3328df4c3116 27 // J9-4 -- P3V3 -- Vdd (+3.3v)
ftagius 0:3328df4c3116 28 // J2-12 -- PTD1 -- SCK
ftagius 0:3328df4c3116 29 // J9-14 -- GND -- Vss (GND)
ftagius 0:3328df4c3116 30 // J2-10 -- PTD3 -- MISO
ftagius 0:3328df4c3116 31
ftagius 0:3328df4c3116 32 SDFileSystem sd(PTD2, PTD3, PTD1, PTD0, "sd"); // MOSI, MISO, SCK, CS
ftagius 0:3328df4c3116 33
ftagius 0:3328df4c3116 34 Serial pc(USBTX, USBRX);
ftagius 0:3328df4c3116 35 GPS gpsd(PTE20, PTE21);
ftagius 0:3328df4c3116 36 DigitalOut red(LED_RED);
ftagius 0:3328df4c3116 37 DigitalOut green(LED_GREEN);
ftagius 0:3328df4c3116 38 //DigitalOut blue(LED_BLUE); don't use the blue led, due to a board error, writing to the blue led kills spi
ftagius 0:3328df4c3116 39 bool debug;
ftagius 0:3328df4c3116 40 int day, month,year,hour,minute,seconds;
cmkachur 2:3edb129c60b2 41 void writeLogFile(int interruptSource, int distance, long energy);
ftagius 1:10d2a051285e 42 char logName[]="lightning_data.csv";
ftagius 1:10d2a051285e 43 int rdistance, rinterrupt;
ftagius 1:10d2a051285e 44 char directory[]="/sd/lightning_data";
ftagius 0:3328df4c3116 45
ftagius 0:3328df4c3116 46 void DetectLightning()
ftagius 0:3328df4c3116 47 {
ftagius 0:3328df4c3116 48 int OriginInt;
ftagius 1:10d2a051285e 49 int distance=-1;
cmkachur 2:3edb129c60b2 50 long energy =-1;
ftagius 0:3328df4c3116 51 wait_ms(2); //
ftagius 0:3328df4c3116 52 OriginInt = ld.interruptSource();
ftagius 0:3328df4c3116 53 pc.printf("%02d/%02d/20%02d_%02d:%02d:%02d ",month,day,year,hour,minute,seconds);
ftagius 0:3328df4c3116 54 switch (OriginInt)
ftagius 0:3328df4c3116 55 {
ftagius 0:3328df4c3116 56 case 1:
ftagius 1:10d2a051285e 57 pc.printf("Noise level too high\r\n");
ftagius 1:10d2a051285e 58 break;
ftagius 0:3328df4c3116 59 case 4:
ftagius 1:10d2a051285e 60 pc.printf("Disturber\r\n");
ftagius 1:10d2a051285e 61 break;
ftagius 0:3328df4c3116 62 case 8:
ftagius 1:10d2a051285e 63 distance = ld.lightningDistanceKm();
cmkachur 2:3edb129c60b2 64 energy = ld.getEnergy();
cmkachur 2:3edb129c60b2 65 pc.printf("Lightning detection, distance=%dkm energy=%ld\r\n", distance, energy);
cmkachur 2:3edb129c60b2 66
ftagius 0:3328df4c3116 67 ld.clearStats();
ftagius 1:10d2a051285e 68 break;
ftagius 0:3328df4c3116 69 default:
ftagius 1:10d2a051285e 70 pc.printf("Unknown interrupt %d\r\n", OriginInt);
ftagius 0:3328df4c3116 71
ftagius 0:3328df4c3116 72 }
cmkachur 2:3edb129c60b2 73 writeLogFile(OriginInt,distance, energy);
ftagius 1:10d2a051285e 74 pc.printf("Resume wait for lightning detection...\r\n");
ftagius 0:3328df4c3116 75
ftagius 0:3328df4c3116 76 }
ftagius 0:3328df4c3116 77
cmkachur 2:3edb129c60b2 78 void writeLogFile(int interruptSource, int distance, long energy)
ftagius 0:3328df4c3116 79 {
ftagius 1:10d2a051285e 80 char logFilePath[128];
ftagius 0:3328df4c3116 81 static bool header=false;
ftagius 0:3328df4c3116 82 FILE *fp;
ftagius 1:10d2a051285e 83
ftagius 1:10d2a051285e 84 sprintf(logFilePath, "%s/%s", directory,logName);
ftagius 0:3328df4c3116 85 sd.mount();
ftagius 1:10d2a051285e 86 fp = fopen(logFilePath, "a");
ftagius 0:3328df4c3116 87 if(fp == NULL) {
ftagius 0:3328df4c3116 88 // retry
ftagius 0:3328df4c3116 89 wait_ms(500);
ftagius 1:10d2a051285e 90 fp = fopen(logFilePath, "a");
ftagius 0:3328df4c3116 91 if (fp == NULL)
ftagius 0:3328df4c3116 92 {
ftagius 1:10d2a051285e 93 printf("Could not open file %s for writing\r\n",logFilePath);
ftagius 0:3328df4c3116 94 sd.unmount();
ftagius 1:10d2a051285e 95 printf("unmount sd card \r\n");
ftagius 0:3328df4c3116 96 return;
ftagius 0:3328df4c3116 97 }
ftagius 0:3328df4c3116 98 }
ftagius 1:10d2a051285e 99 pc.printf("Opened log file %s\r\n",logFilePath);
ftagius 0:3328df4c3116 100 // write the log file header
ftagius 0:3328df4c3116 101 if (header == false)
ftagius 0:3328df4c3116 102 {
cmkachur 2:3edb129c60b2 103 fprintf(fp,"# date,time,raw timestamp,latitude,longitude,distance,interrupt,energy\r\n");
ftagius 0:3328df4c3116 104 header = true;
ftagius 0:3328df4c3116 105 }
ftagius 0:3328df4c3116 106 // write to the current log file
ftagius 0:3328df4c3116 107 fprintf(fp,"%02d/%02d/20%02d,", gpsd.month, gpsd.day, gpsd.year);
ftagius 0:3328df4c3116 108 fprintf(fp,"%02d:%02d:%02d,", gpsd.hour, gpsd.minute, gpsd.seconds);
ftagius 0:3328df4c3116 109 fprintf(fp,"%7.0f,",gpsd.timef);
ftagius 0:3328df4c3116 110 fprintf(fp,"%5.7f,%5.7f,", gpsd.lat_deg, gpsd.lon_deg);
ftagius 1:10d2a051285e 111 fprintf(fp,"%d,",distance);
cmkachur 2:3edb129c60b2 112 fprintf(fp,"%d,",interruptSource);
cmkachur 2:3edb129c60b2 113 fprintf(fp,"%ld",energy);
ftagius 0:3328df4c3116 114 fprintf(fp,"\r\n");
ftagius 0:3328df4c3116 115 fflush(fp);
ftagius 0:3328df4c3116 116 f_sync((FIL*)fp);
ftagius 0:3328df4c3116 117 fclose(fp);
ftagius 0:3328df4c3116 118 sd.unmount();
ftagius 1:10d2a051285e 119 pc.printf("Closed log file %s\r\n",logFilePath);
ftagius 0:3328df4c3116 120 }
ftagius 0:3328df4c3116 121
ftagius 0:3328df4c3116 122 int main()
ftagius 0:3328df4c3116 123 {
ftagius 0:3328df4c3116 124 bool debug=false;
ftagius 0:3328df4c3116 125 char c;
ftagius 0:3328df4c3116 126 Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info?
ftagius 0:3328df4c3116 127 const int refresh_Time = 1000; //refresh time in ms
ftagius 0:3328df4c3116 128 TSISensor tsi; // touch slider
ftagius 0:3328df4c3116 129 unsigned long measFreq;
ftagius 1:10d2a051285e 130 rdistance=-1;
ftagius 1:10d2a051285e 131 rinterrupt=-1;
ftagius 0:3328df4c3116 132 pc.baud(9600);
ftagius 0:3328df4c3116 133 // initializations for gps
ftagius 0:3328df4c3116 134 green = 1;
ftagius 0:3328df4c3116 135 gpsd.setBaud(9600);
ftagius 0:3328df4c3116 136 gpsd.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
ftagius 0:3328df4c3116 137 gpsd.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
ftagius 0:3328df4c3116 138 gpsd.sendCommand(PGCMD_ANTENNA);
ftagius 0:3328df4c3116 139 gpsd.day=01;
ftagius 0:3328df4c3116 140 gpsd.month=01;
ftagius 0:3328df4c3116 141 gpsd.year=15;
ftagius 0:3328df4c3116 142 gpsd.hour=1;
ftagius 0:3328df4c3116 143 gpsd.minute=1;
ftagius 0:3328df4c3116 144 gpsd.seconds=1;
ftagius 0:3328df4c3116 145 red = 1;
ftagius 0:3328df4c3116 146 green = 1;
ftagius 0:3328df4c3116 147 pc.printf("Touch slider to start application\r\n");
ftagius 0:3328df4c3116 148 while(1) {
ftagius 0:3328df4c3116 149 green = 1; // turn led off
ftagius 0:3328df4c3116 150 wait_ms(200);
ftagius 0:3328df4c3116 151 if (tsi.readPercentage())
ftagius 0:3328df4c3116 152 break;
ftagius 0:3328df4c3116 153 green = 0; // turn led on
ftagius 0:3328df4c3116 154 wait_ms(200);
ftagius 0:3328df4c3116 155 if (tsi.readPercentage())
ftagius 0:3328df4c3116 156 break;
ftagius 0:3328df4c3116 157 }
ftagius 0:3328df4c3116 158
ftagius 0:3328df4c3116 159 pc.printf("\r\nstart lightning detector\r\n");
ftagius 0:3328df4c3116 160 //initializations for lightning detector
ftagius 0:3328df4c3116 161 ld.init();
ftagius 0:3328df4c3116 162 ld.clearStats();
ftagius 1:10d2a051285e 163
cmkachur 2:3edb129c60b2 164 ld.calibrateRCOs(IntLightning);
ftagius 0:3328df4c3116 165 measFreq = ld.tuneAntenna(IntLightning);
ftagius 1:10d2a051285e 166
cmkachur 2:3edb129c60b2 167 //ld.powerUp();
cmkachur 2:3edb129c60b2 168
ftagius 1:10d2a051285e 169 //ld.setIndoors();
ftagius 1:10d2a051285e 170 ld.setOutdoors();
ftagius 0:3328df4c3116 171 ld.setMinimumLightnings(0);
ftagius 0:3328df4c3116 172 ld.setSpikeRejection(2);
ftagius 0:3328df4c3116 173 ld.setNoiseFloor(2);
ftagius 0:3328df4c3116 174 //ld.disableDisturbers();
ftagius 0:3328df4c3116 175 ld.enableDisturbers();
ftagius 0:3328df4c3116 176 ld.setWatchdogThreshold(4);
ftagius 0:3328df4c3116 177 IntLightning.rise(&DetectLightning);
ftagius 0:3328df4c3116 178 int MinBlysk = ld.getMinimumLightnings();
ftagius 0:3328df4c3116 179 int Noise = ld.getNoiseFloor();
ftagius 1:10d2a051285e 180 // ld.setTuneCap(5); // 500kHz
ftagius 0:3328df4c3116 181 int TuneCap = ld.getTuneCap();
ftagius 0:3328df4c3116 182 int SpikeRej = ld.getSpikeRejection();
ftagius 0:3328df4c3116 183 int WatchDog = ld.getWatchdogThreshold();
ftagius 0:3328df4c3116 184
ftagius 0:3328df4c3116 185 pc.printf(" Min wylad: %i", MinBlysk);
ftagius 0:3328df4c3116 186 pc.printf("\r\n");
ftagius 0:3328df4c3116 187 pc.printf(" Gain: 0x%02x\r\n",ld.getGain());
ftagius 0:3328df4c3116 188 pc.printf(" Noise: %i", Noise);
ftagius 0:3328df4c3116 189 pc.printf("\r\n");
ftagius 0:3328df4c3116 190 pc.printf(" Tune CAP: %i", TuneCap);
ftagius 0:3328df4c3116 191 pc.printf("\r\n");
ftagius 0:3328df4c3116 192 pc.printf(" Spike rej: %i", SpikeRej);
ftagius 0:3328df4c3116 193 pc.printf("\r\n");
ftagius 0:3328df4c3116 194 pc.printf(" Watchdog: %i", WatchDog);
ftagius 0:3328df4c3116 195 pc.printf("\r\n");
ftagius 0:3328df4c3116 196 pc.printf(" LCO calibration: %ld Hz\n\r", measFreq);
ftagius 0:3328df4c3116 197
ftagius 0:3328df4c3116 198
ftagius 0:3328df4c3116 199 refresh_Timer.start(); //starts the clock on the timer
ftagius 0:3328df4c3116 200 //Mount the filesystem
ftagius 0:3328df4c3116 201 sd.mount();
ftagius 0:3328df4c3116 202 mkdir(directory, 0777);
ftagius 1:10d2a051285e 203 sd.unmount();
ftagius 1:10d2a051285e 204
ftagius 0:3328df4c3116 205 bool gpsFix=false;
ftagius 0:3328df4c3116 206 pc.printf("Starting GPS App\r\n");
ftagius 0:3328df4c3116 207 while (1)
ftagius 0:3328df4c3116 208 {
ftagius 0:3328df4c3116 209 c = gpsd.read(); //queries the GPS
ftagius 0:3328df4c3116 210 if (debug)
ftagius 0:3328df4c3116 211 {
ftagius 0:3328df4c3116 212 if (c) {
ftagius 0:3328df4c3116 213 printf("%c", c); //this line will echo the GPS data if not paused
ftagius 0:3328df4c3116 214 continue;
ftagius 0:3328df4c3116 215 }
ftagius 0:3328df4c3116 216 }
ftagius 0:3328df4c3116 217
ftagius 0:3328df4c3116 218 //check if we recieved a new message from GPS, if so, attempt to parse it,
ftagius 0:3328df4c3116 219 if ( gpsd.newNMEAreceived() ) {
ftagius 0:3328df4c3116 220 if ( !gpsd.parse(gpsd.lastNMEA()) ) {
ftagius 0:3328df4c3116 221 continue;
ftagius 0:3328df4c3116 222 }
ftagius 0:3328df4c3116 223 }
ftagius 0:3328df4c3116 224
ftagius 0:3328df4c3116 225 // update globals with the lastest gps time stamp
ftagius 0:3328df4c3116 226 day=gpsd.day;
ftagius 0:3328df4c3116 227 month=gpsd.month;
ftagius 0:3328df4c3116 228 year=gpsd.year;
ftagius 0:3328df4c3116 229 hour=gpsd.hour;
ftagius 0:3328df4c3116 230 minute=gpsd.minute;
ftagius 0:3328df4c3116 231 seconds=gpsd.seconds;
ftagius 0:3328df4c3116 232
ftagius 0:3328df4c3116 233 //check if enough time has passed to warrant printing GPS info to screen
ftagius 0:3328df4c3116 234 //note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing
ftagius 0:3328df4c3116 235 if (refresh_Timer.read_ms() >= refresh_Time)
ftagius 0:3328df4c3116 236 {
ftagius 0:3328df4c3116 237 if (gpsd.fix) {
ftagius 0:3328df4c3116 238 // got a gps fix
ftagius 0:3328df4c3116 239 if (gpsFix == false)
ftagius 0:3328df4c3116 240 {
ftagius 0:3328df4c3116 241 // first time fix obtained
ftagius 0:3328df4c3116 242 gpsFix = true;
ftagius 0:3328df4c3116 243 pc.printf("GPS fix obtained on %02d/%02d/20%02d_%02d:%02d:%02d (UTC)\r\n",gpsd.month,gpsd.day,gpsd.year,gpsd.hour,gpsd.minute,gpsd.seconds);
ftagius 1:10d2a051285e 244 //pc.printf("Touch slider to suspend application\r\n");
ftagius 0:3328df4c3116 245 pc.printf("Waiting for lighting detection...\r\n");
ftagius 0:3328df4c3116 246 }
ftagius 0:3328df4c3116 247
ftagius 0:3328df4c3116 248 //red = 1; // turn led off
ftagius 0:3328df4c3116 249 //pc.printf("turn green on\r\n");
ftagius 0:3328df4c3116 250 green = 0; // turn led on
ftagius 0:3328df4c3116 251 wait_ms(50);
ftagius 0:3328df4c3116 252 }
ftagius 0:3328df4c3116 253 else
ftagius 0:3328df4c3116 254 {
ftagius 0:3328df4c3116 255 pc.printf("Waiting for GPS FIX\r\n");
ftagius 0:3328df4c3116 256 red = 0; // turn led on
ftagius 0:3328df4c3116 257 }
ftagius 0:3328df4c3116 258
ftagius 0:3328df4c3116 259 // restart the timer for the gps print loop
ftagius 0:3328df4c3116 260 // writeLogFile(-2);
ftagius 0:3328df4c3116 261 refresh_Timer.reset();
ftagius 0:3328df4c3116 262 }
ftagius 0:3328df4c3116 263 else
ftagius 0:3328df4c3116 264 {
ftagius 0:3328df4c3116 265 //red = 0; // turn led on
ftagius 0:3328df4c3116 266 //pc.printf("turn green off\r\n");
ftagius 0:3328df4c3116 267 green = 1; // turn green led off
ftagius 1:10d2a051285e 268 #if 0
ftagius 0:3328df4c3116 269 // check the slider. if touched, disable lighting interrupts and wait for another slider touch
ftagius 0:3328df4c3116 270 if (tsi.readPercentage())
ftagius 0:3328df4c3116 271 {
ftagius 1:10d2a051285e 272 //IntLightning.disable_irq();
ftagius 0:3328df4c3116 273 pc.printf("Touch slider to continue application\r\n");
ftagius 0:3328df4c3116 274 while (1)
ftagius 0:3328df4c3116 275 {
ftagius 0:3328df4c3116 276
ftagius 0:3328df4c3116 277 green = 1; // turn led off
ftagius 0:3328df4c3116 278 wait_ms(200);
ftagius 0:3328df4c3116 279 // break of of the loop if the slider is touched
ftagius 0:3328df4c3116 280 if (tsi.readPercentage())
ftagius 0:3328df4c3116 281 {
ftagius 0:3328df4c3116 282 green = 1;
ftagius 0:3328df4c3116 283 red = 1;
ftagius 0:3328df4c3116 284 pc.printf("Now monitoring for lightning strikes\r\n");
ftagius 1:10d2a051285e 285 //IntLightning.enable_irq();
ftagius 0:3328df4c3116 286 break;
ftagius 0:3328df4c3116 287 }
ftagius 0:3328df4c3116 288 green = 0; // turn led on
ftagius 0:3328df4c3116 289 wait_ms(200);
ftagius 0:3328df4c3116 290 // break of of the loop if the slider is touched
ftagius 0:3328df4c3116 291 if (tsi.readPercentage())
ftagius 0:3328df4c3116 292 {
ftagius 0:3328df4c3116 293 green = 1;
ftagius 0:3328df4c3116 294 red = 1;
ftagius 0:3328df4c3116 295 pc.printf("Now monitoring for lightning strikes\r\n");
ftagius 1:10d2a051285e 296 //IntLightning.enable_irq();
ftagius 0:3328df4c3116 297 break;
ftagius 0:3328df4c3116 298 }
ftagius 0:3328df4c3116 299
ftagius 0:3328df4c3116 300 } // end while 1 for slider
ftagius 0:3328df4c3116 301 } // end if tsi read
ftagius 1:10d2a051285e 302 #endif
ftagius 0:3328df4c3116 303 } // end else refresh timer
ftagius 0:3328df4c3116 304
ftagius 0:3328df4c3116 305 }
ftagius 0:3328df4c3116 306
ftagius 0:3328df4c3116 307
ftagius 0:3328df4c3116 308
ftagius 0:3328df4c3116 309 }