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);
     }
    
 
 }
Revision:
0:346c723cac97
Child:
1:f2d9ed33c276
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AS3935.cpp	Sat Apr 05 23:24:41 2014 +0000
@@ -0,0 +1,208 @@
+/*
+AS3935.cpp - AS3935 Franklin Lightning Sensor™ IC by AMS library
+Copyright (c) 2012 Raivis Rengelis (raivis [at] rrkb.lv). All rights reserved.
+Porté sur MBED par Valentin, version I2C
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 3 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "AS3935.hpp"
+
+AS3935::AS3935(PinName sda, PinName scl, int adresse): i2c(sda, scl), _adress(adresse) {        
+        
+        wait_ms(11);
+    }
+
+    //~AS3935(){
+        
+    //}
+        
+char AS3935::_rawRegisterRead(char reg)
+{
+    char data;
+    i2c.write( _adress, &reg, 1, true);
+    i2c.read(_adress, &data, 1);
+    return data;
+    
+}
+
+char AS3935::_ffsz(char mask)
+{
+    char i = 0;
+    //char temp;
+    
+    while(!(mask & 1)) {
+       //if (!(mask & 1)) {
+          mask >>= 1;
+          i++;
+       //}
+    }
+    //if (mask){
+      //  for (i = 1; ~mask & 1 ; i++) {
+        //    mask >>= 1;
+          //  }
+       // }
+    return i;
+}
+
+void AS3935::registerWrite(char reg, char mask, char data)
+{
+    char cmd[2];
+    char regval;
+    regval = _rawRegisterRead(reg);
+    regval &= ~(mask);
+    //if (mask){
+        regval |= (data << (_ffsz(mask)));
+      //  }
+    //else {
+      //  regval |= data;
+       // }
+    cmd[0] = reg;
+    cmd[1] = regval;
+    i2c.write( _adress, cmd, 2);
+
+}
+
+char AS3935::registerRead(char reg, char mask)
+    {
+    char regval;
+    regval = _rawRegisterRead(reg);
+    regval = regval & mask;
+    //if (mask){
+        regval >>= (_ffsz(mask));
+      //  }
+    return regval;
+}
+
+void AS3935::reset()
+    {
+    char cmd[2];
+    cmd[0] = 0x3C;
+    cmd[1] = 0x96;
+    i2c.write( _adress, cmd, 2);
+    wait_ms(2);
+    }
+
+
+
+void AS3935::powerDown()
+    {
+    registerWrite(AS3935_PWD,1);
+    }
+
+void AS3935::powerUp()
+    {
+    char cmd[2];
+    cmd[0] = 0x3D;
+    cmd[1] = 0x96;
+    registerWrite(AS3935_PWD,0);
+    i2c.write( _adress, cmd, 2);
+    wait_ms(3);
+    registerWrite(AS3935_DISP_TRCO,1);
+    wait_ms(2);
+    registerWrite(AS3935_DISP_TRCO,0);
+    }
+
+int AS3935::interruptSource()
+    {
+    return registerRead(AS3935_INT);
+    }
+
+void AS3935::disableDisturbers()
+    {
+    registerWrite(AS3935_MASK_DIST,1);
+    }
+
+void AS3935::enableDisturbers()
+    {
+    registerWrite(AS3935_MASK_DIST,0);
+    }
+
+int AS3935::getMinimumLightnings()
+    {
+    return registerRead(AS3935_MIN_NUM_LIGH);
+    }
+
+int AS3935::setMinimumLightnings(int minlightning)
+    {
+    registerWrite(AS3935_MIN_NUM_LIGH,minlightning);
+    return getMinimumLightnings();
+    }
+
+int AS3935::lightningDistanceKm()
+    {
+    return registerRead(AS3935_DISTANCE);
+    }
+
+void AS3935::setIndoors()
+    {
+    registerWrite(AS3935_AFE_GB,AS3935_AFE_INDOOR);
+    }
+
+void AS3935::setOutdoors()
+    {
+    registerWrite(AS3935_AFE_GB,AS3935_AFE_OUTDOOR);
+    }
+
+int AS3935::getNoiseFloor()
+    {
+    return registerRead(AS3935_NF_LEV);
+    }
+
+int AS3935::setNoiseFloor(int noisefloor)
+    {
+    registerWrite(AS3935_NF_LEV,noisefloor);
+    return getNoiseFloor();
+    }
+
+int AS3935::getSpikeRejection()
+    {
+    return registerRead(AS3935_SREJ);
+    }
+
+int AS3935::setSpikeRejection(int srej)
+    {
+    registerWrite(AS3935_SREJ, srej);
+    return getSpikeRejection();
+    }
+
+int AS3935::getWatchdogThreshold()
+    {
+    return registerRead(AS3935_WDTH);
+    }
+
+int AS3935::setWatchdogThreshold(int wdth)
+    {
+    registerWrite(AS3935_WDTH,wdth);
+    return getWatchdogThreshold();
+    }
+
+int AS3935::getTuneCap()
+    {
+    return registerRead(AS3935_TUN_CAP);    
+    }
+        
+int AS3935::setTuneCap(int cap)
+    {
+    registerWrite(AS3935_TUN_CAP,cap);
+    return getTuneCap();    
+    }
+
+void AS3935::clearStats()
+    {
+    registerWrite(AS3935_CL_STAT,1);
+    registerWrite(AS3935_CL_STAT,0);
+    registerWrite(AS3935_CL_STAT,1);
+    }
\ No newline at end of file