AMS, Franklin Lightning Sensor "AS3935" Library

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers AS3935.cpp Source File

AS3935.cpp

00001 /*
00002  * AMS, Franklin Lightning Sensor "AS3935" Library
00003  * Copyright (c) 2015 Hiroshi Suga
00004  * Released under the MIT License: http://mbed.org/license/mit
00005  */
00006 // http://ams.com/eng/Products/Lightning-Sensor/Franklin-Lightning-Sensor/AS3935
00007 
00008 #include "AS3935.h"
00009 
00010 //#define DBG(...) printf("" __VA_ARGS__) 
00011 #define DBG(...)
00012 
00013 #define AS3935_ADDR 0x00
00014 
00015 AS3935::AS3935 (I2C &i2c, PinName irq) : _i2c(i2c), _irq(irq) {
00016     _irq.mode(PullUp);
00017     _mode = 0;
00018     _type = 0;
00019 }
00020 
00021 AS3935::AS3935 (PinName sda, PinName scl, PinName irq) : _i2c(sda, scl), _irq(irq) {
00022     _irq.mode(PullUp);
00023     _mode = 0;
00024     _type = 0;
00025 }
00026 
00027 void AS3935::init () {
00028     char cmd[2];
00029 
00030     cmd[0] = 0x3c;
00031     cmd[1] = 0x96; // PRESET_DEFAULT
00032     _i2c.write(AS3935_ADDR, cmd, 2);
00033     cmd[0] = 0x3d;
00034     cmd[1] = 0x96; // CALIB_RCO
00035     _i2c.write(AS3935_ADDR, cmd, 2);
00036     cmd[0] = 0x00;
00037     cmd[1] = (0x12<<1); // AFE_GB=12(Indoor)
00038     _i2c.write(AS3935_ADDR, cmd, 2);
00039     cmd[0] = 0x01;
00040     cmd[1] = (0x02<<4)|(0x02<<0); // NF_LEV, WDTH
00041     _i2c.write(AS3935_ADDR, cmd, 2);
00042     cmd[0] = 0x03;
00043     cmd[1] = 0x00; // LCO_FDIV = 1/16
00044     _i2c.write(AS3935_ADDR, cmd, 2);
00045 
00046     calib_lco();
00047 
00048     _irq.fall(this, &AS3935::isr_lightning);
00049 }
00050 
00051 // Antenna Tuning (500kHz)
00052 void AS3935::calib_lco () {
00053     int i, n, m = 10000, r = 0;
00054     char cmd[2];
00055     Timer t;
00056 
00057     _mode = 0;
00058     _irq.fall(this, &AS3935::isr_freq);
00059     for (i = 0; i < 0x10; i ++) {
00060         cmd[0] = 0x08;
00061         cmd[1] = 0x80 | i;
00062         _i2c.write(AS3935_ADDR, cmd, 2);
00063         wait_ms(10);
00064         t.reset();
00065         t.start();
00066         _freq = 0;
00067         _mode = 1;
00068         while (t.read_ms() < 100);
00069         _mode = 0;
00070         n = abs(_freq - 3125);
00071         if (m > n) {
00072             r = i;
00073         } else {
00074             break;
00075         }
00076         m = n;
00077     }
00078     _irq.fall(NULL);
00079     t.stop();
00080     cmd[0] = 0x08;
00081     cmd[1] = r;
00082     _i2c.write(AS3935_ADDR, cmd, 2);
00083     DBG("- init %d %d\r\n", r, _freq * 16 * 10);
00084 }
00085 
00086 void AS3935::read (int &energy, int &distance) {
00087     char cmd[4];
00088 
00089     cmd[0] = 0x04;
00090     _i2c.write(AS3935_ADDR, cmd, 1, true);
00091     _i2c.read(AS3935_ADDR, cmd, 4);
00092     energy = ((cmd[2] & 0x1f) << 16) | (cmd[1] << 8) | cmd[0];
00093     distance = cmd[3] & 0x3f;
00094 }
00095 
00096 void AS3935::isr_freq () {
00097     if (_mode == 1) {
00098         _freq ++;
00099     }
00100 }
00101 
00102 void AS3935::isr_lightning () {
00103     char cmd[2];
00104 
00105     cmd[0] = 0x03;
00106     _i2c.write(AS3935_ADDR, cmd, 1, true);
00107     _i2c.read(AS3935_ADDR, cmd, 1);
00108     DBG("- irq %02x\r\n", cmd[0]);
00109     _type = cmd[0] & 0x0f;
00110     switch (_type) {
00111     case 0x01: // Noise level too high
00112         break;
00113     case 0x04: // Disturber detected
00114         break;
00115     case 0x08: // Lightning interrupt
00116         _func.call();
00117         break;
00118     }
00119 }