Richard Cullen
/
as3935
This is a working demo of the AS3935 Lightning detector using the NUCLEO-L013K6.
AS3935.h@0:75defe5eed80, 2017-06-20 (annotated)
- Committer:
- madelectroneng
- Date:
- Tue Jun 20 08:36:25 2017 +0000
- Revision:
- 0:75defe5eed80
Working demo on nucleo-l031k6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
madelectroneng | 0:75defe5eed80 | 1 | /* |
madelectroneng | 0:75defe5eed80 | 2 | AS3935.h - AS3935 Franklin Lightning Sensor™ IC by AMS library |
madelectroneng | 0:75defe5eed80 | 3 | Copyright (c) 2012 Raivis Rengelis (raivis [at] rrkb.lv). All rights reserved. |
madelectroneng | 0:75defe5eed80 | 4 | Portée sur MBED par Valentin |
madelectroneng | 0:75defe5eed80 | 5 | |
madelectroneng | 0:75defe5eed80 | 6 | This library is free software; you can redistribute it and/or |
madelectroneng | 0:75defe5eed80 | 7 | modify it under the terms of the GNU Lesser General Public |
madelectroneng | 0:75defe5eed80 | 8 | License as published by the Free Software Foundation; either |
madelectroneng | 0:75defe5eed80 | 9 | version 3 of the License, or (at your option) any later version. |
madelectroneng | 0:75defe5eed80 | 10 | |
madelectroneng | 0:75defe5eed80 | 11 | This library is distributed in the hope that it will be useful, |
madelectroneng | 0:75defe5eed80 | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
madelectroneng | 0:75defe5eed80 | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
madelectroneng | 0:75defe5eed80 | 14 | Lesser General Public License for more details. |
madelectroneng | 0:75defe5eed80 | 15 | |
madelectroneng | 0:75defe5eed80 | 16 | You should have received a copy of the GNU Lesser General Public |
madelectroneng | 0:75defe5eed80 | 17 | License along with this library; if not, write to the Free Software |
madelectroneng | 0:75defe5eed80 | 18 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
madelectroneng | 0:75defe5eed80 | 19 | */ |
madelectroneng | 0:75defe5eed80 | 20 | |
madelectroneng | 0:75defe5eed80 | 21 | #ifndef _AS3935_H |
madelectroneng | 0:75defe5eed80 | 22 | #define _AS3935_H |
madelectroneng | 0:75defe5eed80 | 23 | |
madelectroneng | 0:75defe5eed80 | 24 | #include "mbed.h" |
madelectroneng | 0:75defe5eed80 | 25 | #include <stdint.h> |
madelectroneng | 0:75defe5eed80 | 26 | |
madelectroneng | 0:75defe5eed80 | 27 | //#include "i2c.hpp" |
madelectroneng | 0:75defe5eed80 | 28 | |
madelectroneng | 0:75defe5eed80 | 29 | // register access macros - register address, bitmask |
madelectroneng | 0:75defe5eed80 | 30 | #define AS3935_AFE_GB 0x00, 0x3E |
madelectroneng | 0:75defe5eed80 | 31 | #define AS3935_PWD 0x00, 0x01 |
madelectroneng | 0:75defe5eed80 | 32 | #define AS3935_NF_LEV 0x01, 0x70 |
madelectroneng | 0:75defe5eed80 | 33 | #define AS3935_WDTH 0x01, 0x0F |
madelectroneng | 0:75defe5eed80 | 34 | #define AS3935_CL_STAT 0x02, 0x40 |
madelectroneng | 0:75defe5eed80 | 35 | #define AS3935_MIN_NUM_LIGH 0x02, 0x30 |
madelectroneng | 0:75defe5eed80 | 36 | #define AS3935_SREJ 0x02, 0x0F |
madelectroneng | 0:75defe5eed80 | 37 | #define AS3935_LCO_FDIV 0x03, 0xC0 |
madelectroneng | 0:75defe5eed80 | 38 | #define AS3935_MASK_DIST 0x03, 0x20 |
madelectroneng | 0:75defe5eed80 | 39 | #define AS3935_INT 0x03, 0x0F |
madelectroneng | 0:75defe5eed80 | 40 | #define AS3935_S_LIG_L 0x04, 0xff |
madelectroneng | 0:75defe5eed80 | 41 | #define AS3935_S_LIG_M 0x05, 0xff |
madelectroneng | 0:75defe5eed80 | 42 | #define AS3935_S_LIG_MM 0x06, 0x1f |
madelectroneng | 0:75defe5eed80 | 43 | #define AS3935_DISTANCE 0x07, 0x3F |
madelectroneng | 0:75defe5eed80 | 44 | #define AS3935_DISP_LCO 0x08, 0x80 |
madelectroneng | 0:75defe5eed80 | 45 | #define AS3935_DISP_SRCO 0x08, 0x40 |
madelectroneng | 0:75defe5eed80 | 46 | #define AS3935_DISP_TRCO 0x08, 0x20 |
madelectroneng | 0:75defe5eed80 | 47 | #define AS3935_TUN_CAP 0x08, 0x0F |
madelectroneng | 0:75defe5eed80 | 48 | #define MAX_CONFIG_REGS 9 |
madelectroneng | 0:75defe5eed80 | 49 | |
madelectroneng | 0:75defe5eed80 | 50 | // other constants |
madelectroneng | 0:75defe5eed80 | 51 | #define AS3935_AFE_INDOOR 0x12 |
madelectroneng | 0:75defe5eed80 | 52 | #define AS3935_AFE_OUTDOOR 0x0E |
madelectroneng | 0:75defe5eed80 | 53 | |
madelectroneng | 0:75defe5eed80 | 54 | #define AS3935_EVENT_NOISE 1 |
madelectroneng | 0:75defe5eed80 | 55 | #define AS3935_EVENT_DISTURBER 4 |
madelectroneng | 0:75defe5eed80 | 56 | #define AS3935_EVENT_LIGHTNING 8 |
madelectroneng | 0:75defe5eed80 | 57 | |
madelectroneng | 0:75defe5eed80 | 58 | |
madelectroneng | 0:75defe5eed80 | 59 | |
madelectroneng | 0:75defe5eed80 | 60 | |
madelectroneng | 0:75defe5eed80 | 61 | class AS3935 { |
madelectroneng | 0:75defe5eed80 | 62 | |
madelectroneng | 0:75defe5eed80 | 63 | public: |
madelectroneng | 0:75defe5eed80 | 64 | |
madelectroneng | 0:75defe5eed80 | 65 | /** Create a virtual file system for accessing SD/MMC cards via SPI |
madelectroneng | 0:75defe5eed80 | 66 | * |
madelectroneng | 0:75defe5eed80 | 67 | * @param mosi The SPI data out pin. |
madelectroneng | 0:75defe5eed80 | 68 | * @param miso The SPI data in pin. |
madelectroneng | 0:75defe5eed80 | 69 | * @param sclk The SPI clock pin. |
madelectroneng | 0:75defe5eed80 | 70 | * @param cs The SPI chip select pin. |
madelectroneng | 0:75defe5eed80 | 71 | * @param name The name used to access the spi bus. |
madelectroneng | 0:75defe5eed80 | 72 | * @param hz The SPI bus frequency (defaults to 1MHz). |
madelectroneng | 0:75defe5eed80 | 73 | */ |
madelectroneng | 0:75defe5eed80 | 74 | |
madelectroneng | 0:75defe5eed80 | 75 | AS3935(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name, int hz = 2000000); |
madelectroneng | 0:75defe5eed80 | 76 | |
madelectroneng | 0:75defe5eed80 | 77 | //destruction |
madelectroneng | 0:75defe5eed80 | 78 | //~AS3935(); |
madelectroneng | 0:75defe5eed80 | 79 | |
madelectroneng | 0:75defe5eed80 | 80 | //write to specified register specified data using specified bitmask, |
madelectroneng | 0:75defe5eed80 | 81 | //the rest of the register remains intact |
madelectroneng | 0:75defe5eed80 | 82 | void registerWrite(char reg, char mask, char data); |
madelectroneng | 0:75defe5eed80 | 83 | |
madelectroneng | 0:75defe5eed80 | 84 | //read specified register using specified bitmask and return value aligned |
madelectroneng | 0:75defe5eed80 | 85 | //to lsb, i.e. if value to be read is in a middle of register, function |
madelectroneng | 0:75defe5eed80 | 86 | //reads register and then aligns lsb of value to lsb of byte |
madelectroneng | 0:75defe5eed80 | 87 | char registerRead(char reg, char mask); |
madelectroneng | 0:75defe5eed80 | 88 | |
madelectroneng | 0:75defe5eed80 | 89 | //reset all the registers on chip to default values |
madelectroneng | 0:75defe5eed80 | 90 | void reset(); |
madelectroneng | 0:75defe5eed80 | 91 | |
madelectroneng | 0:75defe5eed80 | 92 | //set preset defaults |
madelectroneng | 0:75defe5eed80 | 93 | void presetDefault(); |
madelectroneng | 0:75defe5eed80 | 94 | |
madelectroneng | 0:75defe5eed80 | 95 | //initialization |
madelectroneng | 0:75defe5eed80 | 96 | void init(); |
madelectroneng | 0:75defe5eed80 | 97 | |
madelectroneng | 0:75defe5eed80 | 98 | // replicate the acurite sequece |
madelectroneng | 0:75defe5eed80 | 99 | void acurite(); |
madelectroneng | 0:75defe5eed80 | 100 | |
madelectroneng | 0:75defe5eed80 | 101 | //put chip into power down mode |
madelectroneng | 0:75defe5eed80 | 102 | void powerDown(); |
madelectroneng | 0:75defe5eed80 | 103 | |
madelectroneng | 0:75defe5eed80 | 104 | //bring chip out of power down mode and perform RCO calibration |
madelectroneng | 0:75defe5eed80 | 105 | void powerUp(); |
madelectroneng | 0:75defe5eed80 | 106 | |
madelectroneng | 0:75defe5eed80 | 107 | //return interrupt source, bitmask, 0b0001 - noise, 0b0100 - disturber, |
madelectroneng | 0:75defe5eed80 | 108 | //0b1000 - lightning |
madelectroneng | 0:75defe5eed80 | 109 | int interruptSource(); |
madelectroneng | 0:75defe5eed80 | 110 | |
madelectroneng | 0:75defe5eed80 | 111 | //disable indication of disturbers |
madelectroneng | 0:75defe5eed80 | 112 | void disableDisturbers(); |
madelectroneng | 0:75defe5eed80 | 113 | |
madelectroneng | 0:75defe5eed80 | 114 | //enable indication of distrubers |
madelectroneng | 0:75defe5eed80 | 115 | void enableDisturbers(); |
madelectroneng | 0:75defe5eed80 | 116 | |
madelectroneng | 0:75defe5eed80 | 117 | //return number of lightnings that need to be detected in 17 minute period |
madelectroneng | 0:75defe5eed80 | 118 | //before interrupt is issued |
madelectroneng | 0:75defe5eed80 | 119 | int getMinimumLightnings(); |
madelectroneng | 0:75defe5eed80 | 120 | |
madelectroneng | 0:75defe5eed80 | 121 | //set number of lightnings that need to be detected in 17 minute period |
madelectroneng | 0:75defe5eed80 | 122 | //before interrupt is issued |
madelectroneng | 0:75defe5eed80 | 123 | int setMinimumLightnings(int minlightning); |
madelectroneng | 0:75defe5eed80 | 124 | |
madelectroneng | 0:75defe5eed80 | 125 | //return distance to lightning in kilometers, 1 means storm is overhead, |
madelectroneng | 0:75defe5eed80 | 126 | //63 means it is too far to reliably calculate distance |
madelectroneng | 0:75defe5eed80 | 127 | int lightningDistanceKm(); |
madelectroneng | 0:75defe5eed80 | 128 | |
madelectroneng | 0:75defe5eed80 | 129 | // load gain preset to operate indoors |
madelectroneng | 0:75defe5eed80 | 130 | void setIndoors(); |
madelectroneng | 0:75defe5eed80 | 131 | |
madelectroneng | 0:75defe5eed80 | 132 | //load gain preset to operate outdoors |
madelectroneng | 0:75defe5eed80 | 133 | void setOutdoors(); |
madelectroneng | 0:75defe5eed80 | 134 | |
madelectroneng | 0:75defe5eed80 | 135 | //get gain preset |
madelectroneng | 0:75defe5eed80 | 136 | int getGain(); |
madelectroneng | 0:75defe5eed80 | 137 | |
madelectroneng | 0:75defe5eed80 | 138 | //return noise floor setting - refer to datasheet for meaning and range |
madelectroneng | 0:75defe5eed80 | 139 | int getNoiseFloor(); |
madelectroneng | 0:75defe5eed80 | 140 | |
madelectroneng | 0:75defe5eed80 | 141 | //set noise floor setting |
madelectroneng | 0:75defe5eed80 | 142 | int setNoiseFloor(int noisefloor); |
madelectroneng | 0:75defe5eed80 | 143 | |
madelectroneng | 0:75defe5eed80 | 144 | //return spike rejection value - refer to datasheet for meaning and range |
madelectroneng | 0:75defe5eed80 | 145 | int getSpikeRejection(); |
madelectroneng | 0:75defe5eed80 | 146 | |
madelectroneng | 0:75defe5eed80 | 147 | //set spike rejection value |
madelectroneng | 0:75defe5eed80 | 148 | int setSpikeRejection(int srej); |
madelectroneng | 0:75defe5eed80 | 149 | |
madelectroneng | 0:75defe5eed80 | 150 | //return watchdog threshold value - refer to datasheet for meaning and range |
madelectroneng | 0:75defe5eed80 | 151 | int getWatchdogThreshold(); |
madelectroneng | 0:75defe5eed80 | 152 | |
madelectroneng | 0:75defe5eed80 | 153 | //set watchdog threshold value |
madelectroneng | 0:75defe5eed80 | 154 | int setWatchdogThreshold(int wdth); |
madelectroneng | 0:75defe5eed80 | 155 | |
madelectroneng | 0:75defe5eed80 | 156 | //return tune Capacity value |
madelectroneng | 0:75defe5eed80 | 157 | int getTuneCap(); |
madelectroneng | 0:75defe5eed80 | 158 | |
madelectroneng | 0:75defe5eed80 | 159 | //set tune Capacity value |
madelectroneng | 0:75defe5eed80 | 160 | int setTuneCap(int cap); |
madelectroneng | 0:75defe5eed80 | 161 | |
madelectroneng | 0:75defe5eed80 | 162 | //clear internal accumulated lightning statistics |
madelectroneng | 0:75defe5eed80 | 163 | void clearStats(); |
madelectroneng | 0:75defe5eed80 | 164 | |
madelectroneng | 0:75defe5eed80 | 165 | int calibrateRCOs (InterruptIn &intrIn); |
madelectroneng | 0:75defe5eed80 | 166 | |
madelectroneng | 0:75defe5eed80 | 167 | unsigned long tuneAntenna(InterruptIn &intrIn); |
madelectroneng | 0:75defe5eed80 | 168 | unsigned long getEnergy(void); |
madelectroneng | 0:75defe5eed80 | 169 | bool getConfigRegisters(unsigned char *pBuff, unsigned char buffLen); |
madelectroneng | 0:75defe5eed80 | 170 | |
madelectroneng | 0:75defe5eed80 | 171 | |
madelectroneng | 0:75defe5eed80 | 172 | /** Attach a function, lightning interrupt |
madelectroneng | 0:75defe5eed80 | 173 | * @param fptr pointer to a void function, or 0 to set as none |
madelectroneng | 0:75defe5eed80 | 174 | */ |
madelectroneng | 0:75defe5eed80 | 175 | void attach(void (*fptr)(void)) { |
madelectroneng | 0:75defe5eed80 | 176 | // _func.attach(fptr); |
madelectroneng | 0:75defe5eed80 | 177 | } |
madelectroneng | 0:75defe5eed80 | 178 | /** Attach a member function, lightning interrupt |
madelectroneng | 0:75defe5eed80 | 179 | * @param tptr pointer to the object to call the member function on |
madelectroneng | 0:75defe5eed80 | 180 | * @param mptr pointer to the member function to be called |
madelectroneng | 0:75defe5eed80 | 181 | */ |
madelectroneng | 0:75defe5eed80 | 182 | template<typename T> |
madelectroneng | 0:75defe5eed80 | 183 | void attach(T *tptr, void (T::*mptr)(void)) { |
madelectroneng | 0:75defe5eed80 | 184 | _func.attach(tptr, mptr); |
madelectroneng | 0:75defe5eed80 | 185 | } |
madelectroneng | 0:75defe5eed80 | 186 | |
madelectroneng | 0:75defe5eed80 | 187 | |
madelectroneng | 0:75defe5eed80 | 188 | private: |
madelectroneng | 0:75defe5eed80 | 189 | //I2C i2c; |
madelectroneng | 0:75defe5eed80 | 190 | //DigitalOut _irq; |
madelectroneng | 0:75defe5eed80 | 191 | SPI m_Spi; |
madelectroneng | 0:75defe5eed80 | 192 | DigitalOut m_Cs; |
madelectroneng | 0:75defe5eed80 | 193 | //InterruptIn m_Cd; |
madelectroneng | 0:75defe5eed80 | 194 | |
madelectroneng | 0:75defe5eed80 | 195 | int m_CdAssert; |
madelectroneng | 0:75defe5eed80 | 196 | const int m_FREQ; |
madelectroneng | 0:75defe5eed80 | 197 | int _adress; |
madelectroneng | 0:75defe5eed80 | 198 | FunctionPointer _func; |
madelectroneng | 0:75defe5eed80 | 199 | char _rawRegisterRead(char reg); |
madelectroneng | 0:75defe5eed80 | 200 | void _rawRegisterRead(unsigned char reg, unsigned char mask, unsigned char *rxBuff, unsigned char numBytes); |
madelectroneng | 0:75defe5eed80 | 201 | char _SPITransfer2(char high, char low); |
madelectroneng | 0:75defe5eed80 | 202 | char _ffsz(char mask); |
madelectroneng | 0:75defe5eed80 | 203 | |
madelectroneng | 0:75defe5eed80 | 204 | |
madelectroneng | 0:75defe5eed80 | 205 | |
madelectroneng | 0:75defe5eed80 | 206 | |
madelectroneng | 0:75defe5eed80 | 207 | }; |
madelectroneng | 0:75defe5eed80 | 208 | |
madelectroneng | 0:75defe5eed80 | 209 | /* !_AS3935_H_ */ |
madelectroneng | 0:75defe5eed80 | 210 | #endif |