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);
     }
    
 
 }
Committer:
ftagius
Date:
Thu Jun 11 15:53:51 2015 +0000
Revision:
2:3b3b435ca8d9
Parent:
1:f2d9ed33c276
Child:
3:c536a9aa2a1c
code cleanup

Who changed what in which revision?

UserRevisionLine numberNew contents of line
casper 0:346c723cac97 1 /*
casper 0:346c723cac97 2 AS3935.cpp - AS3935 Franklin Lightning Sensor™ IC by AMS library
casper 0:346c723cac97 3 Copyright (c) 2012 Raivis Rengelis (raivis [at] rrkb.lv). All rights reserved.
casper 0:346c723cac97 4 Porté sur MBED par Valentin, version I2C
casper 0:346c723cac97 5
casper 0:346c723cac97 6 This library is free software; you can redistribute it and/or
casper 0:346c723cac97 7 modify it under the terms of the GNU Lesser General Public
casper 0:346c723cac97 8 License as published by the Free Software Foundation; either
casper 0:346c723cac97 9 version 3 of the License, or (at your option) any later version.
casper 0:346c723cac97 10
casper 0:346c723cac97 11 This library is distributed in the hope that it will be useful,
casper 0:346c723cac97 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
casper 0:346c723cac97 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
casper 0:346c723cac97 14 Lesser General Public License for more details.
casper 0:346c723cac97 15
casper 0:346c723cac97 16 You should have received a copy of the GNU Lesser General Public
casper 0:346c723cac97 17 License along with this library; if not, write to the Free Software
casper 0:346c723cac97 18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
casper 0:346c723cac97 19 */
casper 0:346c723cac97 20
ftagius 1:f2d9ed33c276 21 #include "AS3935.h"
ftagius 1:f2d9ed33c276 22 #include "pinmap.h"
casper 0:346c723cac97 23
ftagius 1:f2d9ed33c276 24 AS3935::AS3935(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name, PinName cd, int hz) : m_Spi(mosi, miso, sclk), m_Cs(cs, 1), m_Cd(cd), m_FREQ(hz)
ftagius 1:f2d9ed33c276 25 {
ftagius 1:f2d9ed33c276 26
ftagius 1:f2d9ed33c276 27 //Enable the internal pull-up resistor on MISO
ftagius 1:f2d9ed33c276 28 pin_mode(miso, PullUp);
ftagius 1:f2d9ed33c276 29
ftagius 1:f2d9ed33c276 30 //Configure the SPI bus
ftagius 1:f2d9ed33c276 31 m_Spi.format(8, 1);
ftagius 1:f2d9ed33c276 32 }
ftagius 1:f2d9ed33c276 33
ftagius 1:f2d9ed33c276 34 char AS3935::_SPITransfer2(char high, char low)
ftagius 1:f2d9ed33c276 35 {
ftagius 1:f2d9ed33c276 36 m_Cs = 0;
ftagius 1:f2d9ed33c276 37 m_Spi.write(high);
ftagius 1:f2d9ed33c276 38 char regval = m_Spi.write(low);
ftagius 1:f2d9ed33c276 39 m_Cs = 1;
ftagius 1:f2d9ed33c276 40 return regval;
ftagius 1:f2d9ed33c276 41 }
ftagius 1:f2d9ed33c276 42
casper 0:346c723cac97 43 char AS3935::_rawRegisterRead(char reg)
casper 0:346c723cac97 44 {
ftagius 1:f2d9ed33c276 45 return _SPITransfer2((reg & 0x3F) | 0x40, 0);
casper 0:346c723cac97 46 }
casper 0:346c723cac97 47
ftagius 1:f2d9ed33c276 48
casper 0:346c723cac97 49 char AS3935::_ffsz(char mask)
casper 0:346c723cac97 50 {
casper 0:346c723cac97 51 char i = 0;
ftagius 2:3b3b435ca8d9 52
casper 0:346c723cac97 53 while(!(mask & 1)) {
ftagius 2:3b3b435ca8d9 54 mask >>= 1;
casper 0:346c723cac97 55 i++;
casper 0:346c723cac97 56 }
ftagius 2:3b3b435ca8d9 57
casper 0:346c723cac97 58 return i;
casper 0:346c723cac97 59 }
casper 0:346c723cac97 60
casper 0:346c723cac97 61 void AS3935::registerWrite(char reg, char mask, char data)
casper 0:346c723cac97 62 {
ftagius 1:f2d9ed33c276 63
casper 0:346c723cac97 64 char regval;
casper 0:346c723cac97 65 regval = _rawRegisterRead(reg);
casper 0:346c723cac97 66 regval &= ~(mask);
ftagius 2:3b3b435ca8d9 67 regval |= (data << (_ffsz(mask)));
ftagius 1:f2d9ed33c276 68 m_Cs = 0;
ftagius 1:f2d9ed33c276 69 m_Spi.write(reg);
ftagius 1:f2d9ed33c276 70 m_Spi.write(regval);
ftagius 1:f2d9ed33c276 71 //printf("raw transfer for reg %x is 0x%02x\r\n", high, regval);
ftagius 1:f2d9ed33c276 72 m_Cs = 1;
ftagius 1:f2d9ed33c276 73 wait_ms(2);
casper 0:346c723cac97 74 }
casper 0:346c723cac97 75
casper 0:346c723cac97 76 char AS3935::registerRead(char reg, char mask)
ftagius 1:f2d9ed33c276 77 {
casper 0:346c723cac97 78 char regval;
casper 0:346c723cac97 79 regval = _rawRegisterRead(reg);
ftagius 1:f2d9ed33c276 80 // printf("raw regval is 0x%02x\r\n", regval);
casper 0:346c723cac97 81 regval = regval & mask;
ftagius 1:f2d9ed33c276 82 regval >>= (_ffsz(mask));
casper 0:346c723cac97 83 return regval;
casper 0:346c723cac97 84 }
casper 0:346c723cac97 85
casper 0:346c723cac97 86 void AS3935::reset()
ftagius 1:f2d9ed33c276 87 {
ftagius 1:f2d9ed33c276 88 m_Cs = 0;
ftagius 1:f2d9ed33c276 89 m_Spi.write(0x3D);
ftagius 1:f2d9ed33c276 90 m_Spi.write(0x96);
ftagius 1:f2d9ed33c276 91 m_Cs = 1;
casper 0:346c723cac97 92 wait_ms(2);
ftagius 1:f2d9ed33c276 93 }
casper 0:346c723cac97 94
casper 0:346c723cac97 95 void AS3935::powerDown()
ftagius 1:f2d9ed33c276 96 {
casper 0:346c723cac97 97 registerWrite(AS3935_PWD,1);
ftagius 1:f2d9ed33c276 98 }
casper 0:346c723cac97 99
casper 0:346c723cac97 100 void AS3935::powerUp()
ftagius 1:f2d9ed33c276 101 {
ftagius 1:f2d9ed33c276 102
casper 0:346c723cac97 103 registerWrite(AS3935_PWD,0);
ftagius 1:f2d9ed33c276 104 m_Cs = 0;
ftagius 1:f2d9ed33c276 105 m_Spi.write(0x3D);
ftagius 1:f2d9ed33c276 106 m_Spi.write(0x96);
ftagius 1:f2d9ed33c276 107 m_Cs = 1;
casper 0:346c723cac97 108 wait_ms(3);
casper 0:346c723cac97 109 registerWrite(AS3935_DISP_TRCO,1);
casper 0:346c723cac97 110 wait_ms(2);
casper 0:346c723cac97 111 registerWrite(AS3935_DISP_TRCO,0);
ftagius 1:f2d9ed33c276 112 }
casper 0:346c723cac97 113
casper 0:346c723cac97 114 int AS3935::interruptSource()
ftagius 2:3b3b435ca8d9 115 {
casper 0:346c723cac97 116 return registerRead(AS3935_INT);
ftagius 2:3b3b435ca8d9 117 }
casper 0:346c723cac97 118
casper 0:346c723cac97 119 void AS3935::disableDisturbers()
ftagius 2:3b3b435ca8d9 120 {
casper 0:346c723cac97 121 registerWrite(AS3935_MASK_DIST,1);
ftagius 2:3b3b435ca8d9 122 }
casper 0:346c723cac97 123
casper 0:346c723cac97 124 void AS3935::enableDisturbers()
ftagius 2:3b3b435ca8d9 125 {
casper 0:346c723cac97 126 registerWrite(AS3935_MASK_DIST,0);
ftagius 2:3b3b435ca8d9 127 }
casper 0:346c723cac97 128
casper 0:346c723cac97 129 int AS3935::getMinimumLightnings()
ftagius 2:3b3b435ca8d9 130 {
casper 0:346c723cac97 131 return registerRead(AS3935_MIN_NUM_LIGH);
ftagius 2:3b3b435ca8d9 132 }
casper 0:346c723cac97 133
casper 0:346c723cac97 134 int AS3935::setMinimumLightnings(int minlightning)
ftagius 2:3b3b435ca8d9 135 {
casper 0:346c723cac97 136 registerWrite(AS3935_MIN_NUM_LIGH,minlightning);
casper 0:346c723cac97 137 return getMinimumLightnings();
ftagius 2:3b3b435ca8d9 138 }
casper 0:346c723cac97 139
casper 0:346c723cac97 140 int AS3935::lightningDistanceKm()
ftagius 2:3b3b435ca8d9 141 {
casper 0:346c723cac97 142 return registerRead(AS3935_DISTANCE);
ftagius 2:3b3b435ca8d9 143 }
casper 0:346c723cac97 144
casper 0:346c723cac97 145 void AS3935::setIndoors()
ftagius 2:3b3b435ca8d9 146 {
casper 0:346c723cac97 147 registerWrite(AS3935_AFE_GB,AS3935_AFE_INDOOR);
ftagius 2:3b3b435ca8d9 148 }
casper 0:346c723cac97 149
casper 0:346c723cac97 150 void AS3935::setOutdoors()
ftagius 2:3b3b435ca8d9 151 {
casper 0:346c723cac97 152 registerWrite(AS3935_AFE_GB,AS3935_AFE_OUTDOOR);
ftagius 2:3b3b435ca8d9 153 }
casper 0:346c723cac97 154
casper 0:346c723cac97 155 int AS3935::getNoiseFloor()
ftagius 2:3b3b435ca8d9 156 {
casper 0:346c723cac97 157 return registerRead(AS3935_NF_LEV);
ftagius 2:3b3b435ca8d9 158 }
casper 0:346c723cac97 159
casper 0:346c723cac97 160 int AS3935::setNoiseFloor(int noisefloor)
ftagius 2:3b3b435ca8d9 161 {
casper 0:346c723cac97 162 registerWrite(AS3935_NF_LEV,noisefloor);
casper 0:346c723cac97 163 return getNoiseFloor();
ftagius 2:3b3b435ca8d9 164 }
casper 0:346c723cac97 165
casper 0:346c723cac97 166 int AS3935::getSpikeRejection()
ftagius 2:3b3b435ca8d9 167 {
casper 0:346c723cac97 168 return registerRead(AS3935_SREJ);
ftagius 2:3b3b435ca8d9 169 }
casper 0:346c723cac97 170
casper 0:346c723cac97 171 int AS3935::setSpikeRejection(int srej)
ftagius 2:3b3b435ca8d9 172 {
casper 0:346c723cac97 173 registerWrite(AS3935_SREJ, srej);
casper 0:346c723cac97 174 return getSpikeRejection();
ftagius 2:3b3b435ca8d9 175 }
casper 0:346c723cac97 176
casper 0:346c723cac97 177 int AS3935::getWatchdogThreshold()
ftagius 2:3b3b435ca8d9 178 {
casper 0:346c723cac97 179 return registerRead(AS3935_WDTH);
ftagius 2:3b3b435ca8d9 180 }
casper 0:346c723cac97 181
casper 0:346c723cac97 182 int AS3935::setWatchdogThreshold(int wdth)
ftagius 2:3b3b435ca8d9 183 {
casper 0:346c723cac97 184 registerWrite(AS3935_WDTH,wdth);
casper 0:346c723cac97 185 return getWatchdogThreshold();
ftagius 2:3b3b435ca8d9 186 }
casper 0:346c723cac97 187
casper 0:346c723cac97 188 int AS3935::getTuneCap()
ftagius 2:3b3b435ca8d9 189 {
casper 0:346c723cac97 190 return registerRead(AS3935_TUN_CAP);
ftagius 2:3b3b435ca8d9 191 }
casper 0:346c723cac97 192
casper 0:346c723cac97 193 int AS3935::setTuneCap(int cap)
ftagius 2:3b3b435ca8d9 194 {
casper 0:346c723cac97 195 registerWrite(AS3935_TUN_CAP,cap);
ftagius 2:3b3b435ca8d9 196 return getTuneCap();
ftagius 2:3b3b435ca8d9 197 }
casper 0:346c723cac97 198
casper 0:346c723cac97 199 void AS3935::clearStats()
ftagius 2:3b3b435ca8d9 200 {
casper 0:346c723cac97 201 registerWrite(AS3935_CL_STAT,1);
casper 0:346c723cac97 202 registerWrite(AS3935_CL_STAT,0);
casper 0:346c723cac97 203 registerWrite(AS3935_CL_STAT,1);
ftagius 2:3b3b435ca8d9 204 }