K22F Power Conditioner

Dependencies:   NetworkServices W5500Interface

main.cpp

Committer:
amccartney
Date:
2017-02-13
Revision:
0:9d0945119ba4
Child:
1:f857c10c3cd2

File content as of revision 0:9d0945119ba4:

#include "mbed.h"
#include "Oled_C.h"
#include "AS3935.h"

Serial pc(USBTX, USBRX);
InterruptIn AS3935(PTB16); // AS3935 INT pin
DigitalIn sw2(SW2);
DigitalIn sw3(SW3);
//InterruptIn AS3935(PTC1); //SW2

char inOutSetting = 0;
char detectFlag = 0;

void check_sw3(void)
{
    if (sw3 == 0) {
        wait(1);
        if (inOutSetting == 0) {
            AS3935setOutdoors();
            AS3935checkInOut();
            inOutSetting = 1;
        } else if (inOutSetting == 1) {
            AS3935setIndoors();
            AS3935checkInOut();
            inOutSetting = 0;
        }
    }
}

void AS3935IntSrv(void)     //Interrupt handler for the AS3935
{
    AS3935.disable_irq();
    detectFlag = 1;
}

int main()
{
    char returnVal;
    char outStringTemp[256];
    char intVal = 0;
    char display = 0;
    char distance;
    long int energy;
    float LCOfreq;
    int i = 1;

    InitMCU();
    pc.baud(115200);
    pc.printf("\n\nFRDM-K22F board AS3935 Test.\n");

    OLED_C_Init();
    Black_Background();
    OLED_C_Image(lightning,0,0,94,94);
    wait(1);
    White_Background();
    OLED_C_Image(logo,0,80,95,14);
    strConstRamCpy(CRam1,"Powervar");
    Draw_Text(CRam1,1,77,0x0418,1);
    Draw_line(0, 65, 95, 65, 0x8410);

    AS3935spiInit();
    LCOfreq = AS3935MeasureLCOFreq();
    pc.printf("LCO freq: %.0f Hz\n",LCOfreq);
    if (LCOfreq > 500000) {
        while (LCOfreq > 500000) {
            returnVal = AS3935setTuneCap(i);
            LCOfreq = AS3935MeasureLCOFreq();
            pc.printf("Capacitor Value: %dpF\n",i*8);
            pc.printf("LCO freq: %.0f Hz\n\n",LCOfreq);
            i++;
        }
        } else {
            while (LCOfreq < 500000) {
                returnVal = AS3935setTuneCap(i);
                LCOfreq = AS3935MeasureLCOFreq();
                pc.printf("Capacitor Value: %dpF\n",i*8);
                pc.printf("LCO freq: %.0f Hz\n\n",LCOfreq);
                i++;
            }
        }
    wait(1);
    AS3935powerUp();
    AS3935enableDisturbers();
    AS3935setIndoors();
    //AS3935setOutdoors();    
    returnVal = AS3935setNoiseFloor(2);
    returnVal = AS3935setSpikeRejection(2);
    returnVal = AS3935setWatchdogThreshold(4);
    returnVal = AS3935getMinimumLightnings();
    AS3935checkInOut();
    pc.printf("Minimum Lightnings: %x\n",returnVal);
    returnVal = AS3935getNoiseFloor();
    pc.printf("Noise Floor: %x\n",returnVal);
    returnVal = AS3935getSpikeRejection();
    pc.printf("Spike Rejection: %x\n",returnVal);
    returnVal = AS3935getWatchdogThreshold();
    pc.printf("Watchdog Threshold: %x\n",returnVal);
    AS3935IntSrv(); //make sure the the int bit is cleared
    returnVal = AS3935getTuneCap();
    pc.printf("Capacitor Value: %dpF\n",returnVal*8);
    
    wait(1);
//    DDRAM_access();
    
    
    //wait(1);
    //AS3935registerWrite(AS3935_LCO_FDIV,0);
    //AS3935registerWrite(AS3935_DISP_LCO,1);
    //pc.printf("\nLCO on INT pin\n");
    //wait(5);
    //while (sw3 == 1) {
    //           
    //    }
    //AS3935registerWrite(AS3935_DISP_LCO,0);
    AS3935.rise(&AS3935IntSrv);
    AS3935.enable_irq();
    pc.printf("\nNormal Operation Started\n");
    while (true) {
        intVal = AS3935.read();
        if (detectFlag == 1) {
            detectFlag = 0;
            wait(0.005);
            source = AS3935interruptSource();
            source = source & 0x0F;
            pc.printf("Source: 0x%02X\n",source);
            if (source == 0x08) {
                display = 3;
                distance = AS3935lightningDistanceKm();
                energy = Thunder_Read_Energy();
                pc.printf("Lightning Detected!!!\n");
                pc.printf("Distance: %d\n",distance);
                pc.printf("Energy: %lu\n",energy);
                OLED_C_Image(strike,0,25,19,19);
                strConstRamCpy(CRam1,"Lightning");
                Draw_Text(CRam1,20,45,0x0000,1);
                snprintf( outStringTemp, 256, "@ %d km      ", distance);
                strConstRamCpy(CRam1,outStringTemp);
                Draw_Text(CRam1,20,35,0x0000,1);
                snprintf( outStringTemp, 256, "Energy %lu", energy);
                strConstRamCpy(CRam1,outStringTemp);
                Draw_Text(CRam1,10,25,0x0000,1);
            } else if (source == 0x01) {
                pc.printf("Noise Detected\n");
                strConstRamCpy(CRam1,"Noise Det.");
                Draw_Text(CRam1,21,10,0x0000,1);
            } else if (source == 0x00) {
                distance = AS3935lightningDistanceKm();
                pc.printf("Distance updated: %d\n",distance);
            } else if (source == 0x04) {
                pc.printf("Disturber Detected\n");
            }
            AS3935.enable_irq();
        }
        check_sw3();
        strConstRamCpy(CRam1,"*");
        Draw_Text(CRam1,1,10,0x0000,1);
        wait(0.5);
//        intVal = AS3935.read();
//        if (intVal == 1) {
//            source = AS3935interruptSource(); //Likely we missed an interrupt
//            pc.printf("Missed Interrupt\n");
//            AS3935.enable_irq();
//        }
        check_sw3();
        strConstRamCpy(CRam1," ");
        Draw_Text(CRam1,1,10,0x0000,1);
        wait(0.5);
        if (display == 0){
            OLED_C_Image(listening,0,25,19,19);
            strConstRamCpy(CRam1,"            ");
            Draw_Text(CRam1,20,45,0x0000,1);
            snprintf( outStringTemp, 256, "Listening...");
            strConstRamCpy(CRam1,outStringTemp);
            Draw_Text(CRam1,20,35,0x0000,1);
            snprintf( outStringTemp, 256, "             ");
            strConstRamCpy(CRam1,outStringTemp);
            Draw_Text(CRam1,10,25,0x0000,1);
        } else { --display;}
        strConstRamCpy(CRam1,"               ");
        Draw_Text(CRam1,21,10,0x0000,1); 
        //AS3935registerWrite(AS3935_DISP_LCO,1);       
    }

}