AS3935 Lightning sensor library
Fork of AS3935 by
include the mbed library with this snippet
#include "mbed.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", 100000); // MOSI, MISO, SCK, CS, SPI bus freq (hz) InterruptIn IntLightning(PTA12); //IRQ AS3935 DigitalOut led1(LED_RED); Serial pc(USBTX, USBRX); void DetectLightning() { char OriginInt; wait_ms(2); OriginInt = ld.interruptSource(); if (OriginInt == 1) { // pc.printf(" Noise level too high\r\n"); } if (OriginInt == 4) { // pc.printf(" Disturber\r\n"); } if (OriginInt == 8) { // detection // pc.printf(" Lightning detection\r\n"); pc.printf(" Lightning detection, distance=%dkm\r\n", ld.lightningDistanceKm()); ld.clearStats(); } } int main() { pc.baud(9600); pc.printf("\r\nstart lightning detector\r\n"); //initialisations ld.reset(); ld.setTuneCap(5); // 500kHz ld.powerUp(); ld.setIndoors(); ld.setMinimumLightnings(1); //ld.setSpikeRejection(2); ld.setNoiseFloor(2); ld.disableDisturbers(); //ld.enableDisturbers(); ld.setWatchdogThreshold(2); wait_ms(10); IntLightning.rise(&DetectLightning); int MinBlysk = ld.getMinimumLightnings(); int Noise = ld.getNoiseFloor(); int TuneCap = ld.getTuneCap(); int SpikeRej = ld.getSpikeRejection(); int WatchDog = ld.getWatchdogThreshold(); pc.printf(" Min wylad: %i", MinBlysk); pc.printf("\r\n"); 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"); while(1) { led1 = ! led1; wait(0.2); } }
Diff: AS3935.cpp
- Revision:
- 5:28311803e23d
- Parent:
- 4:ab1f1b65468b
- Child:
- 6:c9b9e7d3bced
- Child:
- 7:0d2586164d5b
diff -r ab1f1b65468b -r 28311803e23d AS3935.cpp --- a/AS3935.cpp Mon Jun 15 14:27:34 2015 +0000 +++ b/AS3935.cpp Mon Jun 15 20:38:15 2015 +0000 @@ -71,7 +71,7 @@ m_Cs = 0; m_Spi.write(reg); m_Spi.write(regval); - //printf("raw transfer for reg %x is 0x%02x\r\n", high, regval); + //printf("raw transfer for reg %x is 0x%02x\r\n", reg, regval); m_Cs = 1; wait_ms(2); } @@ -117,8 +117,9 @@ void AS3935::powerUp() { - + #if 0 registerWrite(AS3935_PWD,0); + //printf("wrote power up \r\n"); m_Cs = 0; m_Spi.write(0x3D); m_Spi.write(0x96); @@ -127,6 +128,117 @@ registerWrite(AS3935_DISP_TRCO,1); wait_ms(2); registerWrite(AS3935_DISP_TRCO,0); +#else + m_Cs = 0; + m_Spi.write(0x00); + m_Spi.write(0x1c); + m_Cs = 1; + wait_ms(2); + #endif +} + +// replication of the acurite init sequence +void AS3935::acurite() +{ + m_Cs = 0; + m_Spi.write(0x00); + m_Spi.write(0x1d); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x3c); + m_Spi.write(0x96); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x01); + m_Spi.write(0x24); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x03); + m_Spi.write(0x41); + m_Cs = 1; + wait_ms(2); + + int i; + for (i=0;i<8; i++) + { + m_Cs = 0; + m_Spi.write(0x08); + m_Spi.write(0x80+i); + m_Cs = 1; + wait_ms(2); + } + + m_Cs = 0; + m_Spi.write(0x08); + m_Spi.write(0x08); + m_Cs = 1; + wait_ms(2); + m_Cs = 0; + m_Spi.write(0x00); + m_Spi.write(0x1c); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x3d); + m_Spi.write(0x96); + m_Cs = 1; + wait_ms(2); + m_Cs = 0; + m_Spi.write(0x08); + m_Spi.write(0x48); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x08); + m_Spi.write(0x8); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x08); + m_Spi.write(0x28); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x08); + m_Spi.write(0x48); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x08); + m_Spi.write(0x8); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x02); + m_Spi.write(0x82); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x01); + m_Spi.write(0x24); + m_Cs = 1; + wait_ms(2); + + m_Cs = 0; + m_Spi.write(0x02); + m_Spi.write(0xc2); + m_Cs = 1; + wait_ms(2); + + } int AS3935::interruptSource() @@ -234,6 +346,19 @@ registerWrite(AS3935_DISP_SRCO, 0x40); // ERRATA: after power down mode wait_ms(2); // wait 1ms registerWrite(AS3935_DISP_SRCO, 0x00); // ERRATA: after power down mode + wait_ms(1); + // cal sequence from acurite follows + registerWrite(AS3935_DISP_SRCO, 0x48); + wait_ms(1); + registerWrite(AS3935_DISP_LCO, 0x8); + wait_ms(1); + registerWrite(AS3935_DISP_TRCO, 0x28); + wait_ms(1); + registerWrite(AS3935_DISP_SRCO, 0x48); + wait_ms(1); + registerWrite(AS3935_DISP_LCO, 0x8); + wait_ms(1); + trco=registerRead(0x3A, 0x80); // Read out Calibration of TRCO done srco=registerRead(0x3B, 0x80); // Readout Calibration of SRCO done if(trco != 0x00 && srco != 0x00)