Lightning detector AS3935 library from arduino ported to mbed. Hardware I2C

Dependents:   BLE_Lightning_sensor

/media/uploads/casper/mod-1016v4_600.jpg

include the mbed library with this snippet

#include "mbed.h"
#include "AS3935/AS3935.hpp"

AS3935 Lightning(p28,p27,0x06); //détecteur d'orages relié en I2C, adresse I2C 0x06;
InterruptIn IntLightning(p29); //IRQ AS3935

///////////////////////////////////////////////////////////////////
// Détection d'orages, Fonction d'interruption sur p29
//////////////////////////////////////////////////////////////////
void DetectLightning()
{
    char OriginInt;
    inter = !inter;
    wait_ms(2); //on attend 2ms préconisation constructeur
    OriginInt = Lightning.interruptSource();
    if (OriginInt == 1) { //le bruit environnant est trop élevé
        pc.printf(" Bruit trop élevé\r\n");
        }
    if (OriginInt == 4) { //détection perturbation électromagnétique
        pc.printf(" Perturbation électromagnétique\r\n");
        }
    if (OriginInt == 8) { //on a détecté un éclair
        pc.printf(" Détection d'un éclair\r\n");
        }
}

int main() {
    //initialisations
    Lightning.reset();
    Lightning.setTuneCap(5); //réglage capacité d'accord à 500kHz
    Lightning.powerUp();
    Lightning.setIndoors(); //réglage du gain d'amplification pour l'intérieur
    IntLightning.rise(&DetectLightning);
    while(1) {
    }
Committer:
casper
Date:
Sat Apr 05 23:24:41 2014 +0000
Revision:
0:346c723cac97
First release

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
casper 0:346c723cac97 21 #include "AS3935.hpp"
casper 0:346c723cac97 22
casper 0:346c723cac97 23 AS3935::AS3935(PinName sda, PinName scl, int adresse): i2c(sda, scl), _adress(adresse) {
casper 0:346c723cac97 24
casper 0:346c723cac97 25 wait_ms(11);
casper 0:346c723cac97 26 }
casper 0:346c723cac97 27
casper 0:346c723cac97 28 //~AS3935(){
casper 0:346c723cac97 29
casper 0:346c723cac97 30 //}
casper 0:346c723cac97 31
casper 0:346c723cac97 32 char AS3935::_rawRegisterRead(char reg)
casper 0:346c723cac97 33 {
casper 0:346c723cac97 34 char data;
casper 0:346c723cac97 35 i2c.write( _adress, &reg, 1, true);
casper 0:346c723cac97 36 i2c.read(_adress, &data, 1);
casper 0:346c723cac97 37 return data;
casper 0:346c723cac97 38
casper 0:346c723cac97 39 }
casper 0:346c723cac97 40
casper 0:346c723cac97 41 char AS3935::_ffsz(char mask)
casper 0:346c723cac97 42 {
casper 0:346c723cac97 43 char i = 0;
casper 0:346c723cac97 44 //char temp;
casper 0:346c723cac97 45
casper 0:346c723cac97 46 while(!(mask & 1)) {
casper 0:346c723cac97 47 //if (!(mask & 1)) {
casper 0:346c723cac97 48 mask >>= 1;
casper 0:346c723cac97 49 i++;
casper 0:346c723cac97 50 //}
casper 0:346c723cac97 51 }
casper 0:346c723cac97 52 //if (mask){
casper 0:346c723cac97 53 // for (i = 1; ~mask & 1 ; i++) {
casper 0:346c723cac97 54 // mask >>= 1;
casper 0:346c723cac97 55 // }
casper 0:346c723cac97 56 // }
casper 0:346c723cac97 57 return i;
casper 0:346c723cac97 58 }
casper 0:346c723cac97 59
casper 0:346c723cac97 60 void AS3935::registerWrite(char reg, char mask, char data)
casper 0:346c723cac97 61 {
casper 0:346c723cac97 62 char cmd[2];
casper 0:346c723cac97 63 char regval;
casper 0:346c723cac97 64 regval = _rawRegisterRead(reg);
casper 0:346c723cac97 65 regval &= ~(mask);
casper 0:346c723cac97 66 //if (mask){
casper 0:346c723cac97 67 regval |= (data << (_ffsz(mask)));
casper 0:346c723cac97 68 // }
casper 0:346c723cac97 69 //else {
casper 0:346c723cac97 70 // regval |= data;
casper 0:346c723cac97 71 // }
casper 0:346c723cac97 72 cmd[0] = reg;
casper 0:346c723cac97 73 cmd[1] = regval;
casper 0:346c723cac97 74 i2c.write( _adress, cmd, 2);
casper 0:346c723cac97 75
casper 0:346c723cac97 76 }
casper 0:346c723cac97 77
casper 0:346c723cac97 78 char AS3935::registerRead(char reg, char mask)
casper 0:346c723cac97 79 {
casper 0:346c723cac97 80 char regval;
casper 0:346c723cac97 81 regval = _rawRegisterRead(reg);
casper 0:346c723cac97 82 regval = regval & mask;
casper 0:346c723cac97 83 //if (mask){
casper 0:346c723cac97 84 regval >>= (_ffsz(mask));
casper 0:346c723cac97 85 // }
casper 0:346c723cac97 86 return regval;
casper 0:346c723cac97 87 }
casper 0:346c723cac97 88
casper 0:346c723cac97 89 void AS3935::reset()
casper 0:346c723cac97 90 {
casper 0:346c723cac97 91 char cmd[2];
casper 0:346c723cac97 92 cmd[0] = 0x3C;
casper 0:346c723cac97 93 cmd[1] = 0x96;
casper 0:346c723cac97 94 i2c.write( _adress, cmd, 2);
casper 0:346c723cac97 95 wait_ms(2);
casper 0:346c723cac97 96 }
casper 0:346c723cac97 97
casper 0:346c723cac97 98
casper 0:346c723cac97 99
casper 0:346c723cac97 100 void AS3935::powerDown()
casper 0:346c723cac97 101 {
casper 0:346c723cac97 102 registerWrite(AS3935_PWD,1);
casper 0:346c723cac97 103 }
casper 0:346c723cac97 104
casper 0:346c723cac97 105 void AS3935::powerUp()
casper 0:346c723cac97 106 {
casper 0:346c723cac97 107 char cmd[2];
casper 0:346c723cac97 108 cmd[0] = 0x3D;
casper 0:346c723cac97 109 cmd[1] = 0x96;
casper 0:346c723cac97 110 registerWrite(AS3935_PWD,0);
casper 0:346c723cac97 111 i2c.write( _adress, cmd, 2);
casper 0:346c723cac97 112 wait_ms(3);
casper 0:346c723cac97 113 registerWrite(AS3935_DISP_TRCO,1);
casper 0:346c723cac97 114 wait_ms(2);
casper 0:346c723cac97 115 registerWrite(AS3935_DISP_TRCO,0);
casper 0:346c723cac97 116 }
casper 0:346c723cac97 117
casper 0:346c723cac97 118 int AS3935::interruptSource()
casper 0:346c723cac97 119 {
casper 0:346c723cac97 120 return registerRead(AS3935_INT);
casper 0:346c723cac97 121 }
casper 0:346c723cac97 122
casper 0:346c723cac97 123 void AS3935::disableDisturbers()
casper 0:346c723cac97 124 {
casper 0:346c723cac97 125 registerWrite(AS3935_MASK_DIST,1);
casper 0:346c723cac97 126 }
casper 0:346c723cac97 127
casper 0:346c723cac97 128 void AS3935::enableDisturbers()
casper 0:346c723cac97 129 {
casper 0:346c723cac97 130 registerWrite(AS3935_MASK_DIST,0);
casper 0:346c723cac97 131 }
casper 0:346c723cac97 132
casper 0:346c723cac97 133 int AS3935::getMinimumLightnings()
casper 0:346c723cac97 134 {
casper 0:346c723cac97 135 return registerRead(AS3935_MIN_NUM_LIGH);
casper 0:346c723cac97 136 }
casper 0:346c723cac97 137
casper 0:346c723cac97 138 int AS3935::setMinimumLightnings(int minlightning)
casper 0:346c723cac97 139 {
casper 0:346c723cac97 140 registerWrite(AS3935_MIN_NUM_LIGH,minlightning);
casper 0:346c723cac97 141 return getMinimumLightnings();
casper 0:346c723cac97 142 }
casper 0:346c723cac97 143
casper 0:346c723cac97 144 int AS3935::lightningDistanceKm()
casper 0:346c723cac97 145 {
casper 0:346c723cac97 146 return registerRead(AS3935_DISTANCE);
casper 0:346c723cac97 147 }
casper 0:346c723cac97 148
casper 0:346c723cac97 149 void AS3935::setIndoors()
casper 0:346c723cac97 150 {
casper 0:346c723cac97 151 registerWrite(AS3935_AFE_GB,AS3935_AFE_INDOOR);
casper 0:346c723cac97 152 }
casper 0:346c723cac97 153
casper 0:346c723cac97 154 void AS3935::setOutdoors()
casper 0:346c723cac97 155 {
casper 0:346c723cac97 156 registerWrite(AS3935_AFE_GB,AS3935_AFE_OUTDOOR);
casper 0:346c723cac97 157 }
casper 0:346c723cac97 158
casper 0:346c723cac97 159 int AS3935::getNoiseFloor()
casper 0:346c723cac97 160 {
casper 0:346c723cac97 161 return registerRead(AS3935_NF_LEV);
casper 0:346c723cac97 162 }
casper 0:346c723cac97 163
casper 0:346c723cac97 164 int AS3935::setNoiseFloor(int noisefloor)
casper 0:346c723cac97 165 {
casper 0:346c723cac97 166 registerWrite(AS3935_NF_LEV,noisefloor);
casper 0:346c723cac97 167 return getNoiseFloor();
casper 0:346c723cac97 168 }
casper 0:346c723cac97 169
casper 0:346c723cac97 170 int AS3935::getSpikeRejection()
casper 0:346c723cac97 171 {
casper 0:346c723cac97 172 return registerRead(AS3935_SREJ);
casper 0:346c723cac97 173 }
casper 0:346c723cac97 174
casper 0:346c723cac97 175 int AS3935::setSpikeRejection(int srej)
casper 0:346c723cac97 176 {
casper 0:346c723cac97 177 registerWrite(AS3935_SREJ, srej);
casper 0:346c723cac97 178 return getSpikeRejection();
casper 0:346c723cac97 179 }
casper 0:346c723cac97 180
casper 0:346c723cac97 181 int AS3935::getWatchdogThreshold()
casper 0:346c723cac97 182 {
casper 0:346c723cac97 183 return registerRead(AS3935_WDTH);
casper 0:346c723cac97 184 }
casper 0:346c723cac97 185
casper 0:346c723cac97 186 int AS3935::setWatchdogThreshold(int wdth)
casper 0:346c723cac97 187 {
casper 0:346c723cac97 188 registerWrite(AS3935_WDTH,wdth);
casper 0:346c723cac97 189 return getWatchdogThreshold();
casper 0:346c723cac97 190 }
casper 0:346c723cac97 191
casper 0:346c723cac97 192 int AS3935::getTuneCap()
casper 0:346c723cac97 193 {
casper 0:346c723cac97 194 return registerRead(AS3935_TUN_CAP);
casper 0:346c723cac97 195 }
casper 0:346c723cac97 196
casper 0:346c723cac97 197 int AS3935::setTuneCap(int cap)
casper 0:346c723cac97 198 {
casper 0:346c723cac97 199 registerWrite(AS3935_TUN_CAP,cap);
casper 0:346c723cac97 200 return getTuneCap();
casper 0:346c723cac97 201 }
casper 0:346c723cac97 202
casper 0:346c723cac97 203 void AS3935::clearStats()
casper 0:346c723cac97 204 {
casper 0:346c723cac97 205 registerWrite(AS3935_CL_STAT,1);
casper 0:346c723cac97 206 registerWrite(AS3935_CL_STAT,0);
casper 0:346c723cac97 207 registerWrite(AS3935_CL_STAT,1);
casper 0:346c723cac97 208 }