pull/1/head
ouki-wang 6 years ago
parent 566461b9a1
commit 81571da1eb
  1. 11
      DFRobot_AS3935_I2C.cpp
  2. 12
      DFRobot_AS3935_I2C.h
  3. 2
      Lib_I2C.cpp
  4. 0
      Lib_I2C.h
  5. 111
      examples/DFRobot_AS3935_lightning_I2c/DFRobot_AS3935_lightning_I2c.ino
  6. 117
      examples/DFRobot_AS3935_lightning_sensor/DFRobot_AS3935_lightning_sensor.ino

@ -1,18 +1,13 @@
#include "DFRobot_AS3935_I2c.h" #include "DFRobot_AS3935_I2c.h"
DF_AS3935_I2C::DF_AS3935_I2C(uint8_t IRQx, uint8_t SIx, uint8_t DEVADDx) DF_AS3935_I2C::DF_AS3935_I2C(uint8_t IRQx, uint8_t DEVADDx)
{ {
_devadd = DEVADDx; _devadd = DEVADDx;
_si = SIx;
_irq = IRQx; _irq = IRQx;
// initalize the chip select pins // initalize the IRQ pins
pinMode(_si, OUTPUT);
pinMode(_irq, INPUT); pinMode(_irq, INPUT);
// set output pin initical condition
digitalWrite(_si, HIGH); // set pin high for I2C mode
} }
void DF_AS3935_I2C::AS3935_SetI2CAddress(uint8_t DEVADDx) void DF_AS3935_I2C::AS3935_SetI2CAddress(uint8_t DEVADDx)
@ -310,7 +305,7 @@ void DF_AS3935_I2C::AS3935_SetLCO_FDIV(uint8_t fdiv)
// default value: 00 // default value: 00
// set 0, 1, 2 or 3 for ratios of 16, 32, 64 and 128, respectively. // set 0, 1, 2 or 3 for ratios of 16, 32, 64 and 128, respectively.
// See pg 23, Table 20 for more info. // See pg 23, Table 20 for more info.
_sing_reg_write(0x03, 0xC0, ((fdiv & 0x03) << 5)); _sing_reg_write(0x03, 0xC0, ((fdiv & 0x03) << 6));
} }
void DF_AS3935_I2C::AS3935_PrintAllRegs(void) void DF_AS3935_I2C::AS3935_PrintAllRegs(void)

@ -5,17 +5,17 @@
#include "avr/pgmspace.h" #include "avr/pgmspace.h"
#include "util/delay.h" #include "util/delay.h"
#include "stdlib.h" #include "stdlib.h"
#include "I2C.h" #include "Lib_I2C.h"
// I2c address // I2C address
#define AS3935_ADD3 0x03 // x03 - A0->high A1->high #define AS3935_ADD1 0x01 // A0=high, A1=low
#define AS3935_ADD2 0x02 // x02 - A0->low A1->high #define AS3935_ADD3 0x03 // A0=high, A1=high
#define AS3935_ADD1 0x01 // x01 - A0->high A1->low #define AS3935_ADD2 0x02 // A0=low, A1=high
class DF_AS3935_I2C class DF_AS3935_I2C
{ {
public: public:
DF_AS3935_I2C(uint8_t IRQx, uint8_t SIx, uint8_t DEVADDx); DF_AS3935_I2C(uint8_t IRQx, uint8_t DEVADDx);
/*! Set i2c address */ /*! Set i2c address */
void AS3935_SetI2CAddress(uint8_t DEVADDx); void AS3935_SetI2CAddress(uint8_t DEVADDx);
/*! Manual calibration */ /*! Manual calibration */

@ -60,7 +60,7 @@
#endif #endif
#include <inttypes.h> #include <inttypes.h>
#include "I2C.h" #include "Lib_I2C.h"
uint8_t I2C::bytesAvailable = 0; uint8_t I2C::bytesAvailable = 0;
uint8_t I2C::bufferIndex = 0; uint8_t I2C::bufferIndex = 0;

@ -1,111 +0,0 @@
/*!
* file DFRobot_AS3935_lightning_I2c.ino
*
* On The Lightning Sensor
* This sensor can detect lightning and display the distance and intensity of the lightning without the
* disturbance of electric arc and noise.It can be set as indoor or outdoor mode.
* The module has three I2C, the addresses are:
* 0x03 A0-High A1-High
* 0x02 A0-Low A1-High
* 0x01 A0-High A1-Low
*
* Copyright [DFRobot](http://www.dfrobot.com), 2018
* Copyright GNU Lesser General Public License
*
* version V0.1
* date 2018-9-6
*/
#include "I2C.h"
#include "DFRobot_AS3935_I2C.h"
volatile int8_t AS3935_ISR_Trig = 0;
#define SI_PIN 9
#define IRQ_PIN 2
#define AS3935_CAPACITANCE 72
#define AS3935_INDOORS 0
#define AS3935_OUTDOORS 1
#define AS3935_DIST_DIS 0
#define AS3935_DIST_EN 1
void AS3935_ISR();
DF_AS3935_I2C lightning0((uint8_t)IRQ_PIN, (uint8_t)SI_PIN, (uint8_t)AS3935_ADD3);
void setup()
{
Serial.begin(115200);
Serial.println("Playing With DFRobot: AS3935 Lightning Sensor");
Serial.println("beginning boot procedure....");
// Setup for the the I2C library: (enable pullups, set speed to 400kHz)
I2c.begin();
I2c.pullup(true);
I2c.setSpeed(1);
delay(2);
//lightning0.AS3935_I2CAddress(AS3935_ADD1); // x01 - A0->high A1->low
//lightning0.AS3935_I2CAddress(AS3935_ADD2); // x02 - A0->low A1->high
//lightning0.AS3935_I2CAddress(AS3935_ADD3); // x03 - A0->high A1->high
lightning0.AS3935_SetI2CAddress(AS3935_ADD3);
// Set registers to default
lightning0.AS3935_DefInit();
// Now update sensor cal for your application and power up chip
lightning0.AS3935_ManualCal(AS3935_CAPACITANCE, AS3935_INDOORS, AS3935_DIST_EN);
// Enable interrupt (hook IRQ pin to Arduino Uno/Mega interrupt input: 0 -> pin 2, 1 -> pin 3 )
attachInterrupt(0, AS3935_ISR, RISING);
// For debug, view register data
lightning0.AS3935_PrintAllRegs();
// Clear trigger
AS3935_ISR_Trig = 0;
}
void loop()
{
// It does nothing until an interrupt is detected on the IRQ pin.
while(0 == AS3935_ISR_Trig){}
delay(5);
// Reset interrupt flag
AS3935_ISR_Trig = 0;
// Now get interrupt source
uint8_t int_src = lightning0.AS3935_GetInterruptSrc();
if(1 == int_src)
{
// Get rid of non-distance data
uint8_t lightning_dist_km = lightning0.AS3935_GetLightningDistKm();
Serial.print("发生闪电啦! 闪电发生距离: ");
Serial.print(lightning_dist_km);
Serial.println(" km");
// Get lightning energy intensity
uint32_t lightning_energy_val = lightning0.AS3935_GetStrikeEnergyRaw();
Serial.print("雷电强度:");
Serial.print(lightning_energy_val);
Serial.println("");
}
else if(2 == int_src)
{
Serial.println("发现干扰源");
}
else if(3 == int_src)
{
Serial.println("噪音强度过高");
}
lightning0.AS3935_PrintAllRegs();
Serial.println("");
}
// This is irq handler for AS3935 interrupts, has to return void and take no arguments
// always make code in interrupt handlers fast and short
void AS3935_ISR()
{
AS3935_ISR_Trig = 1;
}

@ -0,0 +1,117 @@
/*!
file DFRobot_AS3935_lightning_I2c.ino
SEN0290 Lightning Sensor
This sensor can detect lightning and display the distance and intensity of the lightning within 40 km
It can be set as indoor or outdoor mode.
The module has three I2C, these addresses are:
AS3935_ADD1 0x01 A0 = High A1 = Low
AS3935_ADD3 0x03 A0 = High A1 = High
AS3935_ADD2 0x02 A0 = Low A1 = High
Copyright [DFRobot](http://www.dfrobot.com), 2018
Copyright GNU Lesser General Public License
version V0.2
date 2018-10-08
*/
#include "Lib_I2C.h"
#include "DFRobot_AS3935_I2C.h"
volatile int8_t AS3935_ISR_Trig = 0;
#define IRQ_PIN 2
// Antenna tuning capcitance (must be integer multiple of 8, 8 - 120 pf)
#define AS3935_CAPACITANCE 96
// Indoor/outdoor mode selection
#define AS3935_INDOORS 0
#define AS3935_OUTDOORS 1
#define AS3935_MODE AS3935_INDOORS
// Enable/disable disturber detection
#define AS3935_DIST_DIS 0
#define AS3935_DIST_EN 1
#define AS3935_DIST AS3935_DIST_EN
// I2C address
#define AS3935_I2C_ADDR AS3935_ADD3
void AS3935_ISR();
DF_AS3935_I2C lightning0((uint8_t)IRQ_PIN, (uint8_t)AS3935_I2C_ADDR);
void setup()
{
Serial.begin(115200);
Serial.println("DFRobot AS3935 lightning sensor begin!");
// Setup for the the I2C library: (enable pullups, set speed to 400kHz)
I2c.begin();
I2c.pullup(true);
I2c.setSpeed(1);
delay(2);
// Set registers to default
lightning0.AS3935_DefInit();
// Configure sensor
lightning0.AS3935_ManualCal(AS3935_CAPACITANCE, AS3935_MODE, AS3935_DIST);
// Enable interrupt (connect IRQ pin IRQ_PIN: 2, default)
// Connect the IRQ and GND pin to the oscilloscope.
// uncomment the following sentences to fine tune the antenna for better performance.
// This will dispaly the antenna's resonance frequency/16 on IRQ pin (The resonance frequency will be divided by 16 on this pin)
// Tuning AS3935_CAPACITANCE to make the frequency within 500/16 kHz ± 3.5%
// lightning0.AS3935_SetLCO_FDIV(0);
// lightning0.AS3935_SetIRQ_Output_Source(3);
attachInterrupt(0, AS3935_ISR, RISING);
}
void loop()
{
// It does nothing until an interrupt is detected on the IRQ pin.
while (AS3935_ISR_Trig == 0) {}
delay(5);
// Reset interrupt flag
AS3935_ISR_Trig = 0;
// Get interrupt source
uint8_t int_src = lightning0.AS3935_GetInterruptSrc();
if (int_src == 1)
{
// Get rid of non-distance data
uint8_t lightning_dist_km = lightning0.AS3935_GetLightningDistKm();
Serial.println("Lightning occurs!");
Serial.print("Distance: ");
Serial.print(lightning_dist_km);
Serial.println(" km");
// Get lightning energy intensity
uint32_t lightning_energy_val = lightning0.AS3935_GetStrikeEnergyRaw();
Serial.print("Intensity: ");
Serial.print(lightning_energy_val);
Serial.println("");
}
else if (int_src == 2)
{
Serial.println("Disturber discovered!");
}
else if (int_src == 3)
{
Serial.println("Noise level too high!");
}
}
//IRQ handler for AS3935 interrupts
void AS3935_ISR()
{
AS3935_ISR_Trig = 1;
}
Loading…
Cancel
Save