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); } }
AS3935.cpp@0:5a6d7a605d26, 2015-04-13 (annotated)
- Committer:
- okini3939
- Date:
- Mon Apr 13 00:52:04 2015 +0000
- Revision:
- 0:5a6d7a605d26
1st test build;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |