basic lightning detector with gps and sd card logging

Dependencies:   AS3935 AdafruitGPS SDFileSystem TSI mbed ConfigFile

main.cpp

Committer:
ftagius
Date:
2015-06-22
Revision:
1:10d2a051285e
Parent:
0:3328df4c3116
Child:
2:3edb129c60b2

File content as of revision 1:10d2a051285e:

#include "mbed.h"
#include "GPS.h"
#include "main.h"
#include "TSISensor.h"
#include "SDFileSystem.h"
#include "AS3935.h"

 // frdm-kl25z sd card 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;
int day, month,year,hour,minute,seconds; 
void writeLogFile(int interruptSource, int distance);
char logName[]="lightning_data.csv";
int rdistance, rinterrupt;
char directory[]="/sd/lightning_data";

void DetectLightning()
{
    int OriginInt;
    int distance=-1;
    wait_ms(2); // 
    OriginInt = ld.interruptSource();
    pc.printf("%02d/%02d/20%02d_%02d:%02d:%02d ",month,day,year,hour,minute,seconds);
    switch (OriginInt)
    {
        case 1:
            pc.printf("Noise level too high\r\n");
            break;
        case 4:
            pc.printf("Disturber\r\n");
            break;     
        case 8:
            distance = ld.lightningDistanceKm();
            pc.printf("Lightning detection, distance=%dkm\r\n", distance);
            ld.clearStats();
            break;
        default:
            pc.printf("Unknown interrupt %d\r\n", OriginInt);

    }
    writeLogFile(OriginInt,distance);
    pc.printf("Resume wait for lightning detection...\r\n");
 
}
 
 void writeLogFile(int interruptSource, int distance)
{
    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(500);
        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;
        }
    }
    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\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,"\r\n");
    fflush(fp);
    f_sync((FIL*)fp); 
    fclose(fp);
    sd.unmount();
    pc.printf("Closed log file %s\r\n",logFilePath);
}     

int main()
{
    bool debug=false;
    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 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\nstart lightning detector\r\n");
    //initializations for lightning detector
    ld.init();
    ld.clearStats();

    measFreq = ld.tuneAntenna(IntLightning);
    
    ld.powerUp();
    ld.calibrateRCOs(IntLightning);
    //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(" 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;
    pc.printf("Starting GPS App\r\n");
    while (1)
    {
        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
            {
                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            
   
    }

            
  
}