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:47:29 2015 +0000
Revision:
1:f2d9ed33c276
Parent:
0:346c723cac97
Child:
2:3b3b435ca8d9
Convert AS3935 library to SPI

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 #if 0
ftagius 1:f2d9ed33c276 25 AS3935::AS3935(PinName sda, PinName scl, int adress, int hz): i2c(sda, scl), _adress(adress), m_FREQ(hz) {
ftagius 1:f2d9ed33c276 26
casper 0:346c723cac97 27 wait_ms(11);
ftagius 1:f2d9ed33c276 28 //Configure the SPI bus
ftagius 1:f2d9ed33c276 29 m_Spi.format(8, 1);
ftagius 1:f2d9ed33c276 30 }
casper 0:346c723cac97 31 //~AS3935(){
casper 0:346c723cac97 32
casper 0:346c723cac97 33 //}
ftagius 1:f2d9ed33c276 34 #endif
ftagius 1:f2d9ed33c276 35 #if 1
ftagius 1:f2d9ed33c276 36 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 37 {
ftagius 1:f2d9ed33c276 38
ftagius 1:f2d9ed33c276 39 //Enable the internal pull-up resistor on MISO
ftagius 1:f2d9ed33c276 40 pin_mode(miso, PullUp);
ftagius 1:f2d9ed33c276 41
ftagius 1:f2d9ed33c276 42 //Configure the SPI bus
ftagius 1:f2d9ed33c276 43 m_Spi.format(8, 1);
ftagius 1:f2d9ed33c276 44 }
ftagius 1:f2d9ed33c276 45 #endif
ftagius 1:f2d9ed33c276 46
ftagius 1:f2d9ed33c276 47
ftagius 1:f2d9ed33c276 48 char AS3935::_SPITransfer2(char high, char low)
ftagius 1:f2d9ed33c276 49 {
ftagius 1:f2d9ed33c276 50 m_Cs = 0;
ftagius 1:f2d9ed33c276 51 m_Spi.write(high);
ftagius 1:f2d9ed33c276 52 char regval = m_Spi.write(low);
ftagius 1:f2d9ed33c276 53 // printf("raw transfer for reg %x is 0x%02x\r\n", high, regval);
ftagius 1:f2d9ed33c276 54 m_Cs = 1;
ftagius 1:f2d9ed33c276 55 return regval;
ftagius 1:f2d9ed33c276 56 }
ftagius 1:f2d9ed33c276 57
casper 0:346c723cac97 58 char AS3935::_rawRegisterRead(char reg)
casper 0:346c723cac97 59 {
ftagius 1:f2d9ed33c276 60 return _SPITransfer2((reg & 0x3F) | 0x40, 0);
casper 0:346c723cac97 61 }
casper 0:346c723cac97 62
ftagius 1:f2d9ed33c276 63
casper 0:346c723cac97 64 char AS3935::_ffsz(char mask)
casper 0:346c723cac97 65 {
casper 0:346c723cac97 66 char i = 0;
casper 0:346c723cac97 67 //char temp;
casper 0:346c723cac97 68
casper 0:346c723cac97 69 while(!(mask & 1)) {
casper 0:346c723cac97 70 //if (!(mask & 1)) {
casper 0:346c723cac97 71 mask >>= 1;
casper 0:346c723cac97 72 i++;
casper 0:346c723cac97 73 //}
casper 0:346c723cac97 74 }
casper 0:346c723cac97 75 //if (mask){
casper 0:346c723cac97 76 // for (i = 1; ~mask & 1 ; i++) {
casper 0:346c723cac97 77 // mask >>= 1;
casper 0:346c723cac97 78 // }
casper 0:346c723cac97 79 // }
casper 0:346c723cac97 80 return i;
casper 0:346c723cac97 81 }
casper 0:346c723cac97 82
casper 0:346c723cac97 83 void AS3935::registerWrite(char reg, char mask, char data)
casper 0:346c723cac97 84 {
ftagius 1:f2d9ed33c276 85
casper 0:346c723cac97 86 char regval;
casper 0:346c723cac97 87 regval = _rawRegisterRead(reg);
casper 0:346c723cac97 88 regval &= ~(mask);
casper 0:346c723cac97 89 //if (mask){
casper 0:346c723cac97 90 regval |= (data << (_ffsz(mask)));
casper 0:346c723cac97 91 // }
casper 0:346c723cac97 92 //else {
casper 0:346c723cac97 93 // regval |= data;
casper 0:346c723cac97 94 // }
ftagius 1:f2d9ed33c276 95
ftagius 1:f2d9ed33c276 96 m_Cs = 0;
ftagius 1:f2d9ed33c276 97 m_Spi.write(reg);
ftagius 1:f2d9ed33c276 98 m_Spi.write(regval);
ftagius 1:f2d9ed33c276 99 //printf("raw transfer for reg %x is 0x%02x\r\n", high, regval);
ftagius 1:f2d9ed33c276 100 m_Cs = 1;
ftagius 1:f2d9ed33c276 101 wait_ms(2);
casper 0:346c723cac97 102 }
casper 0:346c723cac97 103
casper 0:346c723cac97 104 char AS3935::registerRead(char reg, char mask)
ftagius 1:f2d9ed33c276 105 {
casper 0:346c723cac97 106 char regval;
casper 0:346c723cac97 107 regval = _rawRegisterRead(reg);
ftagius 1:f2d9ed33c276 108 // printf("raw regval is 0x%02x\r\n", regval);
casper 0:346c723cac97 109 regval = regval & mask;
ftagius 1:f2d9ed33c276 110 regval >>= (_ffsz(mask));
casper 0:346c723cac97 111 return regval;
casper 0:346c723cac97 112 }
casper 0:346c723cac97 113
casper 0:346c723cac97 114 void AS3935::reset()
ftagius 1:f2d9ed33c276 115 {
ftagius 1:f2d9ed33c276 116 m_Cs = 0;
ftagius 1:f2d9ed33c276 117 m_Spi.write(0x3D);
ftagius 1:f2d9ed33c276 118 m_Spi.write(0x96);
ftagius 1:f2d9ed33c276 119 m_Cs = 1;
casper 0:346c723cac97 120 wait_ms(2);
ftagius 1:f2d9ed33c276 121 }
casper 0:346c723cac97 122
casper 0:346c723cac97 123 void AS3935::powerDown()
ftagius 1:f2d9ed33c276 124 {
casper 0:346c723cac97 125 registerWrite(AS3935_PWD,1);
ftagius 1:f2d9ed33c276 126 }
casper 0:346c723cac97 127
casper 0:346c723cac97 128 void AS3935::powerUp()
ftagius 1:f2d9ed33c276 129 {
ftagius 1:f2d9ed33c276 130
casper 0:346c723cac97 131 registerWrite(AS3935_PWD,0);
ftagius 1:f2d9ed33c276 132 m_Cs = 0;
ftagius 1:f2d9ed33c276 133 m_Spi.write(0x3D);
ftagius 1:f2d9ed33c276 134 m_Spi.write(0x96);
ftagius 1:f2d9ed33c276 135 m_Cs = 1;
casper 0:346c723cac97 136 wait_ms(3);
casper 0:346c723cac97 137 registerWrite(AS3935_DISP_TRCO,1);
casper 0:346c723cac97 138 wait_ms(2);
casper 0:346c723cac97 139 registerWrite(AS3935_DISP_TRCO,0);
ftagius 1:f2d9ed33c276 140 }
casper 0:346c723cac97 141
casper 0:346c723cac97 142 int AS3935::interruptSource()
casper 0:346c723cac97 143 {
casper 0:346c723cac97 144 return registerRead(AS3935_INT);
casper 0:346c723cac97 145 }
casper 0:346c723cac97 146
casper 0:346c723cac97 147 void AS3935::disableDisturbers()
casper 0:346c723cac97 148 {
casper 0:346c723cac97 149 registerWrite(AS3935_MASK_DIST,1);
casper 0:346c723cac97 150 }
casper 0:346c723cac97 151
casper 0:346c723cac97 152 void AS3935::enableDisturbers()
casper 0:346c723cac97 153 {
casper 0:346c723cac97 154 registerWrite(AS3935_MASK_DIST,0);
casper 0:346c723cac97 155 }
casper 0:346c723cac97 156
casper 0:346c723cac97 157 int AS3935::getMinimumLightnings()
casper 0:346c723cac97 158 {
casper 0:346c723cac97 159 return registerRead(AS3935_MIN_NUM_LIGH);
casper 0:346c723cac97 160 }
casper 0:346c723cac97 161
casper 0:346c723cac97 162 int AS3935::setMinimumLightnings(int minlightning)
casper 0:346c723cac97 163 {
casper 0:346c723cac97 164 registerWrite(AS3935_MIN_NUM_LIGH,minlightning);
casper 0:346c723cac97 165 return getMinimumLightnings();
casper 0:346c723cac97 166 }
casper 0:346c723cac97 167
casper 0:346c723cac97 168 int AS3935::lightningDistanceKm()
casper 0:346c723cac97 169 {
casper 0:346c723cac97 170 return registerRead(AS3935_DISTANCE);
casper 0:346c723cac97 171 }
casper 0:346c723cac97 172
casper 0:346c723cac97 173 void AS3935::setIndoors()
casper 0:346c723cac97 174 {
casper 0:346c723cac97 175 registerWrite(AS3935_AFE_GB,AS3935_AFE_INDOOR);
casper 0:346c723cac97 176 }
casper 0:346c723cac97 177
casper 0:346c723cac97 178 void AS3935::setOutdoors()
casper 0:346c723cac97 179 {
casper 0:346c723cac97 180 registerWrite(AS3935_AFE_GB,AS3935_AFE_OUTDOOR);
casper 0:346c723cac97 181 }
casper 0:346c723cac97 182
casper 0:346c723cac97 183 int AS3935::getNoiseFloor()
casper 0:346c723cac97 184 {
casper 0:346c723cac97 185 return registerRead(AS3935_NF_LEV);
casper 0:346c723cac97 186 }
casper 0:346c723cac97 187
casper 0:346c723cac97 188 int AS3935::setNoiseFloor(int noisefloor)
casper 0:346c723cac97 189 {
casper 0:346c723cac97 190 registerWrite(AS3935_NF_LEV,noisefloor);
casper 0:346c723cac97 191 return getNoiseFloor();
casper 0:346c723cac97 192 }
casper 0:346c723cac97 193
casper 0:346c723cac97 194 int AS3935::getSpikeRejection()
casper 0:346c723cac97 195 {
casper 0:346c723cac97 196 return registerRead(AS3935_SREJ);
casper 0:346c723cac97 197 }
casper 0:346c723cac97 198
casper 0:346c723cac97 199 int AS3935::setSpikeRejection(int srej)
casper 0:346c723cac97 200 {
casper 0:346c723cac97 201 registerWrite(AS3935_SREJ, srej);
casper 0:346c723cac97 202 return getSpikeRejection();
casper 0:346c723cac97 203 }
casper 0:346c723cac97 204
casper 0:346c723cac97 205 int AS3935::getWatchdogThreshold()
casper 0:346c723cac97 206 {
casper 0:346c723cac97 207 return registerRead(AS3935_WDTH);
casper 0:346c723cac97 208 }
casper 0:346c723cac97 209
casper 0:346c723cac97 210 int AS3935::setWatchdogThreshold(int wdth)
casper 0:346c723cac97 211 {
casper 0:346c723cac97 212 registerWrite(AS3935_WDTH,wdth);
casper 0:346c723cac97 213 return getWatchdogThreshold();
casper 0:346c723cac97 214 }
casper 0:346c723cac97 215
casper 0:346c723cac97 216 int AS3935::getTuneCap()
casper 0:346c723cac97 217 {
casper 0:346c723cac97 218 return registerRead(AS3935_TUN_CAP);
casper 0:346c723cac97 219 }
casper 0:346c723cac97 220
casper 0:346c723cac97 221 int AS3935::setTuneCap(int cap)
casper 0:346c723cac97 222 {
casper 0:346c723cac97 223 registerWrite(AS3935_TUN_CAP,cap);
casper 0:346c723cac97 224 return getTuneCap();
casper 0:346c723cac97 225 }
casper 0:346c723cac97 226
casper 0:346c723cac97 227 void AS3935::clearStats()
casper 0:346c723cac97 228 {
casper 0:346c723cac97 229 registerWrite(AS3935_CL_STAT,1);
casper 0:346c723cac97 230 registerWrite(AS3935_CL_STAT,0);
casper 0:346c723cac97 231 registerWrite(AS3935_CL_STAT,1);
casper 0:346c723cac97 232 }