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); } }
Revision 1:f2d9ed33c276, committed 2015-06-11
- Comitter:
- ftagius
- Date:
- Thu Jun 11 15:47:29 2015 +0000
- Parent:
- 0:346c723cac97
- Child:
- 2:3b3b435ca8d9
- Commit message:
- Convert AS3935 library to SPI
Changed in this revision
--- a/AS3935.cpp Sat Apr 05 23:24:41 2014 +0000 +++ b/AS3935.cpp Thu Jun 11 15:47:29 2015 +0000 @@ -18,26 +18,49 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "AS3935.hpp" +#include "AS3935.h" +#include "pinmap.h" -AS3935::AS3935(PinName sda, PinName scl, int adresse): i2c(sda, scl), _adress(adresse) { - +#if 0 +AS3935::AS3935(PinName sda, PinName scl, int adress, int hz): i2c(sda, scl), _adress(adress), m_FREQ(hz) { + wait_ms(11); - } - + //Configure the SPI bus + m_Spi.format(8, 1); +} //~AS3935(){ //} - +#endif +#if 1 +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) +{ + + //Enable the internal pull-up resistor on MISO + pin_mode(miso, PullUp); + + //Configure the SPI bus + m_Spi.format(8, 1); +} +#endif + + +char AS3935::_SPITransfer2(char high, char low) +{ + m_Cs = 0; + m_Spi.write(high); + char regval = m_Spi.write(low); + // printf("raw transfer for reg %x is 0x%02x\r\n", high, regval); + m_Cs = 1; + return regval; +} + char AS3935::_rawRegisterRead(char reg) { - char data; - i2c.write( _adress, ®, 1, true); - i2c.read(_adress, &data, 1); - return data; - + return _SPITransfer2((reg & 0x3F) | 0x40, 0); } + char AS3935::_ffsz(char mask) { char i = 0; @@ -59,7 +82,7 @@ void AS3935::registerWrite(char reg, char mask, char data) { - char cmd[2]; + char regval; regval = _rawRegisterRead(reg); regval &= ~(mask); @@ -69,51 +92,52 @@ //else { // regval |= data; // } - cmd[0] = reg; - cmd[1] = regval; - i2c.write( _adress, cmd, 2); - + + m_Cs = 0; + m_Spi.write(reg); + m_Spi.write(regval); + //printf("raw transfer for reg %x is 0x%02x\r\n", high, regval); + m_Cs = 1; + wait_ms(2); } char AS3935::registerRead(char reg, char mask) - { +{ char regval; regval = _rawRegisterRead(reg); + // printf("raw regval is 0x%02x\r\n", regval); regval = regval & mask; - //if (mask){ - regval >>= (_ffsz(mask)); - // } + regval >>= (_ffsz(mask)); return regval; } void AS3935::reset() - { - char cmd[2]; - cmd[0] = 0x3C; - cmd[1] = 0x96; - i2c.write( _adress, cmd, 2); + { + m_Cs = 0; + m_Spi.write(0x3D); + m_Spi.write(0x96); + m_Cs = 1; 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); + m_Cs = 0; + m_Spi.write(0x3D); + m_Spi.write(0x96); + m_Cs = 1; wait_ms(3); registerWrite(AS3935_DISP_TRCO,1); wait_ms(2); registerWrite(AS3935_DISP_TRCO,0); - } +} int AS3935::interruptSource() {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AS3935.h Thu Jun 11 15:47:29 2015 +0000 @@ -0,0 +1,181 @@ +/* +AS3935.h - AS3935 Franklin Lightning Sensor™ IC by AMS library +Copyright (c) 2012 Raivis Rengelis (raivis [at] rrkb.lv). All rights reserved. +Portée sur MBED par Valentin + +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 +*/ + +#ifndef _AS3935_H +#define _AS3935_H + +#include "mbed.h" +#include <stdint.h> + +//#include "i2c.hpp" + +// register access macros - register address, bitmask +#define AS3935_AFE_GB 0x00, 0x3E +#define AS3935_PWD 0x00, 0x01 +#define AS3935_NF_LEV 0x01, 0x70 +#define AS3935_WDTH 0x01, 0x0F +#define AS3935_CL_STAT 0x02, 0x40 +#define AS3935_MIN_NUM_LIGH 0x02, 0x30 +#define AS3935_SREJ 0x02, 0x0F +#define AS3935_LCO_FDIV 0x03, 0xC0 +#define AS3935_MASK_DIST 0x03, 0x20 +#define AS3935_INT 0x03, 0x0F +#define AS3935_DISTANCE 0x07, 0x3F +#define AS3935_DISP_LCO 0x08, 0x80 +#define AS3935_DISP_SRCO 0x08, 0x40 +#define AS3935_DISP_TRCO 0x08, 0x20 +#define AS3935_TUN_CAP 0x08, 0x0F + +// other constants +#define AS3935_AFE_INDOOR 0x12 +#define AS3935_AFE_OUTDOOR 0x0E + +class AS3935 { + + public: + /* + * Initializes i2c interface and IRQ pin + */ + // AS3935(PinName sda, PinName scl, int adresse, int hz = 1000000); + + + /** Create a virtual file system for accessing SD/MMC cards via SPI + * + * @param mosi The SPI data out pin. + * @param miso The SPI data in pin. + * @param sclk The SPI clock pin. + * @param cs The SPI chip select pin. + * @param name The name used to access the virtual filesystem. + * @param cd The card detect pin. + * @param cdtype The type of card detect switch. + * @param hz The SPI bus frequency (defaults to 1MHz). + */ + + AS3935(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name, PinName cd = NC, int hz = 10000); + + //destruction + //~AS3935(); + + //write to specified register specified data using specified bitmask, + //the rest of the register remains intact + void registerWrite(char reg, char mask, char data); + + //read specified register using specified bitmask and return value aligned + //to lsb, i.e. if value to be read is in a middle of register, function + //reads register and then aligns lsb of value to lsb of byte + char registerRead(char reg, char mask); + + //reset all the registers on chip to default values + void reset(); + + //put chip into power down mode + void powerDown(); + + //bring chip out of power down mode and perform RCO calibration + void powerUp(); + + //return interrupt source, bitmask, 0b0001 - noise, 0b0100 - disturber, + //0b1000 - lightning + int interruptSource(); + + //disable indication of disturbers + void disableDisturbers(); + + //enable indication of distrubers + void enableDisturbers(); + + //return number of lightnings that need to be detected in 17 minute period + //before interrupt is issued + int getMinimumLightnings(); + + //set number of lightnings that need to be detected in 17 minute period + //before interrupt is issued + int setMinimumLightnings(int minlightning); + + //return distance to lightning in kilometers, 1 means storm is overhead, + //63 means it is too far to reliably calculate distance + int lightningDistanceKm(); + + // load gain preset to operate indoors + void setIndoors(); + + //load gain preset to operate outdoors + void setOutdoors(); + + //return noise floor setting - refer to datasheet for meaning and range + int getNoiseFloor(); + + //set noise floor setting + int setNoiseFloor(int noisefloor); + + //return spike rejection value - refer to datasheet for meaning and range + int getSpikeRejection(); + + //set spike rejection value + int setSpikeRejection(int srej); + + //return watchdog threshold value - refer to datasheet for meaning and range + int getWatchdogThreshold(); + + //set watchdog threshold value + int setWatchdogThreshold(int wdth); + + //return tune Capacity value + int getTuneCap(); + + //set tune Capacity value + int setTuneCap(int cap); + + //clear internal accumulated lightning statistics + void clearStats(); + + /** Attach a function, lightning interrupt + * @param fptr pointer to a void function, or 0 to set as none + */ + void attach(void (*fptr)(void)) { + _func.attach(fptr); + } + /** Attach a member function, lightning interrupt + * @param tptr pointer to the object to call the member function on + * @param mptr pointer to the member function to be called + */ + template<typename T> + void attach(T *tptr, void (T::*mptr)(void)) { + _func.attach(tptr, mptr); + } + + private: + //I2C i2c; + //DigitalOut _irq; + SPI m_Spi; + DigitalOut m_Cs; + InterruptIn m_Cd; + + int m_CdAssert; + const int m_FREQ; + int _adress; + FunctionPointer _func; + char _rawRegisterRead(char reg); + char _SPITransfer2(char high, char low); + char _ffsz(char mask); +}; + +/* !_AS3935_H_ */ +#endif \ No newline at end of file
--- a/AS3935.hpp Sat Apr 05 23:24:41 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +0,0 @@ -/* -AS3935.h - AS3935 Franklin Lightning Sensor™ IC by AMS library -Copyright (c) 2012 Raivis Rengelis (raivis [at] rrkb.lv). All rights reserved. -Portée sur MBED par Valentin - -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 -*/ - -#ifndef _AS3935_HPP -#define _AS3935_HPP - -#include "mbed.h" -//#include "i2c.hpp" - -// register access macros - register address, bitmask -#define AS3935_AFE_GB 0x00, 0x3E -#define AS3935_PWD 0x00, 0x01 -#define AS3935_NF_LEV 0x01, 0x70 -#define AS3935_WDTH 0x01, 0x0F -#define AS3935_CL_STAT 0x02, 0x40 -#define AS3935_MIN_NUM_LIGH 0x02, 0x30 -#define AS3935_SREJ 0x02, 0x0F -#define AS3935_LCO_FDIV 0x03, 0xC0 -#define AS3935_MASK_DIST 0x03, 0x20 -#define AS3935_INT 0x03, 0x0F -#define AS3935_DISTANCE 0x07, 0x3F -#define AS3935_DISP_LCO 0x08, 0x80 -#define AS3935_DISP_SRCO 0x08, 0x40 -#define AS3935_DISP_TRCO 0x08, 0x20 -#define AS3935_TUN_CAP 0x08, 0x0F - -// other constants -#define AS3935_AFE_INDOOR 0x12 -#define AS3935_AFE_OUTDOOR 0x0E - -class AS3935 { - - public: - /* - * Initializes I2C interface and IRQ pin - */ - AS3935(PinName sda, PinName scl, int adresse); - - //destruction - //~AS3935(); - - //write to specified register specified data using specified bitmask, - //the rest of the register remains intact - void registerWrite(char reg, char mask, char data); - - //read specified register using specified bitmask and return value aligned - //to lsb, i.e. if value to be read is in a middle of register, function - //reads register and then aligns lsb of value to lsb of byte - char registerRead(char reg, char mask); - - //reset all the registers on chip to default values - void reset(); - - //put chip into power down mode - void powerDown(); - - //bring chip out of power down mode and perform RCO calibration - void powerUp(); - - //return interrupt source, bitmask, 0b0001 - noise, 0b0100 - disturber, - //0b1000 - lightning - int interruptSource(); - - //disable indication of disturbers - void disableDisturbers(); - - //enable indication of distrubers - void enableDisturbers(); - - //return number of lightnings that need to be detected in 17 minute period - //before interrupt is issued - int getMinimumLightnings(); - - //set number of lightnings that need to be detected in 17 minute period - //before interrupt is issued - int setMinimumLightnings(int minlightning); - - //return distance to lightning in kilometers, 1 means storm is overhead, - //63 means it is too far to reliably calculate distance - int lightningDistanceKm(); - - // load gain preset to operate indoors - void setIndoors(); - - //load gain preset to operate outdoors - void setOutdoors(); - - //return noise floor setting - refer to datasheet for meaning and range - int getNoiseFloor(); - - //set noise floor setting - int setNoiseFloor(int noisefloor); - - //return spike rejection value - refer to datasheet for meaning and range - int getSpikeRejection(); - - //set spike rejection value - int setSpikeRejection(int srej); - - //return watchdog threshold value - refer to datasheet for meaning and range - int getWatchdogThreshold(); - - //set watchdog threshold value - int setWatchdogThreshold(int wdth); - - //return tune Capacity value - int getTuneCap(); - - //set tune Capacity value - int setTuneCap(int cap); - - //clear internal accumulated lightning statistics - void clearStats(); - - private: - I2C i2c; - //DigitalOut _irq; - int _adress; - char _rawRegisterRead(char reg); - char _ffsz(char mask); -}; - -/* !_AS3935_HPP_ */ -#endif \ No newline at end of file