basic lightning detector with gps and sd card logging
Dependencies: AS3935 AdafruitGPS SDFileSystem TSI mbed ConfigFile
main.cpp
- Committer:
- ftagius
- Date:
- 2015-06-24
- Revision:
- 3:e3974328d808
- Parent:
- 2:3edb129c60b2
- Child:
- 4:4d26ba1ae0f7
File content as of revision 3:e3974328d808:
#include "mbed.h" #include "GPS.h" #include "main.h" #include "TSISensor.h" #include "SDFileSystem.h" #include "AS3935.h" // frdm-kl25z as3935 connections for spi1 // ------------------------------------------------ // Header -- kl25z -- SD/MMC // J2-20 -- PTE1 -- MOSI // J9-13 -- PTE4 -- CS // J2-14 -- GND -- Vss (GND) // J9-9 -- PTE2 -- SCK // J9-11 -- PTE3 -- MISO AS3935 ld(PTE1, PTE3, PTE2, PTE4, "ld", 1000000); // MOSI, MISO, SCK, CS, SPI bus freq (hz) InterruptIn IntLightning(PTA12); //IRQ AS3935 // frdm-kl25z sd card connections spi0 // ------------------------------------------------ // Header -- kl25z -- SPI // J2-8 -- PTD2 -- MOSI // J2-6 -- PTD0 -- CS // J9-12 -- GND -- Vss (GND) // J9-4 -- P3V3 -- Vdd (+3.3v) // J2-12 -- PTD1 -- SCK // J9-14 -- GND -- Vss (GND) // J2-10 -- PTD3 -- MISO SDFileSystem sd(PTD2, PTD3, PTD1, PTD0, "sd"); // MOSI, MISO, SCK, CS Serial pc(USBTX, USBRX); GPS gpsd(PTE20, PTE21); DigitalOut red(LED_RED); DigitalOut green(LED_GREEN); //DigitalOut blue(LED_BLUE); don't use the blue led, due to a board error, writing to the blue led kills spi bool debug=false; int day, month,year,hour,minute,seconds; void writeLogFile(int interruptSource, int distance, long energy); char logName[]="lightning_data.csv"; int rdistance, rinterrupt; char directory[]="/sd/lightning_data"; int OriginInt=-1; int distance=-1; long energy=-1; void DetectLightning() { OriginInt = ld.interruptSource(); distance = ld.lightningDistanceKm(); energy = ld.getEnergy(); } void writeLogFile(int interruptSource, int distance, long energy) { char logFilePath[128]; static bool header=false; FILE *fp; sprintf(logFilePath, "%s/%s", directory,logName); sd.mount(); fp = fopen(logFilePath, "a"); if(fp == NULL) { // retry wait_ms(200); fp = fopen(logFilePath, "a"); if (fp == NULL) { printf("Could not open file %s for writing\r\n",logFilePath); sd.unmount(); printf("unmount sd card \r\n"); return; } } if (debug) pc.printf("Opened log file %s\r\n",logFilePath); // write the log file header if (header == false) { fprintf(fp,"# date,time,raw timestamp,latitude,longitude,distance,interrupt,energy\r\n"); header = true; } // write to the current log file fprintf(fp,"%02d/%02d/20%02d,", gpsd.month, gpsd.day, gpsd.year); fprintf(fp,"%02d:%02d:%02d,", gpsd.hour, gpsd.minute, gpsd.seconds); fprintf(fp,"%7.0f,",gpsd.timef); fprintf(fp,"%5.7f,%5.7f,", gpsd.lat_deg, gpsd.lon_deg); fprintf(fp,"%d,",distance); fprintf(fp,"%d,",interruptSource); fprintf(fp,"%ld",energy); fprintf(fp,"\r\n"); fflush(fp); f_sync((FIL*)fp); fclose(fp); sd.unmount(); pc.printf("Event: "); switch (interruptSource) { case 1: pc.printf("Noise level too high\r\n"); break; case 4: pc.printf("Disturber\r\n"); break; case 8: pc.printf("Lightning detection, distance=%dkm energy=%ld\r\n", distance, energy); ld.clearStats(); break; default: pc.printf("Unknown interrupt %d\r\n", OriginInt); } if (debug) pc.printf("Closed log file %s\r\n",logFilePath); } int main() { char c; Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info? const int refresh_Time = 1000; //refresh time in ms TSISensor tsi; // touch slider unsigned long measFreq; rdistance=-1; rinterrupt=-1; pc.baud(9600); // initializations for gps green = 1; gpsd.setBaud(9600); gpsd.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); gpsd.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); gpsd.sendCommand(PGCMD_ANTENNA); gpsd.day=01; gpsd.month=01; gpsd.year=15; gpsd.hour=1; gpsd.minute=1; gpsd.seconds=1; red = 1; green = 1; pc.printf("Touch slider to start lightning detector application\r\n"); while(1) { green = 1; // turn led off wait_ms(200); if (tsi.readPercentage()) break; green = 0; // turn led on wait_ms(200); if (tsi.readPercentage()) break; } pc.printf("\r\nInitialize lightning detector\r\n"); //initializations for lightning detector ld.init(); ld.clearStats(); ld.calibrateRCOs(IntLightning); measFreq = ld.tuneAntenna(IntLightning); //ld.powerUp(); //ld.setIndoors(); ld.setOutdoors(); ld.setMinimumLightnings(0); ld.setSpikeRejection(2); ld.setNoiseFloor(2); //ld.disableDisturbers(); ld.enableDisturbers(); ld.setWatchdogThreshold(4); IntLightning.rise(&DetectLightning); int MinBlysk = ld.getMinimumLightnings(); int Noise = ld.getNoiseFloor(); // ld.setTuneCap(5); // 500kHz int TuneCap = ld.getTuneCap(); int SpikeRej = ld.getSpikeRejection(); int WatchDog = ld.getWatchdogThreshold(); pc.printf("\r\n Min wylad: %i", MinBlysk); pc.printf("\r\n"); pc.printf(" Gain: 0x%02x\r\n",ld.getGain()); pc.printf(" Noise: %i", Noise); pc.printf("\r\n"); pc.printf(" Tune CAP: %i", TuneCap); pc.printf("\r\n"); pc.printf(" Spike rej: %i", SpikeRej); pc.printf("\r\n"); pc.printf(" Watchdog: %i", WatchDog); pc.printf("\r\n"); pc.printf(" LCO calibration: %ld Hz\n\r", measFreq); refresh_Timer.start(); //starts the clock on the timer //Mount the filesystem sd.mount(); mkdir(directory, 0777); sd.unmount(); bool gpsFix=false; while (1) { if (OriginInt != -1) { // the ld detector generated an interrupt, log the event IntLightning.disable_irq(); writeLogFile(OriginInt,distance, energy); ld.clearStats(); OriginInt = -1; distance = -1; energy = -1; IntLightning.enable_irq(); } c = gpsd.read(); //queries the GPS if (debug) { if (c) { printf("%c", c); //this line will echo the GPS data if not paused continue; } } //check if we recieved a new message from GPS, if so, attempt to parse it, if ( gpsd.newNMEAreceived() ) { if ( !gpsd.parse(gpsd.lastNMEA()) ) { continue; } } // update globals with the lastest gps time stamp day=gpsd.day; month=gpsd.month; year=gpsd.year; hour=gpsd.hour; minute=gpsd.minute; seconds=gpsd.seconds; //check if enough time has passed to warrant printing GPS info to screen //note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing if (refresh_Timer.read_ms() >= refresh_Time) { if (gpsd.fix) { // got a gps fix if (gpsFix == false) { // first time fix obtained gpsFix = true; 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); //pc.printf("Touch slider to suspend application\r\n"); pc.printf("Waiting for lighting detection...\r\n"); } //red = 1; // turn led off //pc.printf("turn green on\r\n"); green = 0; // turn led on wait_ms(50); } else { gpsFix = false; pc.printf("Waiting for GPS FIX\r\n"); red = 0; // turn led on } // restart the timer for the gps print loop // writeLogFile(-2); refresh_Timer.reset(); } else { //red = 0; // turn led on //pc.printf("turn green off\r\n"); green = 1; // turn green led off #if 0 // check the slider. if touched, disable lighting interrupts and wait for another slider touch if (tsi.readPercentage()) { //IntLightning.disable_irq(); pc.printf("Touch slider to continue application\r\n"); while (1) { green = 1; // turn led off wait_ms(200); // break of of the loop if the slider is touched if (tsi.readPercentage()) { green = 1; red = 1; pc.printf("Now monitoring for lightning strikes\r\n"); //IntLightning.enable_irq(); break; } green = 0; // turn led on wait_ms(200); // break of of the loop if the slider is touched if (tsi.readPercentage()) { green = 1; red = 1; pc.printf("Now monitoring for lightning strikes\r\n"); //IntLightning.enable_irq(); break; } } // end while 1 for slider } // end if tsi read #endif } // end else refresh timer } }