AS3935 Lightning sensor library

Dependents:   zeus

Fork of AS3935 by valentin spanu

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);
     }
    
 
 }

Files at this revision

API Documentation at this revision

Comitter:
cmkachur
Date:
Thu Jun 18 15:47:39 2015 +0000
Parent:
8:60e1b6b39e1c
Child:
10:bf33e2946bab
Commit message:
Update calibrate RCO method. Measure the TRC oscillator.

Changed in this revision

AS3935.cpp Show annotated file Show diff for this revision Revisions of this file
AS3935.h Show annotated file Show diff for this revision Revisions of this file
--- a/AS3935.cpp	Wed Jun 17 15:04:28 2015 +0000
+++ b/AS3935.cpp	Thu Jun 18 15:47:39 2015 +0000
@@ -88,7 +88,7 @@
     regval >>= (_ffsz(mask));
     return regval;
 }
-
+#if 0 
 void AS3935::reset()
  {
     m_Cs = 0;
@@ -97,7 +97,7 @@
     m_Cs = 1;
     wait_ms(2);
 } 
-
+#endif 
 void AS3935::presetDefault()
  {
     m_Cs = 0;
@@ -341,35 +341,40 @@
     registerWrite(AS3935_CL_STAT,0);
     registerWrite(AS3935_CL_STAT,1);
 }
+    
+static void intrPulseCntr(void)    {sgIntrPulseCount++;} 
 
-int AS3935::calibrateRCOs (void)
+int AS3935::calibrateRCOs (InterruptIn &intrIn)
 {
     int rc;
     uint8_t trco;
     uint8_t srco;
-    m_Cs = 0;
-    m_Spi.write(0x3D);        // Direct Command Calibrate RCO
-    m_Spi.write(0x96);
-    m_Cs = 1;
-    wait_ms(1);                          // wait 1ms
-    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); 
+    Timer pulseTimer;
+    int timeNow; 
+    unsigned long measFreq; 
+    
+    intrIn.rise(intrPulseCntr); 
+    
+    _SPITransfer2(0x3D, 0x96);                        // send command to calibrate the internal RC oscillators           
+    _SPITransfer2(8, 0x20);                           // put TRCO on the IRQ line for measurement   
+    wait_ms(20);                                      // wait for the chip to output the frequency, ususally ~2 ms 
     
-    trco=registerRead(0x3A, 0x80);        // Read out Calibration of TRCO done
-    srco=registerRead(0x3B, 0x80);        // Readout Calibration of SRCO done
+    pulseTimer.reset(); 
+    pulseTimer.start(); 
+    sgIntrPulseCount = 0;                             // reset the interrupt counter which serves as our frequency\pulse counter     
+    
+    timeNow = 0; 
+    while (timeNow < 500)                             // wait for 0.5 seconds
+    {
+      timeNow = pulseTimer.read_ms(); 
+    }
+    _SPITransfer2(8, 0);                              // stop the output of the frequncy on IRQ line       
+    measFreq = sgIntrPulseCount << 1;                 // calculate the measure frequency based upon period of capture and freq scaler
+
+    printf("timer RCO: %ld Hz\n\r", measFreq);
+    
+    trco=registerRead(0x3A, 0x80);                      // Read out Calibration of TRCO done
+    srco=registerRead(0x3B, 0x80);                      // Readout Calibration of SRCO done
     if(trco != 0x00 && srco != 0x00)
     {
         rc = 1;
@@ -385,11 +390,6 @@
 }
 
 
-void intrPulseCntr(void)
-{
-    sgIntrPulseCount++; 
-} 
-
 unsigned long AS3935::tuneAntenna(InterruptIn &intrIn)
 {
 #define ANTENA_RES_FREQ     (unsigned long)500000
@@ -403,10 +403,10 @@
 unsigned long error; 
     
     intrIn.rise(intrPulseCntr); 
+    _SPITransfer2(3, 0x80);                             // set frequency division to 64  
     
     for (tunCapCnt = 0; tunCapCnt < 16; ++tunCapCnt)    // loop for all possible values of the tuning capacitor
     {
-      _SPITransfer2(3, 0x80);
       _SPITransfer2(8, 0x80+tunCapCnt);                 // set the tuning cap and have the frequency output to the IRQ line 
       wait_ms(20);                                      // wait for the chip to output the frequency, ususally ~2 ms 
 
--- a/AS3935.h	Wed Jun 17 15:04:28 2015 +0000
+++ b/AS3935.h	Thu Jun 18 15:47:39 2015 +0000
@@ -151,10 +151,10 @@
     //clear internal accumulated lightning statistics
     void clearStats();
 
-    int calibrateRCOs (void);
+    int calibrateRCOs (InterruptIn &intrIn);
 
     unsigned long tuneAntenna(InterruptIn &intrIn); 
-        
+    
     /** Attach a function, lightning interrupt
      * @param fptr pointer to a void function, or 0 to set as none
      */
@@ -169,7 +169,8 @@
     void attach(T *tptr, void (T::*mptr)(void)) { 
         _func.attach(tptr, mptr); 
     }
-              
+    
+         
     private:
     //I2C i2c;   
     //DigitalOut _irq;
@@ -184,6 +185,10 @@
     char _rawRegisterRead(char reg);
     char _SPITransfer2(char high, char low);
     char _ffsz(char mask);
+    
+
+
+
 };
 
 /* !_AS3935_H_ */