AMS, Franklin Lightning Sensor "AS3935" Library

Franklin Lightning Sensor

雷(落雷)センサー AS3935 用のライブラリです。

Sample

I2C接続

for LPC1114

main.cpp

#include "mbed.h"
#include "AS3935.h"

Serial pc(USBTX, USBRX);
DigitalOut led1(LED1);

AS3935 as(dp5, dp27, dp26); // sda, scl, irq
//I2C i2c(dp5, dp27);
//AS3935 as(i2c, dp26); // i2c, irq

void lightning () {
    int energy, distance;
    as.read(energy, distance);
    pc.printf("Lightning energy=%d distance=%d\r\n", energy, distance);
}

int main() {
    pc.baud(115200);
    pc.printf("*** AS3935\r\n");
    as.init();
    as.attach(&lightning);
    for (;;) {
        led1 = ! led1;
        wait(0.2);
    }
}
Committer:
okini3939
Date:
Mon Apr 13 00:52:04 2015 +0000
Revision:
0:5a6d7a605d26
1st test build;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:5a6d7a605d26 1 /*
okini3939 0:5a6d7a605d26 2 * AMS, Franklin Lightning Sensor "AS3935" Library
okini3939 0:5a6d7a605d26 3 * Copyright (c) 2015 Hiroshi Suga
okini3939 0:5a6d7a605d26 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:5a6d7a605d26 5 */
okini3939 0:5a6d7a605d26 6 // http://ams.com/eng/Products/Lightning-Sensor/Franklin-Lightning-Sensor/AS3935
okini3939 0:5a6d7a605d26 7
okini3939 0:5a6d7a605d26 8 #include "AS3935.h"
okini3939 0:5a6d7a605d26 9
okini3939 0:5a6d7a605d26 10 //#define DBG(...) printf("" __VA_ARGS__)
okini3939 0:5a6d7a605d26 11 #define DBG(...)
okini3939 0:5a6d7a605d26 12
okini3939 0:5a6d7a605d26 13 #define AS3935_ADDR 0x00
okini3939 0:5a6d7a605d26 14
okini3939 0:5a6d7a605d26 15 AS3935::AS3935 (I2C &i2c, PinName irq) : _i2c(i2c), _irq(irq) {
okini3939 0:5a6d7a605d26 16 _irq.mode(PullUp);
okini3939 0:5a6d7a605d26 17 _mode = 0;
okini3939 0:5a6d7a605d26 18 _type = 0;
okini3939 0:5a6d7a605d26 19 }
okini3939 0:5a6d7a605d26 20
okini3939 0:5a6d7a605d26 21 AS3935::AS3935 (PinName sda, PinName scl, PinName irq) : _i2c(sda, scl), _irq(irq) {
okini3939 0:5a6d7a605d26 22 _irq.mode(PullUp);
okini3939 0:5a6d7a605d26 23 _mode = 0;
okini3939 0:5a6d7a605d26 24 _type = 0;
okini3939 0:5a6d7a605d26 25 }
okini3939 0:5a6d7a605d26 26
okini3939 0:5a6d7a605d26 27 void AS3935::init () {
okini3939 0:5a6d7a605d26 28 char cmd[2];
okini3939 0:5a6d7a605d26 29
okini3939 0:5a6d7a605d26 30 cmd[0] = 0x3c;
okini3939 0:5a6d7a605d26 31 cmd[1] = 0x96; // PRESET_DEFAULT
okini3939 0:5a6d7a605d26 32 _i2c.write(AS3935_ADDR, cmd, 2);
okini3939 0:5a6d7a605d26 33 cmd[0] = 0x3d;
okini3939 0:5a6d7a605d26 34 cmd[1] = 0x96; // CALIB_RCO
okini3939 0:5a6d7a605d26 35 _i2c.write(AS3935_ADDR, cmd, 2);
okini3939 0:5a6d7a605d26 36 cmd[0] = 0x00;
okini3939 0:5a6d7a605d26 37 cmd[1] = (0x12<<1); // AFE_GB=12(Indoor)
okini3939 0:5a6d7a605d26 38 _i2c.write(AS3935_ADDR, cmd, 2);
okini3939 0:5a6d7a605d26 39 cmd[0] = 0x01;
okini3939 0:5a6d7a605d26 40 cmd[1] = (0x02<<4)|(0x02<<0); // NF_LEV, WDTH
okini3939 0:5a6d7a605d26 41 _i2c.write(AS3935_ADDR, cmd, 2);
okini3939 0:5a6d7a605d26 42 cmd[0] = 0x03;
okini3939 0:5a6d7a605d26 43 cmd[1] = 0x00; // LCO_FDIV = 1/16
okini3939 0:5a6d7a605d26 44 _i2c.write(AS3935_ADDR, cmd, 2);
okini3939 0:5a6d7a605d26 45
okini3939 0:5a6d7a605d26 46 calib_lco();
okini3939 0:5a6d7a605d26 47
okini3939 0:5a6d7a605d26 48 _irq.fall(this, &AS3935::isr_lightning);
okini3939 0:5a6d7a605d26 49 }
okini3939 0:5a6d7a605d26 50
okini3939 0:5a6d7a605d26 51 // Antenna Tuning (500kHz)
okini3939 0:5a6d7a605d26 52 void AS3935::calib_lco () {
okini3939 0:5a6d7a605d26 53 int i, n, m = 10000, r = 0;
okini3939 0:5a6d7a605d26 54 char cmd[2];
okini3939 0:5a6d7a605d26 55 Timer t;
okini3939 0:5a6d7a605d26 56
okini3939 0:5a6d7a605d26 57 _mode = 0;
okini3939 0:5a6d7a605d26 58 _irq.fall(this, &AS3935::isr_freq);
okini3939 0:5a6d7a605d26 59 for (i = 0; i < 0x10; i ++) {
okini3939 0:5a6d7a605d26 60 cmd[0] = 0x08;
okini3939 0:5a6d7a605d26 61 cmd[1] = 0x80 | i;
okini3939 0:5a6d7a605d26 62 _i2c.write(AS3935_ADDR, cmd, 2);
okini3939 0:5a6d7a605d26 63 wait_ms(10);
okini3939 0:5a6d7a605d26 64 t.reset();
okini3939 0:5a6d7a605d26 65 t.start();
okini3939 0:5a6d7a605d26 66 _freq = 0;
okini3939 0:5a6d7a605d26 67 _mode = 1;
okini3939 0:5a6d7a605d26 68 while (t.read_ms() < 100);
okini3939 0:5a6d7a605d26 69 _mode = 0;
okini3939 0:5a6d7a605d26 70 n = abs(_freq - 3125);
okini3939 0:5a6d7a605d26 71 if (m > n) {
okini3939 0:5a6d7a605d26 72 r = i;
okini3939 0:5a6d7a605d26 73 } else {
okini3939 0:5a6d7a605d26 74 break;
okini3939 0:5a6d7a605d26 75 }
okini3939 0:5a6d7a605d26 76 m = n;
okini3939 0:5a6d7a605d26 77 }
okini3939 0:5a6d7a605d26 78 _irq.fall(NULL);
okini3939 0:5a6d7a605d26 79 t.stop();
okini3939 0:5a6d7a605d26 80 cmd[0] = 0x08;
okini3939 0:5a6d7a605d26 81 cmd[1] = r;
okini3939 0:5a6d7a605d26 82 _i2c.write(AS3935_ADDR, cmd, 2);
okini3939 0:5a6d7a605d26 83 DBG("- init %d %d\r\n", r, _freq * 16 * 10);
okini3939 0:5a6d7a605d26 84 }
okini3939 0:5a6d7a605d26 85
okini3939 0:5a6d7a605d26 86 void AS3935::read (int &energy, int &distance) {
okini3939 0:5a6d7a605d26 87 char cmd[4];
okini3939 0:5a6d7a605d26 88
okini3939 0:5a6d7a605d26 89 cmd[0] = 0x04;
okini3939 0:5a6d7a605d26 90 _i2c.write(AS3935_ADDR, cmd, 1, true);
okini3939 0:5a6d7a605d26 91 _i2c.read(AS3935_ADDR, cmd, 4);
okini3939 0:5a6d7a605d26 92 energy = ((cmd[2] & 0x1f) << 16) | (cmd[1] << 8) | cmd[0];
okini3939 0:5a6d7a605d26 93 distance = cmd[3] & 0x3f;
okini3939 0:5a6d7a605d26 94 }
okini3939 0:5a6d7a605d26 95
okini3939 0:5a6d7a605d26 96 void AS3935::isr_freq () {
okini3939 0:5a6d7a605d26 97 if (_mode == 1) {
okini3939 0:5a6d7a605d26 98 _freq ++;
okini3939 0:5a6d7a605d26 99 }
okini3939 0:5a6d7a605d26 100 }
okini3939 0:5a6d7a605d26 101
okini3939 0:5a6d7a605d26 102 void AS3935::isr_lightning () {
okini3939 0:5a6d7a605d26 103 char cmd[2];
okini3939 0:5a6d7a605d26 104
okini3939 0:5a6d7a605d26 105 cmd[0] = 0x03;
okini3939 0:5a6d7a605d26 106 _i2c.write(AS3935_ADDR, cmd, 1, true);
okini3939 0:5a6d7a605d26 107 _i2c.read(AS3935_ADDR, cmd, 1);
okini3939 0:5a6d7a605d26 108 DBG("- irq %02x\r\n", cmd[0]);
okini3939 0:5a6d7a605d26 109 _type = cmd[0] & 0x0f;
okini3939 0:5a6d7a605d26 110 switch (_type) {
okini3939 0:5a6d7a605d26 111 case 0x01: // Noise level too high
okini3939 0:5a6d7a605d26 112 break;
okini3939 0:5a6d7a605d26 113 case 0x04: // Disturber detected
okini3939 0:5a6d7a605d26 114 break;
okini3939 0:5a6d7a605d26 115 case 0x08: // Lightning interrupt
okini3939 0:5a6d7a605d26 116 _func.call();
okini3939 0:5a6d7a605d26 117 break;
okini3939 0:5a6d7a605d26 118 }
okini3939 0:5a6d7a605d26 119 }