parent
c82ffb2b34
commit
ee688f17ce
@ -1,432 +1,388 @@ |
|||||||
|
/*!
|
||||||
|
* @file DFRobot_AS3935_I2C.h |
||||||
|
* @brief This is a library for AS3935_I2C from DFRobot |
||||||
|
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
|
||||||
|
* @license The MIT License (MIT) |
||||||
|
* @author [TangJie](jie.tang@dfrobot.com) |
||||||
|
* @version V1.0.2 |
||||||
|
* @date 2019-09-28 |
||||||
|
* @url https://github.com/DFRobor/DFRobot_AS3935
|
||||||
|
*/ |
||||||
#include "DFRobot_AS3935_I2C.h" |
#include "DFRobot_AS3935_I2C.h" |
||||||
|
|
||||||
DFRobot_AS3935_I2C::DFRobot_AS3935_I2C(uint8_t irqx, uint8_t devAddx) |
DFRobot_AS3935_I2C::DFRobot_AS3935_I2C(uint8_t irqx, uint8_t devAddx) |
||||||
{ |
{ |
||||||
devAdd = devAddx; |
devAdd = devAddx; |
||||||
irq = irqx; |
irq = irqx; |
||||||
// initalize the IRQ pins
|
// initalize the IRQ pins
|
||||||
pinMode(irq, INPUT); |
pinMode(irq, INPUT); |
||||||
} |
} |
||||||
|
|
||||||
DFRobot_AS3935_I2C::DFRobot_AS3935_I2C(uint8_t irqx) |
DFRobot_AS3935_I2C::DFRobot_AS3935_I2C(uint8_t irqx) |
||||||
{ |
{ |
||||||
irq = irqx; |
irq = irqx; |
||||||
// initalize the IRQ pins
|
pinMode(irq, INPUT); |
||||||
// pinMode(irq, OUTPUT);
|
|
||||||
// digitalWrite(irq,1);
|
|
||||||
pinMode(irq, INPUT); |
|
||||||
|
|
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::setI2CAddress(uint8_t devAddx) |
void DFRobot_AS3935_I2C::setI2CAddress(uint8_t devAddx) |
||||||
{ |
{ |
||||||
if (devAddx == AS3935_ADD1) |
if (devAddx == AS3935_ADD1){ |
||||||
{ |
devAdd = devAddx; |
||||||
|
}else if (devAddx == AS3935_ADD2){ |
||||||
devAdd = devAddx; |
devAdd = devAddx; |
||||||
} |
}else{ |
||||||
else if (devAddx == AS3935_ADD2) |
devAdd = AS3935_ADD3; |
||||||
{ |
} |
||||||
devAdd = devAddx; |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
devAdd = AS3935_ADD3; |
|
||||||
} |
|
||||||
} |
} |
||||||
|
|
||||||
uint8_t DFRobot_AS3935_I2C::singRegRead(uint8_t regAdd) |
uint8_t DFRobot_AS3935_I2C::singRegRead(uint8_t regAdd) |
||||||
{ |
{ |
||||||
// I2C address Register address num bytes
|
uint8_t buf[1]; |
||||||
//I2c.read((uint8_t)devAdd, (uint8_t)regAdd, (uint8_t)0x01); // Use I2C library to read register
|
readReg(regAdd, buf, 1); |
||||||
//uint8_t regData = I2c.receive(); // receive the I2C data
|
return buf[0]; |
||||||
uint8_t buf[1]; |
|
||||||
readReg(regAdd, buf, 1); |
|
||||||
return buf[0]; |
|
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
void DFRobot_AS3935_I2C::singRegWrite(uint8_t regAdd, uint8_t dataMask, uint8_t regData) |
void DFRobot_AS3935_I2C::singRegWrite(uint8_t regAdd, uint8_t dataMask, uint8_t regData) |
||||||
{ |
{ |
||||||
// start by reading original register data (only modifying what we need to)
|
// start by reading original register data (only modifying what we need to)
|
||||||
uint8_t origRegData = singRegRead(regAdd); |
uint8_t origRegData = singRegRead(regAdd); |
||||||
|
|
||||||
// calculate new register data... 'delete' old targeted data, replace with new data
|
// calculate new register data... 'delete' old targeted data, replace with new data
|
||||||
// note: 'DataMask' must be bits targeted for replacement
|
// note: 'DataMask' must be bits targeted for replacement
|
||||||
// add'l note: this function does NOT shift values into the proper place... they need to be there already
|
// add'l note: this function does NOT shift values into the proper place... they need to be there already
|
||||||
uint8_t newRegData = ((origRegData & ~dataMask) | (regData & dataMask)); |
uint8_t newRegData = ((origRegData & ~dataMask) | (regData & dataMask)); |
||||||
uint8_t buf[1]; |
uint8_t buf[1]; |
||||||
buf[0] = newRegData; |
buf[0] = newRegData; |
||||||
|
|
||||||
// finally, write the data to the register
|
// finally, write the data to the register
|
||||||
//I2c.write(devAdd, regAdd, newRegData);
|
//I2c.write(devAdd, regAdd, newRegData);
|
||||||
writeReg(regAdd, buf, 1); |
writeReg(regAdd, buf, 1); |
||||||
//Serial.print("wrt: ");
|
|
||||||
//Serial.print(newRegData,HEX);
|
|
||||||
//Serial.print(" Act: ");
|
|
||||||
//Serial.println(singRegRead(regAdd),HEX);
|
|
||||||
} |
} |
||||||
|
|
||||||
int DFRobot_AS3935_I2C::defInit() |
int DFRobot_AS3935_I2C::defInit() |
||||||
{ |
{ |
||||||
return reset(); // reset registers to default
|
return reset(); // reset registers to default
|
||||||
} |
} |
||||||
|
|
||||||
int DFRobot_AS3935_I2C::reset() |
int DFRobot_AS3935_I2C::reset() |
||||||
{ |
{ |
||||||
// run PRESET_DEFAULT Direct Command to set all registers in default state
|
// run PRESET_DEFAULT Direct Command to set all registers in default state
|
||||||
//int error = I2c.write(devAdd, (uint8_t)0x3C, (uint8_t)0x96);
|
//int error = I2c.write(devAdd, (uint8_t)0x3C, (uint8_t)0x96);
|
||||||
uint8_t buf[1]; |
uint8_t buf[1]; |
||||||
buf[0] = 0x96; |
buf[0] = 0x96; |
||||||
|
writeReg(0x3c, buf, 1); |
||||||
writeReg(0x3c, buf, 1); |
return 0; |
||||||
return 0; |
|
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::calRCO() |
void DFRobot_AS3935_I2C::calRCO() |
||||||
{ |
{ |
||||||
// run ALIB_RCO Direct Command to cal internal RCO
|
// run ALIB_RCO Direct Command to cal internal RCO
|
||||||
//I2c.write(devAdd, (uint8_t)0x3D, (uint8_t)0x96);
|
//I2c.write(devAdd, (uint8_t)0x3D, (uint8_t)0x96);
|
||||||
uint8_t buf[1]; |
uint8_t buf[1]; |
||||||
buf[0] = 0x96; |
buf[0] = 0x96; |
||||||
writeReg(0x3D, buf, 1); |
writeReg(0x3D, buf, 1); |
||||||
delay(2); // wait 2ms to complete
|
delay(2); // wait 2ms to complete
|
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::powerUp(void) |
void DFRobot_AS3935_I2C::powerUp(void) |
||||||
{ |
{ |
||||||
// power-up sequence based on datasheet, pg 23/27
|
// power-up sequence based on datasheet, pg 23/27
|
||||||
// register 0x00, PWD bit: 0 (clears PWD)
|
// register 0x00, PWD bit: 0 (clears PWD)
|
||||||
singRegWrite(0x00, 0x01, 0x00); |
singRegWrite(0x00, 0x01, 0x00); |
||||||
calRCO(); // run RCO cal cmd
|
calRCO(); // run RCO cal cmd
|
||||||
singRegWrite(0x08, 0x20, 0x20); // set DISP_SRCO to 1
|
singRegWrite(0x08, 0x20, 0x20); // set DISP_SRCO to 1
|
||||||
delay(2); |
delay(2); |
||||||
singRegWrite(0x08, 0x20, 0x00); // set DISP_SRCO to 0
|
singRegWrite(0x08, 0x20, 0x00); // set DISP_SRCO to 0
|
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::powerDown(void) |
void DFRobot_AS3935_I2C::powerDown(void) |
||||||
{ |
{ |
||||||
// register 0x00, PWD bit: 0 (sets PWD)
|
// register 0x00, PWD bit: 0 (sets PWD)
|
||||||
singRegWrite(0x00, 0x01, 0x01); |
singRegWrite(0x00, 0x01, 0x01); |
||||||
Serial.println("AS3935 powered down"); |
Serial.println("AS3935 powered down"); |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::disturberEn(void) |
void DFRobot_AS3935_I2C::disturberEn(void) |
||||||
{ |
{ |
||||||
// register 0x03, PWD bit: 5 (sets MASK_DIST)
|
// register 0x03, PWD bit: 5 (sets MASK_DIST)
|
||||||
singRegWrite(0x03, 0x20, 0x00); |
singRegWrite(0x03, 0x20, 0x00); |
||||||
Serial.println("disturber detection enabled"); |
Serial.println("disturber detection enabled"); |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::disturberDis(void) |
void DFRobot_AS3935_I2C::disturberDis(void) |
||||||
{ |
{ |
||||||
// register 0x03, PWD bit: 5 (sets MASK_DIST)
|
// register 0x03, PWD bit: 5 (sets MASK_DIST)
|
||||||
singRegWrite(0x03, 0x20, 0x20); |
singRegWrite(0x03, 0x20, 0x20); |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::setIRQOutputSource(uint8_t irqSelect) |
void DFRobot_AS3935_I2C::setIRQOutputSource(uint8_t irqSelect) |
||||||
{ |
{ |
||||||
// set interrupt source - what to display on IRQ pin
|
// set interrupt source - what to display on IRQ pin
|
||||||
// reg 0x08, bits 5 (TRCO), 6 (SRCO), 7 (LCO)
|
// reg 0x08, bits 5 (TRCO), 6 (SRCO), 7 (LCO)
|
||||||
// only one should be set at once, I think
|
// only one should be set at once, I think
|
||||||
// 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO
|
// 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO
|
||||||
|
if(1 == irqSelect){ |
||||||
if(1 == irqSelect) |
singRegWrite(0x08, 0xE0, 0x20); // set only TRCO bit
|
||||||
{ |
}else if(2 == irqSelect){ |
||||||
singRegWrite(0x08, 0xE0, 0x20); // set only TRCO bit
|
singRegWrite(0x08, 0xE0, 0x40); // set only SRCO bit
|
||||||
} |
}else if(3 == irqSelect){ |
||||||
else if(2 == irqSelect) |
singRegWrite(0x08, 0xE0, 0x80); // set only LCO bit
|
||||||
{ |
}else{ |
||||||
singRegWrite(0x08, 0xE0, 0x40); // set only SRCO bit
|
singRegWrite(0x08, 0xE0, 0x00); // clear IRQ pin display bits
|
||||||
} |
}
|
||||||
else if(3 == irqSelect) |
|
||||||
{ |
|
||||||
singRegWrite(0x08, 0xE0, 0x80); // set only LCO bit
|
|
||||||
} |
|
||||||
else // assume 0
|
|
||||||
{ |
|
||||||
singRegWrite(0x08, 0xE0, 0x00); // clear IRQ pin display bits
|
|
||||||
} |
|
||||||
|
|
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::setTuningCaps(uint8_t capVal) |
void DFRobot_AS3935_I2C::setTuningCaps(uint8_t capVal) |
||||||
{ |
{ |
||||||
// Assume only numbers divisible by 8 (because that's all the chip supports)
|
// Assume only numbers divisible by 8 (because that's all the chip supports)
|
||||||
if(120 < capVal) // cap_value out of range, assume highest capacitance
|
if(120 < capVal){ // cap_value out of range, assume highest capacitance
|
||||||
{ |
singRegWrite(0x08, 0x0F, 0x0F); // set capacitance bits to maximum
|
||||||
singRegWrite(0x08, 0x0F, 0x0F); // set capacitance bits to maximum
|
}else{ |
||||||
} |
singRegWrite(0x08, 0x0F, (capVal >> 3)); // set capacitance bits
|
||||||
else |
} |
||||||
{ |
|
||||||
singRegWrite(0x08, 0x0F, (capVal >> 3)); // set capacitance bits
|
|
||||||
} |
|
||||||
//Serial.print("capacitance set to 8x");
|
|
||||||
//Serial.println((singRegRead(0x08) & 0x0F));
|
|
||||||
} |
} |
||||||
|
|
||||||
uint8_t DFRobot_AS3935_I2C::getInterruptSrc(void) |
uint8_t DFRobot_AS3935_I2C::getInterruptSrc(void) |
||||||
{ |
{ |
||||||
// definition of interrupt data on table 18 of datasheet
|
// definition of interrupt data on table 18 of datasheet
|
||||||
// for this function:
|
// for this function:
|
||||||
// 0 = unknown src, 1 = lightning detected, 2 = disturber, 3 = Noise level too high
|
// 0 = unknown src, 1 = lightning detected, 2 = disturber, 3 = Noise level too high
|
||||||
delay(10); // wait 3ms before reading (min 2ms per pg 22 of datasheet)
|
delay(10); // wait 3ms before reading (min 2ms per pg 22 of datasheet)
|
||||||
uint8_t intSrc = (singRegRead(0x03) & 0x0F); // read register, get rid of non-interrupt data
|
uint8_t intSrc = (singRegRead(0x03) & 0x0F); // read register, get rid of non-interrupt data
|
||||||
if(0x08 == intSrc) |
if(0x08 == intSrc){ |
||||||
{ |
return 1; // lightning caused interrupt
|
||||||
return 1; // lightning caused interrupt
|
}else if(0x04 == intSrc){ |
||||||
} |
return 2; // disturber detected
|
||||||
else if(0x04 == intSrc) |
}else if(0x01 == intSrc){ |
||||||
{ |
return 3; // Noise level too high
|
||||||
return 2; // disturber detected
|
}else{ |
||||||
} |
return 0; |
||||||
else if(0x01 == intSrc) |
} // interrupt result not expected
|
||||||
{ |
|
||||||
return 3; // Noise level too high
|
|
||||||
} |
|
||||||
else{return 0;} // interrupt result not expected
|
|
||||||
|
|
||||||
} |
} |
||||||
|
|
||||||
uint8_t DFRobot_AS3935_I2C::getLightningDistKm(void) |
uint8_t DFRobot_AS3935_I2C::getLightningDistKm(void) |
||||||
{ |
{ |
||||||
uint8_t strikeDist = (singRegRead(0x07) & 0x3F); // read register, get rid of non-distance data
|
uint8_t strikeDist = (singRegRead(0x07) & 0x3F); // read register, get rid of non-distance data
|
||||||
return strikeDist; |
return strikeDist; |
||||||
} |
} |
||||||
|
|
||||||
uint32_t DFRobot_AS3935_I2C::getStrikeEnergyRaw(void) |
uint32_t DFRobot_AS3935_I2C::getStrikeEnergyRaw(void) |
||||||
{ |
{ |
||||||
uint32_t nrgyRaw = ((singRegRead(0x06) & 0x1F) << 8); // MMSB, shift 8 bits left, make room for MSB
|
uint32_t nrgyRaw = ((singRegRead(0x06) & 0x1F) << 8); // MMSB, shift 8 bits left, make room for MSB
|
||||||
nrgyRaw |= singRegRead(0x05); // read MSB
|
nrgyRaw |= singRegRead(0x05); // read MSB
|
||||||
nrgyRaw <<= 8; // shift 8 bits left, make room for LSB
|
nrgyRaw <<= 8; // shift 8 bits left, make room for LSB
|
||||||
nrgyRaw |= singRegRead(0x04); // read LSB, add to others
|
nrgyRaw |= singRegRead(0x04); // read LSB, add to others
|
||||||
|
return nrgyRaw/16777; |
||||||
return nrgyRaw/16777; |
|
||||||
} |
} |
||||||
|
|
||||||
uint8_t DFRobot_AS3935_I2C::setMinStrikes(uint8_t minStrk) |
uint8_t DFRobot_AS3935_I2C::setMinStrikes(uint8_t minStrk) |
||||||
{ |
{ |
||||||
// This function sets min strikes to the closest available number, rounding to the floor,
|
// This function sets min strikes to the closest available number, rounding to the floor,
|
||||||
// where necessary, then returns the physical value that was set. Options are 1, 5, 9 or 16 strikes.
|
// where necessary, then returns the physical value that was set. Options are 1, 5, 9 or 16 strikes.
|
||||||
// see pg 22 of the datasheet for more info (#strikes in 17 min)
|
// see pg 22 of the datasheet for more info (#strikes in 17 min)
|
||||||
if(5 > minStrk) |
if(5 > minStrk){ |
||||||
{ |
singRegWrite(0x02, 0x30, 0x00); |
||||||
singRegWrite(0x02, 0x30, 0x00); |
return 1; |
||||||
return 1; |
}else if(9 > minStrk){ |
||||||
}else if(9 > minStrk) |
singRegWrite(0x02, 0x30, 0x10); |
||||||
{ |
return 5; |
||||||
singRegWrite(0x02, 0x30, 0x10); |
}else if(16 > minStrk){ |
||||||
return 5; |
singRegWrite(0x02, 0x30, 0x20); |
||||||
}else if(16 > minStrk) |
return 9; |
||||||
{ |
}else{ |
||||||
singRegWrite(0x02, 0x30, 0x20); |
singRegWrite(0x02, 0x30, 0x30); |
||||||
return 9; |
return 16; |
||||||
}else{ |
} |
||||||
singRegWrite(0x02, 0x30, 0x30); |
|
||||||
return 16; |
|
||||||
} |
|
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::setIndoors(void) |
void DFRobot_AS3935_I2C::setIndoors(void) |
||||||
{ |
{ |
||||||
// AFE settings addres 0x00, bits 5:1 (10010, based on datasheet, pg 19, table 15)
|
// AFE settings addres 0x00, bits 5:1 (10010, based on datasheet, pg 19, table 15)
|
||||||
// this is the default setting at power-up (AS3935 datasheet, table 9)
|
// this is the default setting at power-up (AS3935 datasheet, table 9)
|
||||||
singRegWrite(0x00, 0x3E, 0x24); |
singRegWrite(0x00, 0x3E, 0x24); |
||||||
Serial.println("set up for indoor operation"); |
Serial.println("set up for indoor operation"); |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::setOutdoors(void) |
void DFRobot_AS3935_I2C::setOutdoors(void) |
||||||
{ |
{ |
||||||
// AFE settings addres 0x00, bits 5:1 (01110, based on datasheet, pg 19, table 15)
|
// AFE settings addres 0x00, bits 5:1 (01110, based on datasheet, pg 19, table 15)
|
||||||
singRegWrite(0x00, 0x3E, 0x1C); |
singRegWrite(0x00, 0x3E, 0x1C); |
||||||
Serial.println("set up for outdoor operation"); |
Serial.println("set up for outdoor operation"); |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::clearStatistics(void) |
void DFRobot_AS3935_I2C::clearStatistics(void) |
||||||
{ |
{ |
||||||
// clear is accomplished by toggling CL_STAT bit 'high-low-high' (then set low to move on)
|
// clear is accomplished by toggling CL_STAT bit 'high-low-high' (then set low to move on)
|
||||||
singRegWrite(0x02, 0x40, 0x40); // high
|
singRegWrite(0x02, 0x40, 0x40); // high
|
||||||
singRegWrite(0x02, 0x40, 0x00); // low
|
singRegWrite(0x02, 0x40, 0x00); // low
|
||||||
singRegWrite(0x02, 0x40, 0x40); // high
|
singRegWrite(0x02, 0x40, 0x40); // high
|
||||||
} |
} |
||||||
|
|
||||||
uint8_t DFRobot_AS3935_I2C::getNoiseFloorLvl(void) |
uint8_t DFRobot_AS3935_I2C::getNoiseFloorLvl(void) |
||||||
{ |
{ |
||||||
// NF settings addres 0x01, bits 6:4
|
// NF settings addres 0x01, bits 6:4
|
||||||
// default setting of 010 at startup (datasheet, table 9)
|
// default setting of 010 at startup (datasheet, table 9)
|
||||||
uint8_t regRaw = singRegRead(0x01); // read register 0x01
|
uint8_t regRaw = singRegRead(0x01); // read register 0x01
|
||||||
return ((regRaw & 0x70) >> 4); // should return value from 0-7, see table 16 for info
|
return ((regRaw & 0x70) >> 4); // should return value from 0-7, see table 16 for info
|
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::setNoiseFloorLvl(uint8_t nfSel) |
void DFRobot_AS3935_I2C::setNoiseFloorLvl(uint8_t nfSel) |
||||||
{ |
{ |
||||||
// NF settings addres 0x01, bits 6:4
|
// NF settings addres 0x01, bits 6:4
|
||||||
// default setting of 010 at startup (datasheet, table 9)
|
// default setting of 010 at startup (datasheet, table 9)
|
||||||
if(7 >= nfSel) // nfSel within expected range
|
if(7 >= nfSel){ // nfSel within expected range
|
||||||
{ |
singRegWrite(0x01, 0x70, ((nfSel & 0x07) << 4)); |
||||||
singRegWrite(0x01, 0x70, ((nfSel & 0x07) << 4)); |
}else{ // out of range, set to default (power-up value 010)
|
||||||
} |
singRegWrite(0x01, 0x70, 0x20); |
||||||
else |
} |
||||||
{ // out of range, set to default (power-up value 010)
|
|
||||||
singRegWrite(0x01, 0x70, 0x20); |
|
||||||
} |
|
||||||
} |
} |
||||||
|
|
||||||
uint8_t DFRobot_AS3935_I2C::getWatchdogThreshold(void) |
uint8_t DFRobot_AS3935_I2C::getWatchdogThreshold(void) |
||||||
{ |
{ |
||||||
// This function is used to read WDTH. It is used to increase robustness to disturbers,
|
// This function is used to read WDTH. It is used to increase robustness to disturbers,
|
||||||
// though will make detection less efficient (see page 19, Fig 20 of datasheet)
|
// though will make detection less efficient (see page 19, Fig 20 of datasheet)
|
||||||
// WDTH register: add 0x01, bits 3:0
|
// WDTH register: add 0x01, bits 3:0
|
||||||
// default value of 0001
|
// default value of 0001
|
||||||
// values should only be between 0x00 and 0x0F (0 and 7)
|
// values should only be between 0x00 and 0x0F (0 and 7)
|
||||||
uint8_t regRaw = singRegRead(0x01); |
uint8_t regRaw = singRegRead(0x01); |
||||||
return (regRaw & 0x0F); |
return (regRaw & 0x0F); |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::setWatchdogThreshold(uint8_t wdth) |
void DFRobot_AS3935_I2C::setWatchdogThreshold(uint8_t wdth) |
||||||
{ |
{ |
||||||
// This function is used to modify WDTH. It is used to increase robustness to disturbers,
|
// This function is used to modify WDTH. It is used to increase robustness to disturbers,
|
||||||
// though will make detection less efficient (see page 19, Fig 20 of datasheet)
|
// though will make detection less efficient (see page 19, Fig 20 of datasheet)
|
||||||
// WDTH register: add 0x01, bits 3:0
|
// WDTH register: add 0x01, bits 3:0
|
||||||
// default value of 0010
|
// default value of 0010
|
||||||
// values should only be between 0x00 and 0x0F (0 and 7)
|
// values should only be between 0x00 and 0x0F (0 and 7)
|
||||||
singRegWrite(0x01, 0x0F, (wdth & 0x0F)); |
singRegWrite(0x01, 0x0F, (wdth & 0x0F)); |
||||||
} |
} |
||||||
|
|
||||||
uint8_t DFRobot_AS3935_I2C::getSpikeRejection(void) |
uint8_t DFRobot_AS3935_I2C::getSpikeRejection(void) |
||||||
{ |
{ |
||||||
// This function is used to read SREJ (spike rejection). Similar to the Watchdog threshold,
|
// This function is used to read SREJ (spike rejection). Similar to the Watchdog threshold,
|
||||||
// it is used to make the system more robust to disturbers, though will make general detection
|
// it is used to make the system more robust to disturbers, though will make general detection
|
||||||
// less efficient (see page 20-21, especially Fig 21 of datasheet)
|
// less efficient (see page 20-21, especially Fig 21 of datasheet)
|
||||||
// SREJ register: add 0x02, bits 3:0
|
// SREJ register: add 0x02, bits 3:0
|
||||||
// default value of 0010
|
// default value of 0010
|
||||||
// values should only be between 0x00 and 0x0F (0 and 7)
|
// values should only be between 0x00 and 0x0F (0 and 7)
|
||||||
uint8_t regRaw = singRegRead(0x02); |
uint8_t regRaw = singRegRead(0x02); |
||||||
return (regRaw & 0x0F); |
return (regRaw & 0x0F); |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::setSpikeRejection(uint8_t srej) |
void DFRobot_AS3935_I2C::setSpikeRejection(uint8_t srej) |
||||||
{ |
{ |
||||||
// This function is used to modify SREJ (spike rejection). Similar to the Watchdog threshold,
|
// This function is used to modify SREJ (spike rejection). Similar to the Watchdog threshold,
|
||||||
// it is used to make the system more robust to disturbers, though will make general detection
|
// it is used to make the system more robust to disturbers, though will make general detection
|
||||||
// less efficient (see page 20-21, especially Fig 21 of datasheet)
|
// less efficient (see page 20-21, especially Fig 21 of datasheet)
|
||||||
// WDTH register: add 0x02, bits 3:0
|
// WDTH register: add 0x02, bits 3:0
|
||||||
// default value of 0010
|
// default value of 0010
|
||||||
// values should only be between 0x00 and 0x0F (0 and 7)
|
// values should only be between 0x00 and 0x0F (0 and 7)
|
||||||
singRegWrite(0x02, 0x0F, (srej & 0x0F)); |
singRegWrite(0x02, 0x0F, (srej & 0x0F)); |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::setLcoFdiv(uint8_t fdiv) |
void DFRobot_AS3935_I2C::setLcoFdiv(uint8_t fdiv) |
||||||
{ |
{ |
||||||
// This function sets LCO_FDIV register. This is useful in the tuning of the antenna
|
// This function sets LCO_FDIV register. This is useful in the tuning of the antenna
|
||||||
// LCO_FDIV register: add 0x03, bits 7:6
|
// LCO_FDIV register: add 0x03, bits 7:6
|
||||||
// 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.
|
||||||
singRegWrite(0x03, 0xC0, ((fdiv & 0x03) << 6)); |
singRegWrite(0x03, 0xC0, ((fdiv & 0x03) << 6)); |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::printAllRegs(void) |
void DFRobot_AS3935_I2C::printAllRegs(void) |
||||||
{ |
{ |
||||||
Serial.print("Reg 0x00: "); |
Serial.print("Reg 0x00: "); |
||||||
Serial.println(singRegRead(0x00)); |
Serial.println(singRegRead(0x00)); |
||||||
Serial.print("Reg 0x01: "); |
Serial.print("Reg 0x01: "); |
||||||
Serial.println(singRegRead(0x01)); |
Serial.println(singRegRead(0x01)); |
||||||
Serial.print("Reg 0x02: "); |
Serial.print("Reg 0x02: "); |
||||||
Serial.println(singRegRead(0x02)); |
Serial.println(singRegRead(0x02)); |
||||||
Serial.print("Reg 0x03: "); |
Serial.print("Reg 0x03: "); |
||||||
Serial.println(singRegRead(0x03)); |
Serial.println(singRegRead(0x03)); |
||||||
Serial.print("Reg 0x04: "); |
Serial.print("Reg 0x04: "); |
||||||
Serial.println(singRegRead(0x04)); |
Serial.println(singRegRead(0x04)); |
||||||
Serial.print("Reg 0x05: "); |
Serial.print("Reg 0x05: "); |
||||||
Serial.println(singRegRead(0x05)); |
Serial.println(singRegRead(0x05)); |
||||||
Serial.print("Reg 0x06: "); |
Serial.print("Reg 0x06: "); |
||||||
Serial.println(singRegRead(0x06)); |
Serial.println(singRegRead(0x06)); |
||||||
Serial.print("Reg 0x07: "); |
Serial.print("Reg 0x07: "); |
||||||
Serial.println(singRegRead(0x07)); |
Serial.println(singRegRead(0x07)); |
||||||
Serial.print("Reg 0x08: "); |
Serial.print("Reg 0x08: "); |
||||||
Serial.println(singRegRead(0x08)); |
Serial.println(singRegRead(0x08)); |
||||||
uint32_t nrgyVal = getStrikeEnergyRaw(); |
uint32_t nrgyVal = getStrikeEnergyRaw(); |
||||||
Serial.println(nrgyVal); |
Serial.println(nrgyVal); |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::manualCal(uint8_t capacitance, uint8_t location, uint8_t disturber) |
void DFRobot_AS3935_I2C::manualCal(uint8_t capacitance, uint8_t location, uint8_t disturber) |
||||||
{ |
{ |
||||||
// start by powering up
|
// start by powering up
|
||||||
powerUp(); |
powerUp(); |
||||||
|
// indoors/outdoors next...
|
||||||
// indoors/outdoors next...
|
if(1 == location){ // set outdoors if 1
|
||||||
if(1 == location) // set outdoors if 1
|
setOutdoors(); |
||||||
{ |
}else{ // set indoors if anything but 1
|
||||||
setOutdoors(); |
setIndoors(); |
||||||
} |
} |
||||||
else // set indoors if anything but 1
|
// disturber cal
|
||||||
{ |
if(0 == disturber){ // disabled if 0
|
||||||
setIndoors(); |
disturberDis(); |
||||||
} |
}else{ // enabled if anything but 0
|
||||||
|
disturberEn(); |
||||||
// disturber cal
|
} |
||||||
if(0 == disturber) // disabled if 0
|
setIRQOutputSource(0); |
||||||
{
|
delay(500); |
||||||
disturberDis(); |
// capacitance first... directly write value here
|
||||||
} |
setTuningCaps(capacitance); |
||||||
else // enabled if anything but 0
|
Serial.println("AS3935 manual cal complete"); |
||||||
{ |
|
||||||
disturberEn(); |
|
||||||
} |
|
||||||
|
|
||||||
setIRQOutputSource(0); |
|
||||||
|
|
||||||
delay(500); |
|
||||||
// capacitance first... directly write value here
|
|
||||||
setTuningCaps(capacitance); |
|
||||||
|
|
||||||
Serial.println("AS3935 manual cal complete"); |
|
||||||
} |
} |
||||||
// a nice function would be to read the last 'x' strike data values....
|
// a nice function would be to read the last 'x' strike data values....
|
||||||
|
|
||||||
uint8_t DFRobot_AS3935_I2C::begin(void) |
uint8_t DFRobot_AS3935_I2C::begin(void) |
||||||
{ |
{ |
||||||
uint8_t buf[2]; |
uint8_t buf[2]; |
||||||
Wire.begin(); |
Wire.begin(); |
||||||
Wire.setClock(400000); |
Wire.setClock(400000); |
||||||
DBG("i2c init"); |
DBG("i2c init"); |
||||||
if(readReg(0, buf, 2) == 2){ |
if(readReg(0, buf, 2) == 2){ |
||||||
DBG("return"); |
DBG("return"); |
||||||
return 0; |
return 0; |
||||||
} |
} |
||||||
return 1; |
return 1; |
||||||
} |
} |
||||||
|
|
||||||
void DFRobot_AS3935_I2C::writeReg(uint8_t reg, void *pBuf, size_t size) |
void DFRobot_AS3935_I2C::writeReg(uint8_t reg, void *pBuf, size_t size) |
||||||
{ |
{ |
||||||
if(pBuf == NULL){ |
if(pBuf == NULL){ |
||||||
DBG("pBuf ERROR!! :null pointer"); |
DBG("pBuf ERROR!! :null pointer"); |
||||||
} |
} |
||||||
uint8_t *_pBuf = (uint8_t*)pBuf; |
uint8_t *_pBuf = (uint8_t*)pBuf; |
||||||
Wire.beginTransmission(devAdd); |
Wire.beginTransmission(devAdd); |
||||||
Wire.write(reg); |
Wire.write(reg); |
||||||
for(size_t i = 0; i < size; i++){ |
for(size_t i = 0; i < size; i++){ |
||||||
Wire.write(_pBuf[i]); |
Wire.write(_pBuf[i]); |
||||||
} |
} |
||||||
Wire.endTransmission(); |
Wire.endTransmission(); |
||||||
DBG("i2c write"); |
DBG("i2c write"); |
||||||
} |
} |
||||||
|
|
||||||
size_t DFRobot_AS3935_I2C::readReg(uint8_t reg, void *pBuf, size_t size) |
size_t DFRobot_AS3935_I2C::readReg(uint8_t reg, void *pBuf, size_t size) |
||||||
{ |
{ |
||||||
if(pBuf == NULL){ |
if(pBuf == NULL){ |
||||||
DBG("pBuf ERROR!!:null pointer"); |
DBG("pBuf ERROR!!:null pointer"); |
||||||
return 0; |
return 0; |
||||||
} |
} |
||||||
uint8_t *_pBuf = (uint8_t*)pBuf; |
uint8_t *_pBuf = (uint8_t*)pBuf; |
||||||
Wire.beginTransmission(devAdd); |
Wire.beginTransmission(devAdd); |
||||||
Wire.write(reg); |
Wire.write(reg); |
||||||
Wire.endTransmission(false); |
Wire.endTransmission(false); |
||||||
Wire.requestFrom(devAdd, size); |
Wire.requestFrom(devAdd, size); |
||||||
for(size_t i = 0; i < size; i++){ |
for(size_t i = 0; i < size; i++){ |
||||||
_pBuf[i] = Wire.read(); |
_pBuf[i] = Wire.read(); |
||||||
DBG(_pBuf[i], HEX); |
DBG(_pBuf[i], HEX); |
||||||
} |
} |
||||||
return size; |
return size; |
||||||
} |
} |
||||||
|
|
||||||
|
@ -1,504 +1,21 @@ |
|||||||
GNU LESSER GENERAL PUBLIC LICENSE |
MIT License |
||||||
Version 2.1, February 1999 |
|
||||||
|
Copyright (c) 2020 DFRobot |
||||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc. |
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||||
Everyone is permitted to copy and distribute verbatim copies |
of this software and associated documentation files (the "Software"), to deal |
||||||
of this license document, but changing it is not allowed. |
in the Software without restriction, including without limitation the rights |
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||||
[This is the first released version of the Lesser GPL. It also counts |
copies of the Software, and to permit persons to whom the Software is |
||||||
as the successor of the GNU Library Public License, version 2, hence |
furnished to do so, subject to the following conditions: |
||||||
the version number 2.1.] |
|
||||||
|
The above copyright notice and this permission notice shall be included in all |
||||||
Preamble |
copies or substantial portions of the Software. |
||||||
|
|
||||||
The licenses for most software are designed to take away your |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
freedom to share and change it. By contrast, the GNU General Public |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
Licenses are intended to guarantee your freedom to share and change |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||||
free software--to make sure the software is free for all its users. |
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||||
This license, the Lesser General Public License, applies to some |
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||||
specially designated software packages--typically libraries--of the |
SOFTWARE. |
||||||
Free Software Foundation and other authors who decide to use it. You |
|
||||||
can use it too, but we suggest you first think carefully about whether |
|
||||||
this license or the ordinary General Public License is the better |
|
||||||
strategy to use in any particular case, based on the explanations below. |
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom of use, |
|
||||||
not price. Our General Public Licenses are designed to make sure that |
|
||||||
you have the freedom to distribute copies of free software (and charge |
|
||||||
for this service if you wish); that you receive source code or can get |
|
||||||
it if you want it; that you can change the software and use pieces of |
|
||||||
it in new free programs; and that you are informed that you can do |
|
||||||
these things. |
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid |
|
||||||
distributors to deny you these rights or to ask you to surrender these |
|
||||||
rights. These restrictions translate to certain responsibilities for |
|
||||||
you if you distribute copies of the library or if you modify it. |
|
||||||
|
|
||||||
For example, if you distribute copies of the library, whether gratis |
|
||||||
or for a fee, you must give the recipients all the rights that we gave |
|
||||||
you. You must make sure that they, too, receive or can get the source |
|
||||||
code. If you link other code with the library, you must provide |
|
||||||
complete object files to the recipients, so that they can relink them |
|
||||||
with the library after making changes to the library and recompiling |
|
||||||
it. And you must show them these terms so they know their rights. |
|
||||||
|
|
||||||
We protect your rights with a two-step method: (1) we copyright the |
|
||||||
library, and (2) we offer you this license, which gives you legal |
|
||||||
permission to copy, distribute and/or modify the library. |
|
||||||
|
|
||||||
To protect each distributor, we want to make it very clear that |
|
||||||
there is no warranty for the free library. Also, if the library is |
|
||||||
modified by someone else and passed on, the recipients should know |
|
||||||
that what they have is not the original version, so that the original |
|
||||||
author's reputation will not be affected by problems that might be |
|
||||||
introduced by others. |
|
||||||
|
|
||||||
Finally, software patents pose a constant threat to the existence of |
|
||||||
any free program. We wish to make sure that a company cannot |
|
||||||
effectively restrict the users of a free program by obtaining a |
|
||||||
restrictive license from a patent holder. Therefore, we insist that |
|
||||||
any patent license obtained for a version of the library must be |
|
||||||
consistent with the full freedom of use specified in this license. |
|
||||||
|
|
||||||
Most GNU software, including some libraries, is covered by the |
|
||||||
ordinary GNU General Public License. This license, the GNU Lesser |
|
||||||
General Public License, applies to certain designated libraries, and |
|
||||||
is quite different from the ordinary General Public License. We use |
|
||||||
this license for certain libraries in order to permit linking those |
|
||||||
libraries into non-free programs. |
|
||||||
|
|
||||||
When a program is linked with a library, whether statically or using |
|
||||||
a shared library, the combination of the two is legally speaking a |
|
||||||
combined work, a derivative of the original library. The ordinary |
|
||||||
General Public License therefore permits such linking only if the |
|
||||||
entire combination fits its criteria of freedom. The Lesser General |
|
||||||
Public License permits more lax criteria for linking other code with |
|
||||||
the library. |
|
||||||
|
|
||||||
We call this license the "Lesser" General Public License because it |
|
||||||
does Less to protect the user's freedom than the ordinary General |
|
||||||
Public License. It also provides other free software developers Less |
|
||||||
of an advantage over competing non-free programs. These disadvantages |
|
||||||
are the reason we use the ordinary General Public License for many |
|
||||||
libraries. However, the Lesser license provides advantages in certain |
|
||||||
special circumstances. |
|
||||||
|
|
||||||
For example, on rare occasions, there may be a special need to |
|
||||||
encourage the widest possible use of a certain library, so that it becomes |
|
||||||
a de-facto standard. To achieve this, non-free programs must be |
|
||||||
allowed to use the library. A more frequent case is that a free |
|
||||||
library does the same job as widely used non-free libraries. In this |
|
||||||
case, there is little to gain by limiting the free library to free |
|
||||||
software only, so we use the Lesser General Public License. |
|
||||||
|
|
||||||
In other cases, permission to use a particular library in non-free |
|
||||||
programs enables a greater number of people to use a large body of |
|
||||||
free software. For example, permission to use the GNU C Library in |
|
||||||
non-free programs enables many more people to use the whole GNU |
|
||||||
operating system, as well as its variant, the GNU/Linux operating |
|
||||||
system. |
|
||||||
|
|
||||||
Although the Lesser General Public License is Less protective of the |
|
||||||
users' freedom, it does ensure that the user of a program that is |
|
||||||
linked with the Library has the freedom and the wherewithal to run |
|
||||||
that program using a modified version of the Library. |
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and |
|
||||||
modification follow. Pay close attention to the difference between a |
|
||||||
"work based on the library" and a "work that uses the library". The |
|
||||||
former contains code derived from the library, whereas the latter must |
|
||||||
be combined with the library in order to run. |
|
||||||
|
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE |
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
|
||||||
|
|
||||||
0. This License Agreement applies to any software library or other |
|
||||||
program which contains a notice placed by the copyright holder or |
|
||||||
other authorized party saying it may be distributed under the terms of |
|
||||||
this Lesser General Public License (also called "this License"). |
|
||||||
Each licensee is addressed as "you". |
|
||||||
|
|
||||||
A "library" means a collection of software functions and/or data |
|
||||||
prepared so as to be conveniently linked with application programs |
|
||||||
(which use some of those functions and data) to form executables. |
|
||||||
|
|
||||||
The "Library", below, refers to any such software library or work |
|
||||||
which has been distributed under these terms. A "work based on the |
|
||||||
Library" means either the Library or any derivative work under |
|
||||||
copyright law: that is to say, a work containing the Library or a |
|
||||||
portion of it, either verbatim or with modifications and/or translated |
|
||||||
straightforwardly into another language. (Hereinafter, translation is |
|
||||||
included without limitation in the term "modification".) |
|
||||||
|
|
||||||
"Source code" for a work means the preferred form of the work for |
|
||||||
making modifications to it. For a library, complete source code means |
|
||||||
all the source code for all modules it contains, plus any associated |
|
||||||
interface definition files, plus the scripts used to control compilation |
|
||||||
and installation of the library. |
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not |
|
||||||
covered by this License; they are outside its scope. The act of |
|
||||||
running a program using the Library is not restricted, and output from |
|
||||||
such a program is covered only if its contents constitute a work based |
|
||||||
on the Library (independent of the use of the Library in a tool for |
|
||||||
writing it). Whether that is true depends on what the Library does |
|
||||||
and what the program that uses the Library does. |
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Library's |
|
||||||
complete source code as you receive it, in any medium, provided that |
|
||||||
you conspicuously and appropriately publish on each copy an |
|
||||||
appropriate copyright notice and disclaimer of warranty; keep intact |
|
||||||
all the notices that refer to this License and to the absence of any |
|
||||||
warranty; and distribute a copy of this License along with the |
|
||||||
Library. |
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, |
|
||||||
and you may at your option offer warranty protection in exchange for a |
|
||||||
fee. |
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Library or any portion |
|
||||||
of it, thus forming a work based on the Library, and copy and |
|
||||||
distribute such modifications or work under the terms of Section 1 |
|
||||||
above, provided that you also meet all of these conditions: |
|
||||||
|
|
||||||
a) The modified work must itself be a software library. |
|
||||||
|
|
||||||
b) You must cause the files modified to carry prominent notices |
|
||||||
stating that you changed the files and the date of any change. |
|
||||||
|
|
||||||
c) You must cause the whole of the work to be licensed at no |
|
||||||
charge to all third parties under the terms of this License. |
|
||||||
|
|
||||||
d) If a facility in the modified Library refers to a function or a |
|
||||||
table of data to be supplied by an application program that uses |
|
||||||
the facility, other than as an argument passed when the facility |
|
||||||
is invoked, then you must make a good faith effort to ensure that, |
|
||||||
in the event an application does not supply such function or |
|
||||||
table, the facility still operates, and performs whatever part of |
|
||||||
its purpose remains meaningful. |
|
||||||
|
|
||||||
(For example, a function in a library to compute square roots has |
|
||||||
a purpose that is entirely well-defined independent of the |
|
||||||
application. Therefore, Subsection 2d requires that any |
|
||||||
application-supplied function or table used by this function must |
|
||||||
be optional: if the application does not supply it, the square |
|
||||||
root function must still compute square roots.) |
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If |
|
||||||
identifiable sections of that work are not derived from the Library, |
|
||||||
and can be reasonably considered independent and separate works in |
|
||||||
themselves, then this License, and its terms, do not apply to those |
|
||||||
sections when you distribute them as separate works. But when you |
|
||||||
distribute the same sections as part of a whole which is a work based |
|
||||||
on the Library, the distribution of the whole must be on the terms of |
|
||||||
this License, whose permissions for other licensees extend to the |
|
||||||
entire whole, and thus to each and every part regardless of who wrote |
|
||||||
it. |
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest |
|
||||||
your rights to work written entirely by you; rather, the intent is to |
|
||||||
exercise the right to control the distribution of derivative or |
|
||||||
collective works based on the Library. |
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Library |
|
||||||
with the Library (or with a work based on the Library) on a volume of |
|
||||||
a storage or distribution medium does not bring the other work under |
|
||||||
the scope of this License. |
|
||||||
|
|
||||||
3. You may opt to apply the terms of the ordinary GNU General Public |
|
||||||
License instead of this License to a given copy of the Library. To do |
|
||||||
this, you must alter all the notices that refer to this License, so |
|
||||||
that they refer to the ordinary GNU General Public License, version 2, |
|
||||||
instead of to this License. (If a newer version than version 2 of the |
|
||||||
ordinary GNU General Public License has appeared, then you can specify |
|
||||||
that version instead if you wish.) Do not make any other change in |
|
||||||
these notices. |
|
||||||
|
|
||||||
Once this change is made in a given copy, it is irreversible for |
|
||||||
that copy, so the ordinary GNU General Public License applies to all |
|
||||||
subsequent copies and derivative works made from that copy. |
|
||||||
|
|
||||||
This option is useful when you wish to copy part of the code of |
|
||||||
the Library into a program that is not a library. |
|
||||||
|
|
||||||
4. You may copy and distribute the Library (or a portion or |
|
||||||
derivative of it, under Section 2) in object code or executable form |
|
||||||
under the terms of Sections 1 and 2 above provided that you accompany |
|
||||||
it with the complete corresponding machine-readable source code, which |
|
||||||
must be distributed under the terms of Sections 1 and 2 above on a |
|
||||||
medium customarily used for software interchange. |
|
||||||
|
|
||||||
If distribution of object code is made by offering access to copy |
|
||||||
from a designated place, then offering equivalent access to copy the |
|
||||||
source code from the same place satisfies the requirement to |
|
||||||
distribute the source code, even though third parties are not |
|
||||||
compelled to copy the source along with the object code. |
|
||||||
|
|
||||||
5. A program that contains no derivative of any portion of the |
|
||||||
Library, but is designed to work with the Library by being compiled or |
|
||||||
linked with it, is called a "work that uses the Library". Such a |
|
||||||
work, in isolation, is not a derivative work of the Library, and |
|
||||||
therefore falls outside the scope of this License. |
|
||||||
|
|
||||||
However, linking a "work that uses the Library" with the Library |
|
||||||
creates an executable that is a derivative of the Library (because it |
|
||||||
contains portions of the Library), rather than a "work that uses the |
|
||||||
library". The executable is therefore covered by this License. |
|
||||||
Section 6 states terms for distribution of such executables. |
|
||||||
|
|
||||||
When a "work that uses the Library" uses material from a header file |
|
||||||
that is part of the Library, the object code for the work may be a |
|
||||||
derivative work of the Library even though the source code is not. |
|
||||||
Whether this is true is especially significant if the work can be |
|
||||||
linked without the Library, or if the work is itself a library. The |
|
||||||
threshold for this to be true is not precisely defined by law. |
|
||||||
|
|
||||||
If such an object file uses only numerical parameters, data |
|
||||||
structure layouts and accessors, and small macros and small inline |
|
||||||
functions (ten lines or less in length), then the use of the object |
|
||||||
file is unrestricted, regardless of whether it is legally a derivative |
|
||||||
work. (Executables containing this object code plus portions of the |
|
||||||
Library will still fall under Section 6.) |
|
||||||
|
|
||||||
Otherwise, if the work is a derivative of the Library, you may |
|
||||||
distribute the object code for the work under the terms of Section 6. |
|
||||||
Any executables containing that work also fall under Section 6, |
|
||||||
whether or not they are linked directly with the Library itself. |
|
||||||
|
|
||||||
6. As an exception to the Sections above, you may also combine or |
|
||||||
link a "work that uses the Library" with the Library to produce a |
|
||||||
work containing portions of the Library, and distribute that work |
|
||||||
under terms of your choice, provided that the terms permit |
|
||||||
modification of the work for the customer's own use and reverse |
|
||||||
engineering for debugging such modifications. |
|
||||||
|
|
||||||
You must give prominent notice with each copy of the work that the |
|
||||||
Library is used in it and that the Library and its use are covered by |
|
||||||
this License. You must supply a copy of this License. If the work |
|
||||||
during execution displays copyright notices, you must include the |
|
||||||
copyright notice for the Library among them, as well as a reference |
|
||||||
directing the user to the copy of this License. Also, you must do one |
|
||||||
of these things: |
|
||||||
|
|
||||||
a) Accompany the work with the complete corresponding |
|
||||||
machine-readable source code for the Library including whatever |
|
||||||
changes were used in the work (which must be distributed under |
|
||||||
Sections 1 and 2 above); and, if the work is an executable linked |
|
||||||
with the Library, with the complete machine-readable "work that |
|
||||||
uses the Library", as object code and/or source code, so that the |
|
||||||
user can modify the Library and then relink to produce a modified |
|
||||||
executable containing the modified Library. (It is understood |
|
||||||
that the user who changes the contents of definitions files in the |
|
||||||
Library will not necessarily be able to recompile the application |
|
||||||
to use the modified definitions.) |
|
||||||
|
|
||||||
b) Use a suitable shared library mechanism for linking with the |
|
||||||
Library. A suitable mechanism is one that (1) uses at run time a |
|
||||||
copy of the library already present on the user's computer system, |
|
||||||
rather than copying library functions into the executable, and (2) |
|
||||||
will operate properly with a modified version of the library, if |
|
||||||
the user installs one, as long as the modified version is |
|
||||||
interface-compatible with the version that the work was made with. |
|
||||||
|
|
||||||
c) Accompany the work with a written offer, valid for at |
|
||||||
least three years, to give the same user the materials |
|
||||||
specified in Subsection 6a, above, for a charge no more |
|
||||||
than the cost of performing this distribution. |
|
||||||
|
|
||||||
d) If distribution of the work is made by offering access to copy |
|
||||||
from a designated place, offer equivalent access to copy the above |
|
||||||
specified materials from the same place. |
|
||||||
|
|
||||||
e) Verify that the user has already received a copy of these |
|
||||||
materials or that you have already sent this user a copy. |
|
||||||
|
|
||||||
For an executable, the required form of the "work that uses the |
|
||||||
Library" must include any data and utility programs needed for |
|
||||||
reproducing the executable from it. However, as a special exception, |
|
||||||
the materials to be distributed need not include anything that is |
|
||||||
normally distributed (in either source or binary form) with the major |
|
||||||
components (compiler, kernel, and so on) of the operating system on |
|
||||||
which the executable runs, unless that component itself accompanies |
|
||||||
the executable. |
|
||||||
|
|
||||||
It may happen that this requirement contradicts the license |
|
||||||
restrictions of other proprietary libraries that do not normally |
|
||||||
accompany the operating system. Such a contradiction means you cannot |
|
||||||
use both them and the Library together in an executable that you |
|
||||||
distribute. |
|
||||||
|
|
||||||
7. You may place library facilities that are a work based on the |
|
||||||
Library side-by-side in a single library together with other library |
|
||||||
facilities not covered by this License, and distribute such a combined |
|
||||||
library, provided that the separate distribution of the work based on |
|
||||||
the Library and of the other library facilities is otherwise |
|
||||||
permitted, and provided that you do these two things: |
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work |
|
||||||
based on the Library, uncombined with any other library |
|
||||||
facilities. This must be distributed under the terms of the |
|
||||||
Sections above. |
|
||||||
|
|
||||||
b) Give prominent notice with the combined library of the fact |
|
||||||
that part of it is a work based on the Library, and explaining |
|
||||||
where to find the accompanying uncombined form of the same work. |
|
||||||
|
|
||||||
8. You may not copy, modify, sublicense, link with, or distribute |
|
||||||
the Library except as expressly provided under this License. Any |
|
||||||
attempt otherwise to copy, modify, sublicense, link with, or |
|
||||||
distribute the Library is void, and will automatically terminate your |
|
||||||
rights under this License. However, parties who have received copies, |
|
||||||
or rights, from you under this License will not have their licenses |
|
||||||
terminated so long as such parties remain in full compliance. |
|
||||||
|
|
||||||
9. You are not required to accept this License, since you have not |
|
||||||
signed it. However, nothing else grants you permission to modify or |
|
||||||
distribute the Library or its derivative works. These actions are |
|
||||||
prohibited by law if you do not accept this License. Therefore, by |
|
||||||
modifying or distributing the Library (or any work based on the |
|
||||||
Library), you indicate your acceptance of this License to do so, and |
|
||||||
all its terms and conditions for copying, distributing or modifying |
|
||||||
the Library or works based on it. |
|
||||||
|
|
||||||
10. Each time you redistribute the Library (or any work based on the |
|
||||||
Library), the recipient automatically receives a license from the |
|
||||||
original licensor to copy, distribute, link with or modify the Library |
|
||||||
subject to these terms and conditions. You may not impose any further |
|
||||||
restrictions on the recipients' exercise of the rights granted herein. |
|
||||||
You are not responsible for enforcing compliance by third parties with |
|
||||||
this License. |
|
||||||
|
|
||||||
11. If, as a consequence of a court judgment or allegation of patent |
|
||||||
infringement or for any other reason (not limited to patent issues), |
|
||||||
conditions are imposed on you (whether by court order, agreement or |
|
||||||
otherwise) that contradict the conditions of this License, they do not |
|
||||||
excuse you from the conditions of this License. If you cannot |
|
||||||
distribute so as to satisfy simultaneously your obligations under this |
|
||||||
License and any other pertinent obligations, then as a consequence you |
|
||||||
may not distribute the Library at all. For example, if a patent |
|
||||||
license would not permit royalty-free redistribution of the Library by |
|
||||||
all those who receive copies directly or indirectly through you, then |
|
||||||
the only way you could satisfy both it and this License would be to |
|
||||||
refrain entirely from distribution of the Library. |
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under any |
|
||||||
particular circumstance, the balance of the section is intended to apply, |
|
||||||
and the section as a whole is intended to apply in other circumstances. |
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any |
|
||||||
patents or other property right claims or to contest validity of any |
|
||||||
such claims; this section has the sole purpose of protecting the |
|
||||||
integrity of the free software distribution system which is |
|
||||||
implemented by public license practices. Many people have made |
|
||||||
generous contributions to the wide range of software distributed |
|
||||||
through that system in reliance on consistent application of that |
|
||||||
system; it is up to the author/donor to decide if he or she is willing |
|
||||||
to distribute software through any other system and a licensee cannot |
|
||||||
impose that choice. |
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to |
|
||||||
be a consequence of the rest of this License. |
|
||||||
|
|
||||||
12. If the distribution and/or use of the Library is restricted in |
|
||||||
certain countries either by patents or by copyrighted interfaces, the |
|
||||||
original copyright holder who places the Library under this License may add |
|
||||||
an explicit geographical distribution limitation excluding those countries, |
|
||||||
so that distribution is permitted only in or among countries not thus |
|
||||||
excluded. In such case, this License incorporates the limitation as if |
|
||||||
written in the body of this License. |
|
||||||
|
|
||||||
13. The Free Software Foundation may publish revised and/or new |
|
||||||
versions of the Lesser General Public License from time to time. |
|
||||||
Such new versions will be similar in spirit to the present version, |
|
||||||
but may differ in detail to address new problems or concerns. |
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Library |
|
||||||
specifies a version number of this License which applies to it and |
|
||||||
"any later version", you have the option of following the terms and |
|
||||||
conditions either of that version or of any later version published by |
|
||||||
the Free Software Foundation. If the Library does not specify a |
|
||||||
license version number, you may choose any version ever published by |
|
||||||
the Free Software Foundation. |
|
||||||
|
|
||||||
14. If you wish to incorporate parts of the Library into other free |
|
||||||
programs whose distribution conditions are incompatible with these, |
|
||||||
write to the author to ask for permission. For software which is |
|
||||||
copyrighted by the Free Software Foundation, write to the Free |
|
||||||
Software Foundation; we sometimes make exceptions for this. Our |
|
||||||
decision will be guided by the two goals of preserving the free status |
|
||||||
of all derivatives of our free software and of promoting the sharing |
|
||||||
and reuse of software generally. |
|
||||||
|
|
||||||
NO WARRANTY |
|
||||||
|
|
||||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO |
|
||||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. |
|
||||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR |
|
||||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY |
|
||||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE |
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE |
|
||||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME |
|
||||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
|
||||||
|
|
||||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN |
|
||||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY |
|
||||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU |
|
||||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR |
|
||||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE |
|
||||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING |
|
||||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A |
|
||||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF |
|
||||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
|
||||||
DAMAGES. |
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS |
|
||||||
|
|
||||||
How to Apply These Terms to Your New Libraries |
|
||||||
|
|
||||||
If you develop a new library, and you want it to be of the greatest |
|
||||||
possible use to the public, we recommend making it free software that |
|
||||||
everyone can redistribute and change. You can do so by permitting |
|
||||||
redistribution under these terms (or, alternatively, under the terms of the |
|
||||||
ordinary General Public License). |
|
||||||
|
|
||||||
To apply these terms, attach the following notices to the library. It is |
|
||||||
safest to attach them to the start of each source file to most effectively |
|
||||||
convey the exclusion of warranty; and each file should have at least the |
|
||||||
"copyright" line and a pointer to where the full notice is found. |
|
||||||
|
|
||||||
<one line to give the library's name and a brief idea of what it does.> |
|
||||||
Copyright (C) <year> <name of author> |
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or |
|
||||||
modify it under the terms of the GNU Lesser General Public |
|
||||||
License as published by the Free Software Foundation; either |
|
||||||
version 2.1 of the License, or (at your option) any later version. |
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful, |
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
||||||
Lesser General Public License for more details. |
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public |
|
||||||
License along with this library; if not, write to the Free Software |
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 |
|
||||||
USA |
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail. |
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your |
|
||||||
school, if any, to sign a "copyright disclaimer" for the library, if |
|
||||||
necessary. Here is a sample; alter the names: |
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the |
|
||||||
library `Frob' (a library for tweaking knobs) written by James Random |
|
||||||
Hacker. |
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1990 |
|
||||||
Ty Coon, President of Vice |
|
||||||
|
|
||||||
That's all there is to it! |
|
||||||
|
@ -0,0 +1,224 @@ |
|||||||
|
# DFRobot_AS3935 |
||||||
|
|
||||||
|
* [English Version](./README.md) |
||||||
|
|
||||||
|
AS3935雷电传感器可以检测雷电,显示雷电的距离和强度,不受电弧和噪声的干扰 |
||||||
|
可设置为室内或室外模式 |
||||||
|
|
||||||
|
![Product Image](./resources/images/SEN0290.png) |
||||||
|
|
||||||
|
## 产品链接(https://www.dfrobot.com.cn/goods-1889.html) |
||||||
|
|
||||||
|
SKU:SEN0290 |
||||||
|
|
||||||
|
## 目录 |
||||||
|
|
||||||
|
* [概述](#概述) |
||||||
|
* [库安装](#库安装) |
||||||
|
* [方法](#方法) |
||||||
|
* [兼容性](#兼容性) |
||||||
|
* [历史](#历史) |
||||||
|
* [创作者](#创作者) |
||||||
|
|
||||||
|
## 概述 |
||||||
|
|
||||||
|
从AS3935模块中输入命令和读取数据 |
||||||
|
|
||||||
|
1. 闪电传感器对半径40公里以内的雷暴活动发出警报 |
||||||
|
2. 从头顶到风暴顶部的距离估计为40公里,每15步 |
||||||
|
3.检测云对地和云内(云对云)闪烁 |
||||||
|
4. 嵌入人工干扰抑制算法 |
||||||
|
5. 可编程检测水平使阈值设置为最佳控制 |
||||||
|
6. 三个i2c接口,自由切换避免站点冲突 |
||||||
|
|
||||||
|
## 库安装 |
||||||
|
|
||||||
|
使用此库前,请首先下载库文件,将其粘贴到\Arduino\libraries目录中,然后打开examples文件夹并在该文件夹中运行演示。 |
||||||
|
|
||||||
|
## 方法 |
||||||
|
|
||||||
|
```C++ |
||||||
|
/** |
||||||
|
* @fn begin |
||||||
|
* @brief I2C初始化 |
||||||
|
* @return uint8_t 类型, 表示初始化状态 |
||||||
|
* @retval 0 成功 |
||||||
|
* @retval 1 失败 |
||||||
|
*/ |
||||||
|
uint8_t begin(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @brief 设置 i2c 地址 |
||||||
|
* @param devAddx i2c 地址 |
||||||
|
*/ |
||||||
|
void setI2CAddress(uint8_t devAddx); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn manualCal |
||||||
|
* @brief 配置传感器 |
||||||
|
* @param capacitance 天线调谐电容(必须是8,8 - 120pf的整数倍) |
||||||
|
* @param location 室内或室外模式选择 |
||||||
|
* @param disturber 启用/禁用干扰发射机检测 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void manualCal(uint8_t capacitance, uint8_t location, uint8_t disturber); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn defInit |
||||||
|
* @brief 将寄存器重置为默认值 |
||||||
|
* @return int 类型,表示rest状态 |
||||||
|
* @return 0 成功 |
||||||
|
*/ |
||||||
|
int defInit(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn disturberEn |
||||||
|
* @brief 中断检测使能 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void disturberEn(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn disturberDis |
||||||
|
* @brief 中断检测失能 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void disturberDis(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn setIRQOutputSource |
||||||
|
* @brief 设置中断源 |
||||||
|
* @param irqSelect 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void setIRQOutputSource(uint8_t irqSelect); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn setTuningCaps |
||||||
|
* @brief 设置容量 |
||||||
|
* @param capVal 容量大小 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void setTuningCaps(uint8_t capVal); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn getInterruptSrc |
||||||
|
* @brief 获取中断源 |
||||||
|
* @return uint8_t类型,返回中断源类型 |
||||||
|
* @retval 0 没有中断 |
||||||
|
* @retval 1 闪电引起的中断 |
||||||
|
* @retval 2 干扰中断 |
||||||
|
* @retval 3 噪声量太高 |
||||||
|
*/ |
||||||
|
uint8_t getInterruptSrc(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn getLightningDistKm |
||||||
|
* @brief 获取闪电距离 |
||||||
|
* @return 闪电距离(单位公里) |
||||||
|
*/ |
||||||
|
uint8_t getLightningDistKm(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn getStrikeEnergyRaw |
||||||
|
* @brief 获取闪电能力强度 |
||||||
|
* @return 闪电能力强度(0-1000) |
||||||
|
*/ |
||||||
|
uint32_t getStrikeEnergyRaw(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn setIndoors |
||||||
|
* @brief 设置为室内模式 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void setIndoors(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn setOutdoors |
||||||
|
* @brief 设置为室外模式 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void setOutdoors(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn getNoiseFloorLvl |
||||||
|
* @brief 获取噪音等级 |
||||||
|
* @return 返回噪声等级 |
||||||
|
*/ |
||||||
|
uint8_t getNoiseFloorLvl(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn setNoiseFloorLvl |
||||||
|
* @brief 设置噪音等级 |
||||||
|
* @param nfSel 0~7,大于7将使用默认值:2 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void setNoiseFloorLvl(uint8_t nfSel); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn getWatchdogThreshold |
||||||
|
* @brief 获取干扰等级 |
||||||
|
* @return 返回干扰等级 |
||||||
|
*/ |
||||||
|
uint8_t getWatchdogThreshold(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn setWatchdogThreshold |
||||||
|
* @brief 设置干扰等级 |
||||||
|
* @param wdth 0~7,大于7将使用默认值:2 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void setWatchdogThreshold(uint8_t wdth); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn getSpikeRejection |
||||||
|
* @brief 获取 SREJ (毛刺抑制) |
||||||
|
* @return 返回SREJ值 |
||||||
|
*/ |
||||||
|
uint8_t getSpikeRejection(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn setSpikeRejection |
||||||
|
* @brief 修改 SREJ (毛刺抑制) |
||||||
|
* @param 0~7,大于7将使用默认值:2 |
||||||
|
*/ |
||||||
|
void setSpikeRejection(uint8_t srej); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn setLcoFdiv |
||||||
|
* @brief 设置 LCO_FDIV 寄存器 |
||||||
|
* @param fdiv 设置0, 1, 2或3的比率分别为16,32,64和128 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void setLcoFdiv(uint8_t fdiv); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn printAllRegs |
||||||
|
* @brief 查看注册数据 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void printAllRegs(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn powerUp |
||||||
|
* @brief 配置传感器电源 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void powerUp(void); |
||||||
|
``` |
||||||
|
## 兼容性 |
||||||
|
|
||||||
|
主板 | 通过 | 未通过 | 未测试 | 备注 |
||||||
|
------------------ | :----------: | :----------: | :---------: | ----- |
||||||
|
Arduino uno | √ | | | |
||||||
|
esp8266 | √ | | | |
||||||
|
|
||||||
|
## 历史 |
||||||
|
|
||||||
|
- 2021/09/30 - 1.0.2 版本 |
||||||
|
- 2021/08/24 - 1.0.1 版本 |
||||||
|
- 2019/09/28 - 1.0.0 版本 |
||||||
|
|
||||||
|
## 创作者 |
||||||
|
|
||||||
|
Written by TangJie(jie.Tang@dfrobot.com), 2019. (Welcome to our [website](https://www.dfrobot.com/)) |
@ -1,241 +0,0 @@ |
|||||||
import time |
|
||||||
import smbus |
|
||||||
|
|
||||||
class DFRobot_AS3935: |
|
||||||
def __init__(self, address, bus = 1): |
|
||||||
self.address = address |
|
||||||
self.i2cbus = smbus.SMBus(bus) |
|
||||||
|
|
||||||
def writeByte(self, register, value): |
|
||||||
try: |
|
||||||
self.i2cbus.write_byte_data(self.address, register, value) |
|
||||||
return 1 |
|
||||||
except: |
|
||||||
return 0 |
|
||||||
|
|
||||||
def readData(self, register): |
|
||||||
self.register = self.i2cbus.read_i2c_block_data(self.address, register) |
|
||||||
|
|
||||||
def manualCal(self, capacitance, location, disturber): |
|
||||||
self.powerUp() |
|
||||||
if location == 1: |
|
||||||
self.setIndoors() |
|
||||||
else: |
|
||||||
self.setOutdoors() |
|
||||||
|
|
||||||
if disturber == 0: |
|
||||||
self.disturberDis() |
|
||||||
else: |
|
||||||
self.disturberEn() |
|
||||||
|
|
||||||
self.setIrqOutputSource(0) |
|
||||||
time.sleep(0.5) |
|
||||||
self.setTuningCaps(capacitance) |
|
||||||
|
|
||||||
def setTuningCaps(self, capVal): |
|
||||||
#Assume only numbers divisible by 8 (because that's all the chip supports) |
|
||||||
if capVal > 120: #cap_value out of range, assume highest capacitance |
|
||||||
self.singRegWrite(0x08, 0x0F, 0x0F) #set capacitance bits to maximum |
|
||||||
else: |
|
||||||
self.singRegWrite(0x08, 0x0F, capVal >> 3) #set capacitance bits |
|
||||||
|
|
||||||
self.singRegRead(0x08) |
|
||||||
#print('capacitance set to 8x%d'%(self.register[0] & 0x0F)) |
|
||||||
|
|
||||||
def powerUp(self): |
|
||||||
#register 0x00, PWD bit: 0 (clears PWD) |
|
||||||
self.singRegWrite(0x00, 0x01, 0x00) |
|
||||||
self.calRCO() #run RCO cal cmd |
|
||||||
self.singRegWrite(0x08, 0x20, 0x20) #set DISP_SRCO to 1 |
|
||||||
time.sleep(0.002) |
|
||||||
self.singRegWrite(0x08, 0x20, 0x00) #set DISP_SRCO to 0 |
|
||||||
|
|
||||||
def powerDown(self): |
|
||||||
#register 0x00, PWD bit: 0 (sets PWD) |
|
||||||
self.singRegWrite(0x00, 0x01, 0x01) |
|
||||||
|
|
||||||
def calRCO(self): |
|
||||||
self.writeByte(0x3D, 0x96) |
|
||||||
time.sleep(0.002) |
|
||||||
|
|
||||||
def setIndoors(self): |
|
||||||
self.singRegWrite(0x00, 0x3E, 0x24) |
|
||||||
print("set to indoors model") |
|
||||||
|
|
||||||
def setOutdoors(self): |
|
||||||
self.singRegWrite(0x00, 0x3E, 0x1C) |
|
||||||
print("set to outdoors model") |
|
||||||
|
|
||||||
def disturberDis(self): |
|
||||||
#register 0x03, PWD bit: 5 (sets MASK_DIST) |
|
||||||
self.singRegWrite(0x03, 0x20, 0x20) |
|
||||||
print("disenable disturber detection") |
|
||||||
|
|
||||||
def disturberEn(self): |
|
||||||
#register 0x03, PWD bit: 5 (sets MASK_DIST) |
|
||||||
self.singRegWrite(0x03, 0x20, 0x00) |
|
||||||
print("enable disturber detection") |
|
||||||
|
|
||||||
def singRegWrite(self, regAdd, dataMask, regData): |
|
||||||
#start by reading original register data (only modifying what we need to) |
|
||||||
self.singRegRead(regAdd) |
|
||||||
#calculate new register data... 'delete' old targeted data, replace with new data |
|
||||||
#note: 'dataMask' must be bits targeted for replacement |
|
||||||
#add'l note: this function does NOT shift values into the proper place... they need to be there already |
|
||||||
newRegData = (self.register[0] & ~dataMask)|(regData & dataMask) |
|
||||||
#finally, write the data to the register |
|
||||||
self.writeByte(regAdd, newRegData) |
|
||||||
#print('wrt: %02x'%newRegData) |
|
||||||
self.singRegRead(regAdd) |
|
||||||
#print('Act: %02x'%self.register[0]) |
|
||||||
|
|
||||||
def singRegRead(self,regAdd): |
|
||||||
self.readData(regAdd) |
|
||||||
|
|
||||||
def getInterruptSrc(self): |
|
||||||
#definition of interrupt data on table 18 of datasheet |
|
||||||
#for this function: |
|
||||||
#0 = unknown src, 1 = lightning detected, 2 = disturber, 3 = Noise level too high |
|
||||||
time.sleep(0.03) #wait 3ms before reading (min 2ms per pg 22 of datasheet) |
|
||||||
self.singRegRead(0x03) #read register, get rid of non-interrupt data |
|
||||||
intSrc = self.register[0]&0x0F |
|
||||||
if intSrc == 0x08: |
|
||||||
return 1 #lightning caused interrupt |
|
||||||
elif intSrc == 0x04: |
|
||||||
return 2 #disturber detected |
|
||||||
elif intSrc == 0x01: |
|
||||||
return 3 #Noise level too high |
|
||||||
else: |
|
||||||
return 0 #interrupt result not expected |
|
||||||
|
|
||||||
def reset(self): |
|
||||||
err = self.writeByte(0x3C, 0x96) |
|
||||||
time.sleep(0.002) #wait 2ms to complete |
|
||||||
return err |
|
||||||
|
|
||||||
def setLcoFdiv(self,fdiv): |
|
||||||
self.singRegWrite(0x03, 0xC0, (fdiv & 0x03) << 6) |
|
||||||
|
|
||||||
def setIrqOutputSource(self, irqSelect): |
|
||||||
#set interrupt source - what to display on IRQ pin |
|
||||||
#reg 0x08, bits 5 (TRCO), 6 (SRCO), 7 (LCO) |
|
||||||
#only one should be set at once, I think |
|
||||||
#0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
|
||||||
if irqSelect == 1: |
|
||||||
self.singRegWrite(0x08, 0xE0, 0x20) #set only TRCO bit |
|
||||||
elif irqSelect == 2: |
|
||||||
self.singRegWrite(0x08, 0xE0, 0x40) #set only SRCO bit |
|
||||||
elif irqSelect == 3: |
|
||||||
self.singRegWrite(0x08, 0xE0, 0x80) #set only SRCO bit |
|
||||||
else: |
|
||||||
self.singRegWrite(0x08, 0xE0, 0x00) #clear IRQ pin display bits |
|
||||||
|
|
||||||
def getLightningDistKm(self): |
|
||||||
self.singRegRead(0x07) #read register, get rid of non-distance data |
|
||||||
return self.register[0]&0x3F |
|
||||||
|
|
||||||
def getStrikeEnergyRaw(self): |
|
||||||
self.singRegRead(0x06) #MMSB, shift 8 bits left, make room for MSB |
|
||||||
nrgyRaw = (self.register[0]&0x1F) << 8 |
|
||||||
self.singRegRead(0x05) #read MSB |
|
||||||
nrgyRaw |= self.register[0] |
|
||||||
nrgyRaw <<= 8 #shift 8 bits left, make room for LSB |
|
||||||
self.singRegRead(0x04) #read LSB, add to others |
|
||||||
nrgyRaw |= self.register[0] |
|
||||||
|
|
||||||
return nrgyRaw/16777 |
|
||||||
|
|
||||||
def setMinStrikes(self, minStrk): |
|
||||||
#This function sets min strikes to the closest available number, rounding to the floor, |
|
||||||
#where necessary, then returns the physical value that was set. Options are 1, 5, 9 or 16 strikes. |
|
||||||
if minStrk < 5: |
|
||||||
self.singRegWrite(0x02, 0x30, 0x00) |
|
||||||
return 1 |
|
||||||
elif minStrk < 9: |
|
||||||
self.singRegWrite(0x02, 0x30, 0x10) |
|
||||||
return 5 |
|
||||||
elif minStrk < 16: |
|
||||||
self.singRegWrite(0x02, 0x30, 0x20) |
|
||||||
return 9 |
|
||||||
else: |
|
||||||
self.singRegWrite(0x02, 0x30, 0x30) |
|
||||||
return 16 |
|
||||||
|
|
||||||
def clearStatistics(self): |
|
||||||
#clear is accomplished by toggling CL_STAT bit 'high-low-high' (then set low to move on) |
|
||||||
self.singRegWrite(0x02, 0x40, 0x40) #high |
|
||||||
self.singRegWrite(0x02, 0x40, 0x00) #low |
|
||||||
self.singRegWrite(0x02, 0x40, 0x40) #high |
|
||||||
|
|
||||||
def getNoiseFloorLv1(self): |
|
||||||
#NF settings addres 0x01, bits 6:4 |
|
||||||
#default setting of 010 at startup (datasheet, table 9) |
|
||||||
self.singRegRead(0x01) #read register 0x01 |
|
||||||
return (self.register[0] & 0x70) >> 4 #should return value from 0-7, see table 16 for info |
|
||||||
|
|
||||||
def setNoiseFloorLv1(self, nfSel): |
|
||||||
#NF settings addres 0x01, bits 6:4 |
|
||||||
#default setting of 010 at startup (datasheet, table 9) |
|
||||||
if nfSel <= 7: #nfSel within expected range |
|
||||||
self.singRegWrite(0x01, 0x70, (nfSel & 0x07) << 4) |
|
||||||
else: #out of range, set to default (power-up value 010) |
|
||||||
self.singRegWrite(0x01, 0x70, 0x20) |
|
||||||
|
|
||||||
def getWatchdogThreshold(self): |
|
||||||
#This function is used to read WDTH. It is used to increase robustness to disturbers, |
|
||||||
#though will make detection less efficient (see page 19, Fig 20 of datasheet) |
|
||||||
#WDTH register: add 0x01, bits 3:0 |
|
||||||
#default value of 0010 |
|
||||||
#values should only be between 0x00 and 0x0F (0 and 7) |
|
||||||
self.singRegRead(0x01) |
|
||||||
return self.register[0] & 0x0F |
|
||||||
|
|
||||||
def setWatchdogThreshold(self, wdth): |
|
||||||
#This function is used to modify WDTH. It is used to increase robustness to disturbers, |
|
||||||
#though will make detection less efficient (see page 19, Fig 20 of datasheet) |
|
||||||
#WDTH register: add 0x01, bits 3:0 |
|
||||||
#default value of 0010 |
|
||||||
#values should only be between 0x00 and 0x0F (0 and 7) |
|
||||||
self.singRegWrite(0x01, 0x0F, wdth & 0x0F) |
|
||||||
|
|
||||||
def getSpikeRejection(self): |
|
||||||
#This function is used to read SREJ (spike rejection). Similar to the Watchdog threshold, |
|
||||||
#it is used to make the system more robust to disturbers, though will make general detection |
|
||||||
#less efficient (see page 20-21, especially Fig 21 of datasheet) |
|
||||||
#SREJ register: add 0x02, bits 3:0 |
|
||||||
#default value of 0010 |
|
||||||
#values should only be between 0x00 and 0x0F (0 and 7) |
|
||||||
self.singRegRead(0x02) |
|
||||||
return self.register[0] & 0x0F |
|
||||||
|
|
||||||
def setSpikeRejection(self, srej): |
|
||||||
#This function is used to modify SREJ (spike rejection). Similar to the Watchdog threshold, |
|
||||||
#it is used to make the system more robust to disturbers, though will make general detection |
|
||||||
#less efficient (see page 20-21, especially Fig 21 of datasheet) |
|
||||||
#WDTH register: add 0x02, bits 3:0 |
|
||||||
#default value of 0010 |
|
||||||
#values should only be between 0x00 and 0x0F (0 and 7) |
|
||||||
self.singRegWrite(0x02, 0x0F, srej & 0x0F) |
|
||||||
|
|
||||||
def printAllRegs(self): |
|
||||||
self.singRegRead(0x00) |
|
||||||
print("Reg 0x00: %02x"%self.register[0]) |
|
||||||
self.singRegRead(0x01) |
|
||||||
print("Reg 0x01: %02x"%self.register[0]) |
|
||||||
self.singRegRead(0x02) |
|
||||||
print("Reg 0x02: %02x"%self.register[0]) |
|
||||||
self.singRegRead(0x03) |
|
||||||
print("Reg 0x03: %02x"%self.register[0]) |
|
||||||
self.singRegRead(0x04) |
|
||||||
print("Reg 0x04: %02x"%self.register[0]) |
|
||||||
self.singRegRead(0x05) |
|
||||||
print("Reg 0x05: %02x"%self.register[0]) |
|
||||||
self.singRegRead(0x06) |
|
||||||
print("Reg 0x06: %02x"%self.register[0]) |
|
||||||
self.singRegRead(0x07) |
|
||||||
print("Reg 0x07: %02x"%self.register[0]) |
|
||||||
self.singRegRead(0x08) |
|
||||||
print("Reg 0x08: %02x"%self.register[0]) |
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,158 +0,0 @@ |
|||||||
## DFRobot_AS3935_Lib.py Library for Raspberry pi |
|
||||||
--------------------------------------------------------- |
|
||||||
This is the sample code for Gravity:Lightning Sensor, SKU: SEN0292. |
|
||||||
## Table of Contents |
|
||||||
|
|
||||||
* [Installation](#installation) |
|
||||||
* [Methods](#methods) |
|
||||||
<snippet> |
|
||||||
<content> |
|
||||||
|
|
||||||
## Installation |
|
||||||
The Lightning Sensor should work with AS3935 |
|
||||||
(https://github.com/DFRobot/DFRobot_AS3935/tree/master/RaspberryPi/Python) |
|
||||||
|
|
||||||
Run the program: |
|
||||||
|
|
||||||
```cpp |
|
||||||
|
|
||||||
$> python DFRobot_AS3935.py |
|
||||||
|
|
||||||
``` |
|
||||||
## Methods |
|
||||||
|
|
||||||
```C++ |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Init The Lightning Sensor |
|
||||||
* |
|
||||||
* @param address I2C address(1~3) |
|
||||||
* bus I2C bus |
|
||||||
*/ |
|
||||||
DFRobot_AS3935(address, bus); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Sensor reset |
|
||||||
*/ |
|
||||||
def reset(self); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Configure sensor |
|
||||||
* |
|
||||||
* @param capacitance Antenna tuning capcitance (must be integer multiple of 8, 8 - 120 pf) |
|
||||||
* location Indoor/outdoor mode selection |
|
||||||
* disturber Enable/disable disturber detection |
|
||||||
*/ |
|
||||||
def manualCal(self, capacitance, location, disturber); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Get mid-range type |
|
||||||
* |
|
||||||
* @return 0 Unknown src |
|
||||||
* 1 Lightning detected |
|
||||||
* 2 Disturber |
|
||||||
* 3 Noise level too high |
|
||||||
*/ |
|
||||||
def getInterruptSrc(self); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief get lightning distance |
|
||||||
* |
|
||||||
* @return unit kilometer |
|
||||||
*/ |
|
||||||
def getLightningDistKm(self); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief get lightning energy intensity |
|
||||||
* |
|
||||||
* @return lightning energy intensity(0-1000) |
|
||||||
*/ |
|
||||||
def getStrikeEnergyRaw(self); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Sets LCO_FDIV register |
|
||||||
* |
|
||||||
* @param fdiv Set 0, 1, 2 or 3 for ratios of 16, 32, 64 and 128, respectively |
|
||||||
*/ |
|
||||||
def setLcoFdiv(self,fdiv); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Set interrupt source |
|
||||||
* |
|
||||||
* @param irqSelect 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
|
||||||
*/ |
|
||||||
def setIrqOutputSource(self, irqSelect); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Set to the outdoor model |
|
||||||
*/ |
|
||||||
def setOutdoors(self); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Set to the indoor model |
|
||||||
*/ |
|
||||||
def setIndoors(self); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Disturber detection enabled |
|
||||||
*/ |
|
||||||
def disturberEn(self); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Disturber detection disenabled |
|
||||||
*/ |
|
||||||
def disturberDis(self); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Set the noise level |
|
||||||
* |
|
||||||
* @param 0~7,More than 7 will use the default value:2 |
|
||||||
*/ |
|
||||||
def setNoiseFloorLv1(self, nfSel); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Get the noise level |
|
||||||
* |
|
||||||
* @return 0~7 |
|
||||||
*/ |
|
||||||
def getNoiseFloorLv1(self); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Set an anti-interference rating |
|
||||||
* |
|
||||||
* @param 0~7,More than 7 will use the default value:2 |
|
||||||
*/ |
|
||||||
def setWatchdogThreshold(self, wdth); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief read WDTH |
|
||||||
* |
|
||||||
* @return 0~7 |
|
||||||
*/ |
|
||||||
def getWatchdogThreshold(self); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief Modify SREJ (spike rejection) |
|
||||||
* |
|
||||||
* @param 0~7,More than 7 will use the default value:2 |
|
||||||
*/ |
|
||||||
def setSpikeRejection(self, srej); |
|
||||||
|
|
||||||
/* |
|
||||||
* @brief read SREJ (spike rejection) |
|
||||||
* |
|
||||||
* @return 0~7 |
|
||||||
*/ |
|
||||||
def getSpikeRejection(self); |
|
||||||
|
|
||||||
``` |
|
||||||
## Credits |
|
||||||
|
|
||||||
Written by DFRobot_JH, 2018. (Welcome to our [website](https://www.dfrobot.com/)) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,108 +0,0 @@ |
|||||||
# file DFRobot_AS3935_detailed.py |
|
||||||
# |
|
||||||
# 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 = 1 A1 = 0 |
|
||||||
# AS3935_ADD2 0x02 A0 = 0 A1 = 1 |
|
||||||
# AS3935_ADD3 0x03 A0 = 1 A1 = 1 |
|
||||||
# |
|
||||||
# |
|
||||||
# Copyright [DFRobot](http://www.dfrobot.com), 2018 |
|
||||||
# Copyright GNU Lesser General Public License |
|
||||||
# |
|
||||||
# version V1.0 |
|
||||||
# date 2018-11-28 |
|
||||||
|
|
||||||
import sys |
|
||||||
sys.path.append('../') |
|
||||||
import time |
|
||||||
from DFRobot_AS3935_Lib import DFRobot_AS3935 |
|
||||||
import RPi.GPIO as GPIO |
|
||||||
from datetime import datetime |
|
||||||
|
|
||||||
#I2C address |
|
||||||
AS3935_I2C_ADDR1 = 0X01 |
|
||||||
AS3935_I2C_ADDR2 = 0X02 |
|
||||||
AS3935_I2C_ADDR3 = 0X03 |
|
||||||
|
|
||||||
#Antenna tuning capcitance (must be integer multiple of 8, 8 - 120 pf) |
|
||||||
AS3935_CAPACITANCE = 96 |
|
||||||
IRQ_PIN = 7 |
|
||||||
|
|
||||||
GPIO.setmode(GPIO.BOARD) |
|
||||||
|
|
||||||
sensor = DFRobot_AS3935(AS3935_I2C_ADDR3, bus = 1) |
|
||||||
if (sensor.reset()): |
|
||||||
print("init sensor sucess.") |
|
||||||
else: |
|
||||||
print("init sensor fail") |
|
||||||
while True: |
|
||||||
pass |
|
||||||
#Configure sensor |
|
||||||
sensor.powerUp() |
|
||||||
|
|
||||||
#set indoors or outdoors models |
|
||||||
sensor.setIndoors() |
|
||||||
#sensor.setOutdoors() |
|
||||||
|
|
||||||
#disturber detection |
|
||||||
sensor.disturberEn() |
|
||||||
#sensor.disturberDis() |
|
||||||
|
|
||||||
sensor.setIrqOutputSource(0) |
|
||||||
time.sleep(0.5) |
|
||||||
#set capacitance |
|
||||||
sensor.setTuningCaps(AS3935_CAPACITANCE) |
|
||||||
|
|
||||||
# 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 plus 3.5% to 500/16 kHz minus 3.5% |
|
||||||
# |
|
||||||
# sensor.setLcoFdiv(0) |
|
||||||
# sensor.setIrqOutputSource(3) |
|
||||||
|
|
||||||
#Set the noise level,use a default value greater than 7 |
|
||||||
sensor.setNoiseFloorLv1(2) |
|
||||||
#noiseLv = sensor.getNoiseFloorLv1() |
|
||||||
|
|
||||||
#used to modify WDTH,alues should only be between 0x00 and 0x0F (0 and 7) |
|
||||||
sensor.setWatchdogThreshold(2) |
|
||||||
#wtdgThreshold = sensor.getWatchdogThreshold() |
|
||||||
|
|
||||||
#used to modify SREJ (spike rejection),values should only be between 0x00 and 0x0F (0 and 7) |
|
||||||
sensor.setSpikeRejection(2) |
|
||||||
#spikeRejection = sensor.getSpikeRejection() |
|
||||||
|
|
||||||
#view all register data |
|
||||||
#sensor.printAllRegs() |
|
||||||
|
|
||||||
def callback_handle(channel): |
|
||||||
global sensor |
|
||||||
time.sleep(0.005) |
|
||||||
intSrc = sensor.getInterruptSrc() |
|
||||||
if intSrc == 1: |
|
||||||
lightningDistKm = sensor.getLightningDistKm() |
|
||||||
print('Lightning occurs!') |
|
||||||
print('Distance: %dkm'%lightningDistKm) |
|
||||||
|
|
||||||
lightningEnergyVal = sensor.getStrikeEnergyRaw() |
|
||||||
print('Intensity: %d '%lightningEnergyVal) |
|
||||||
elif intSrc == 2: |
|
||||||
print('Disturber discovered!') |
|
||||||
elif intSrc == 3: |
|
||||||
print('Noise level too high!') |
|
||||||
else: |
|
||||||
pass |
|
||||||
#Set to input mode |
|
||||||
GPIO.setup(IRQ_PIN, GPIO.IN) |
|
||||||
#Set the interrupt pin, the interrupt function, rising along the trigger |
|
||||||
GPIO.add_event_detect(IRQ_PIN, GPIO.RISING, callback = callback_handle) |
|
||||||
print("start lightning detect.") |
|
||||||
|
|
||||||
while True: |
|
||||||
time.sleep(1.0) |
|
||||||
|
|
||||||
|
|
@ -1,94 +0,0 @@ |
|||||||
# file DFRobot_AS3935_ordinary.py |
|
||||||
# |
|
||||||
# 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 = 1 A1 = 0 |
|
||||||
# AS3935_ADD2 0x02 A0 = 0 A1 = 1 |
|
||||||
# AS3935_ADD3 0x03 A0 = 1 A1 = 1 |
|
||||||
# |
|
||||||
# |
|
||||||
# Copyright [DFRobot](http://www.dfrobot.com), 2018 |
|
||||||
# Copyright GNU Lesser General Public License |
|
||||||
# |
|
||||||
# version V1.0 |
|
||||||
# date 2018-11-28 |
|
||||||
|
|
||||||
import sys |
|
||||||
sys.path.append('../') |
|
||||||
import time |
|
||||||
from DFRobot_AS3935_Lib import DFRobot_AS3935 |
|
||||||
import RPi.GPIO as GPIO |
|
||||||
from datetime import datetime |
|
||||||
|
|
||||||
#I2C address |
|
||||||
AS3935_I2C_ADDR1 = 0X01 |
|
||||||
AS3935_I2C_ADDR2 = 0X02 |
|
||||||
AS3935_I2C_ADDR3 = 0X03 |
|
||||||
|
|
||||||
#Antenna tuning capcitance (must be integer multiple of 8, 8 - 120 pf) |
|
||||||
AS3935_CAPACITANCE = 96 |
|
||||||
IRQ_PIN = 7 |
|
||||||
|
|
||||||
#Indoor/outdoor mode selection |
|
||||||
AS3935_INDOORS = 0 |
|
||||||
AS3935_OUTDOORS = 1 |
|
||||||
AS3935_MODE = AS3935_INDOORS |
|
||||||
|
|
||||||
#Enable/disable disturber detection |
|
||||||
AS3935_DIST_DIS = 0 |
|
||||||
AS3935_DIST_EN = 1 |
|
||||||
AS3935_DIST = AS3935_DIST_EN |
|
||||||
|
|
||||||
GPIO.setmode(GPIO.BOARD) |
|
||||||
|
|
||||||
sensor = DFRobot_AS3935(AS3935_I2C_ADDR3, bus = 1) |
|
||||||
if (sensor.reset()): |
|
||||||
print("init sensor sucess.") |
|
||||||
else: |
|
||||||
print("init sensor fail") |
|
||||||
while True: |
|
||||||
pass |
|
||||||
|
|
||||||
#Configure sensor |
|
||||||
sensor.manualCal(AS3935_CAPACITANCE, AS3935_MODE, AS3935_DIST) |
|
||||||
|
|
||||||
# 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 plus 3.5% to 500/16 kHz minus 3.5% |
|
||||||
# |
|
||||||
# sensor.setLcoFdiv(0) |
|
||||||
# sensor.setIrqOutputSource(3) |
|
||||||
|
|
||||||
#view all register data |
|
||||||
#sensor.printAllRegs() |
|
||||||
|
|
||||||
def callback_handle(channel): |
|
||||||
global sensor |
|
||||||
time.sleep(0.005) |
|
||||||
intSrc = sensor.getInterruptSrc() |
|
||||||
if intSrc == 1: |
|
||||||
lightningDistKm = sensor.getLightningDistKm() |
|
||||||
print('Lightning occurs!') |
|
||||||
print('Distance: %dkm'%lightningDistKm) |
|
||||||
|
|
||||||
lightningEnergyVal = sensor.getStrikeEnergyRaw() |
|
||||||
print('Intensity: %d '%lightningEnergyVal) |
|
||||||
elif intSrc == 2: |
|
||||||
print('Disturber discovered!') |
|
||||||
elif intSrc == 3: |
|
||||||
print('Noise level too high!') |
|
||||||
else: |
|
||||||
pass |
|
||||||
#Set to input mode |
|
||||||
GPIO.setup(IRQ_PIN, GPIO.IN) |
|
||||||
#Set the interrupt pin, the interrupt function, rising along the trigger |
|
||||||
GPIO.add_event_detect(IRQ_PIN, GPIO.RISING, callback = callback_handle) |
|
||||||
print("start lightning detect.") |
|
||||||
|
|
||||||
while True: |
|
||||||
time.sleep(1.0) |
|
||||||
|
|
||||||
|
|
@ -0,0 +1,9 @@ |
|||||||
|
name=DFRobot_AS3935 |
||||||
|
version=1.0.2 |
||||||
|
author=DFRobot |
||||||
|
maintainer=TangJie <jie.tang@dfrobot.com> |
||||||
|
sentence=DFRobot Lightning Sensor library.(SKU:SEN0290) |
||||||
|
paragraph=DFRobot_AS3935 is the lightning sensor library of DFRobot. |
||||||
|
category=Sensors |
||||||
|
url=https://github.com/DFRobot/DFRobot_AS3935 |
||||||
|
architectures=* |
@ -0,0 +1,319 @@ |
|||||||
|
'''! |
||||||
|
@file DFRobot_AS3935_Lib.py |
||||||
|
@brief Define the DFRobot_AS3935 class infrastructure, the implementation of the base method |
||||||
|
@copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) |
||||||
|
@license The MIT License (MIT) |
||||||
|
@author TangJie(jie.tamg@dfrobot.com) |
||||||
|
@version V1.0.2 |
||||||
|
@date 2021-9-28 |
||||||
|
@url https://github.com/DFRobot/DFRobot_AS3935 |
||||||
|
''' |
||||||
|
import time |
||||||
|
import smbus |
||||||
|
|
||||||
|
class DFRobot_AS3935: |
||||||
|
def __init__(self, address, bus = 1): |
||||||
|
self.address = address |
||||||
|
self.i2cbus = smbus.SMBus(bus) |
||||||
|
|
||||||
|
def write_byte(self, register, value): |
||||||
|
try: |
||||||
|
self.i2cbus.write_byte_data(self.address, register, value) |
||||||
|
return 1 |
||||||
|
except: |
||||||
|
return 0 |
||||||
|
|
||||||
|
def read_data(self, register): |
||||||
|
self.register = self.i2cbus.read_i2c_block_data(self.address, register) |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Configure sensor |
||||||
|
@param capacitance Antenna tuning capcitance (must be integer multiple of 8, 8 - 120 pf) |
||||||
|
@param location Indoor/outdoor mode selection |
||||||
|
@param disturber Enable/disable disturber detection |
||||||
|
''' |
||||||
|
def manual_cal(self, capacitance, location, disturber): |
||||||
|
self.powerUp() |
||||||
|
if location == 1: |
||||||
|
self.setIndoors() |
||||||
|
else: |
||||||
|
self.setOutdoors() |
||||||
|
|
||||||
|
if disturber == 0: |
||||||
|
self.disturberDis() |
||||||
|
else: |
||||||
|
self.disturberEn() |
||||||
|
|
||||||
|
self.setIrqOutputSource(0) |
||||||
|
time.sleep(0.5) |
||||||
|
self.setTuningCaps(capacitance) |
||||||
|
|
||||||
|
def set_tuning_caps(self, capVal): |
||||||
|
#Assume only numbers divisible by 8 (because that's all the chip supports) |
||||||
|
if capVal > 120: #cap_value out of range, assume highest capacitance |
||||||
|
self.singRegWrite(0x08, 0x0F, 0x0F) #set capacitance bits to maximum |
||||||
|
else: |
||||||
|
self.singRegWrite(0x08, 0x0F, capVal >> 3) #set capacitance bits |
||||||
|
self.singRegRead(0x08) |
||||||
|
#print('capacitance set to 8x%d'%(self.register[0] & 0x0F)) |
||||||
|
|
||||||
|
def power_up(self): |
||||||
|
#register 0x00, PWD bit: 0 (clears PWD) |
||||||
|
self.singRegWrite(0x00, 0x01, 0x00) |
||||||
|
self.calRCO() #run RCO cal cmd |
||||||
|
self.singRegWrite(0x08, 0x20, 0x20) #set DISP_SRCO to 1 |
||||||
|
time.sleep(0.002) |
||||||
|
self.singRegWrite(0x08, 0x20, 0x00) #set DISP_SRCO to 0 |
||||||
|
|
||||||
|
def power_down(self): |
||||||
|
#register 0x00, PWD bit: 0 (sets PWD) |
||||||
|
self.singRegWrite(0x00, 0x01, 0x01) |
||||||
|
|
||||||
|
def cal_RCO(self): |
||||||
|
self.writeByte(0x3D, 0x96) |
||||||
|
time.sleep(0.002) |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Disturber detection enabled |
||||||
|
''' |
||||||
|
def set_indoors(self): |
||||||
|
self.singRegWrite(0x00, 0x3E, 0x24) |
||||||
|
print("set to indoors model") |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Set to the outdoor model |
||||||
|
''' |
||||||
|
def set_outdoors(self): |
||||||
|
self.singRegWrite(0x00, 0x3E, 0x1C) |
||||||
|
print("set to outdoors model") |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Disturber detection disenabled |
||||||
|
''' |
||||||
|
def disturber_dis(self): |
||||||
|
#register 0x03, PWD bit: 5 (sets MASK_DIST) |
||||||
|
self.singRegWrite(0x03, 0x20, 0x20) |
||||||
|
print("disenable disturber detection") |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Disturber detection enabled |
||||||
|
''' |
||||||
|
def disturber_en(self): |
||||||
|
#register 0x03, PWD bit: 5 (sets MASK_DIST) |
||||||
|
self.singRegWrite(0x03, 0x20, 0x00) |
||||||
|
print("enable disturber detection") |
||||||
|
|
||||||
|
def sing_reg_write(self, regAdd, dataMask, regData): |
||||||
|
#start by reading original register data (only modifying what we need to) |
||||||
|
self.singRegRead(regAdd) |
||||||
|
#calculate new register data... 'delete' old targeted data, replace with new data |
||||||
|
#note: 'dataMask' must be bits targeted for replacement |
||||||
|
#add'l note: this function does NOT shift values into the proper place... they need to be there already |
||||||
|
newRegData = (self.register[0] & ~dataMask)|(regData & dataMask) |
||||||
|
#finally, write the data to the register |
||||||
|
self.writeByte(regAdd, newRegData) |
||||||
|
#print('wrt: %02x'%newRegData) |
||||||
|
self.singRegRead(regAdd) |
||||||
|
#print('Act: %02x'%self.register[0]) |
||||||
|
|
||||||
|
def sing_reg_read(self,regAdd): |
||||||
|
self.readData(regAdd) |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Get mid-range type |
||||||
|
@return Return to interrupted state |
||||||
|
@retval 0 Unknown src |
||||||
|
@retval 1 Lightning detected |
||||||
|
@retval 2 Disturber |
||||||
|
@retval 3 Noise level too high |
||||||
|
''' |
||||||
|
def get_interrupt_src(self): |
||||||
|
#definition of interrupt data on table 18 of datasheet |
||||||
|
#for this function: |
||||||
|
#0 = unknown src, 1 = lightning detected, 2 = disturber, 3 = Noise level too high |
||||||
|
time.sleep(0.03) #wait 3ms before reading (min 2ms per pg 22 of datasheet) |
||||||
|
self.singRegRead(0x03) #read register, get rid of non-interrupt data |
||||||
|
intSrc = self.register[0]&0x0F |
||||||
|
if intSrc == 0x08: |
||||||
|
return 1 #lightning caused interrupt |
||||||
|
elif intSrc == 0x04: |
||||||
|
return 2 #disturber detected |
||||||
|
elif intSrc == 0x01: |
||||||
|
return 3 #Noise level too high |
||||||
|
else: |
||||||
|
return 0 #interrupt result not expected |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Sensor reset |
||||||
|
''' |
||||||
|
def reset(self): |
||||||
|
err = self.writeByte(0x3C, 0x96) |
||||||
|
time.sleep(0.002) #wait 2ms to complete |
||||||
|
return err |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Sets LCO_FDIV register |
||||||
|
@param fdiv Set 0, 1, 2 or 3 for ratios of 16, 32, 64 and 128, respectively |
||||||
|
''' |
||||||
|
def set_lco_fdiv(self,fdiv): |
||||||
|
self.singRegWrite(0x03, 0xC0, (fdiv & 0x03) << 6) |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Set interrupt source |
||||||
|
@param irqSelect 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
||||||
|
''' |
||||||
|
def set_irq_output_source(self, irqSelect): |
||||||
|
#set interrupt source - what to display on IRQ pin |
||||||
|
#reg 0x08, bits 5 (TRCO), 6 (SRCO), 7 (LCO) |
||||||
|
#only one should be set at once, I think |
||||||
|
#0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
||||||
|
if irqSelect == 1: |
||||||
|
self.singRegWrite(0x08, 0xE0, 0x20) #set only TRCO bit |
||||||
|
elif irqSelect == 2: |
||||||
|
self.singRegWrite(0x08, 0xE0, 0x40) #set only SRCO bit |
||||||
|
elif irqSelect == 3: |
||||||
|
self.singRegWrite(0x08, 0xE0, 0x80) #set only SRCO bit |
||||||
|
else: |
||||||
|
self.singRegWrite(0x08, 0xE0, 0x00) #clear IRQ pin display bits |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief get lightning distance |
||||||
|
@return unit kilometer |
||||||
|
''' |
||||||
|
def get_lightning_distKm(self): |
||||||
|
self.singRegRead(0x07) #read register, get rid of non-distance data |
||||||
|
return self.register[0]&0x3F |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief get lightning energy intensity |
||||||
|
@return lightning energy intensity(0-1000) |
||||||
|
''' |
||||||
|
def get_strike_energy_raw(self): |
||||||
|
self.singRegRead(0x06) #MMSB, shift 8 bits left, make room for MSB |
||||||
|
nrgyRaw = (self.register[0]&0x1F) << 8 |
||||||
|
self.singRegRead(0x05) #read MSB |
||||||
|
nrgyRaw |= self.register[0] |
||||||
|
nrgyRaw <<= 8 #shift 8 bits left, make room for LSB |
||||||
|
self.singRegRead(0x04) #read LSB, add to others |
||||||
|
nrgyRaw |= self.register[0] |
||||||
|
|
||||||
|
return nrgyRaw/16777 |
||||||
|
|
||||||
|
def set_min_strikes(self, minStrk): |
||||||
|
#This function sets min strikes to the closest available number, rounding to the floor, |
||||||
|
#where necessary, then returns the physical value that was set. Options are 1, 5, 9 or 16 strikes. |
||||||
|
if minStrk < 5: |
||||||
|
self.singRegWrite(0x02, 0x30, 0x00) |
||||||
|
return 1 |
||||||
|
elif minStrk < 9: |
||||||
|
self.singRegWrite(0x02, 0x30, 0x10) |
||||||
|
return 5 |
||||||
|
elif minStrk < 16: |
||||||
|
self.singRegWrite(0x02, 0x30, 0x20) |
||||||
|
return 9 |
||||||
|
else: |
||||||
|
self.singRegWrite(0x02, 0x30, 0x30) |
||||||
|
return 16 |
||||||
|
|
||||||
|
def clear_statistics(self): |
||||||
|
#clear is accomplished by toggling CL_STAT bit 'high-low-high' (then set low to move on) |
||||||
|
self.singRegWrite(0x02, 0x40, 0x40) #high |
||||||
|
self.singRegWrite(0x02, 0x40, 0x00) #low |
||||||
|
self.singRegWrite(0x02, 0x40, 0x40) #high |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Get the noise level |
||||||
|
@return 0~7 |
||||||
|
''' |
||||||
|
def get_noise_floor_lv1(self): |
||||||
|
#NF settings addres 0x01, bits 6:4 |
||||||
|
#default setting of 010 at startup (datasheet, table 9) |
||||||
|
self.singRegRead(0x01) #read register 0x01 |
||||||
|
return (self.register[0] & 0x70) >> 4 #should return value from 0-7, see table 16 for info |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Set the noise level |
||||||
|
@param 0~7,More than 7 will use the default value:2 |
||||||
|
''' |
||||||
|
def set_noise_floor_lv1(self, nfSel): |
||||||
|
#NF settings addres 0x01, bits 6:4 |
||||||
|
#default setting of 010 at startup (datasheet, table 9) |
||||||
|
if nfSel <= 7: #nfSel within expected range |
||||||
|
self.singRegWrite(0x01, 0x70, (nfSel & 0x07) << 4) |
||||||
|
else: #out of range, set to default (power-up value 010) |
||||||
|
self.singRegWrite(0x01, 0x70, 0x20) |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief read WDTH |
||||||
|
@return Return interference level |
||||||
|
''' |
||||||
|
def get_watchdog_threshold(self): |
||||||
|
#This function is used to read WDTH. It is used to increase robustness to disturbers, |
||||||
|
#though will make detection less efficient (see page 19, Fig 20 of datasheet) |
||||||
|
#WDTH register: add 0x01, bits 3:0 |
||||||
|
#default value of 0010 |
||||||
|
#values should only be between 0x00 and 0x0F (0 and 7) |
||||||
|
self.singRegRead(0x01) |
||||||
|
return self.register[0] & 0x0F |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Set an anti-interference rating |
||||||
|
@param 0~7,More than 7 will use the default value:2 |
||||||
|
''' |
||||||
|
def set_watchdog_threshold(self, wdth): |
||||||
|
#This function is used to modify WDTH. It is used to increase robustness to disturbers, |
||||||
|
#though will make detection less efficient (see page 19, Fig 20 of datasheet) |
||||||
|
#WDTH register: add 0x01, bits 3:0 |
||||||
|
#default value of 0010 |
||||||
|
#values should only be between 0x00 and 0x0F (0 and 7) |
||||||
|
self.singRegWrite(0x01, 0x0F, wdth & 0x0F) |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief read SREJ (spike rejection) |
||||||
|
@return Return SREJ value |
||||||
|
''' |
||||||
|
def get_spike_rejection(self): |
||||||
|
#This function is used to read SREJ (spike rejection). Similar to the Watchdog threshold, |
||||||
|
#it is used to make the system more robust to disturbers, though will make general detection |
||||||
|
#less efficient (see page 20-21, especially Fig 21 of datasheet) |
||||||
|
#SREJ register: add 0x02, bits 3:0 |
||||||
|
#default value of 0010 |
||||||
|
#values should only be between 0x00 and 0x0F (0 and 7) |
||||||
|
self.singRegRead(0x02) |
||||||
|
return self.register[0] & 0x0F |
||||||
|
|
||||||
|
'''! |
||||||
|
@brief Modify SREJ (spike rejection) |
||||||
|
@param 0~7,More than 7 will use the default value:2 |
||||||
|
''' |
||||||
|
def set_spike_rejection(self, srej): |
||||||
|
#This function is used to modify SREJ (spike rejection). Similar to the Watchdog threshold, |
||||||
|
#it is used to make the system more robust to disturbers, though will make general detection |
||||||
|
#less efficient (see page 20-21, especially Fig 21 of datasheet) |
||||||
|
#WDTH register: add 0x02, bits 3:0 |
||||||
|
#default value of 0010 |
||||||
|
#values should only be between 0x00 and 0x0F (0 and 7) |
||||||
|
self.singRegWrite(0x02, 0x0F, srej & 0x0F) |
||||||
|
|
||||||
|
def print_all_regs(self): |
||||||
|
self.singRegRead(0x00) |
||||||
|
print("Reg 0x00: %02x"%self.register[0]) |
||||||
|
self.singRegRead(0x01) |
||||||
|
print("Reg 0x01: %02x"%self.register[0]) |
||||||
|
self.singRegRead(0x02) |
||||||
|
print("Reg 0x02: %02x"%self.register[0]) |
||||||
|
self.singRegRead(0x03) |
||||||
|
print("Reg 0x03: %02x"%self.register[0]) |
||||||
|
self.singRegRead(0x04) |
||||||
|
print("Reg 0x04: %02x"%self.register[0]) |
||||||
|
self.singRegRead(0x05) |
||||||
|
print("Reg 0x05: %02x"%self.register[0]) |
||||||
|
self.singRegRead(0x06) |
||||||
|
print("Reg 0x06: %02x"%self.register[0]) |
||||||
|
self.singRegRead(0x07) |
||||||
|
print("Reg 0x07: %02x"%self.register[0]) |
||||||
|
self.singRegRead(0x08) |
||||||
|
print("Reg 0x08: %02x"%self.register[0]) |
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,179 @@ |
|||||||
|
# DFRobot_AS3935 |
||||||
|
|
||||||
|
* [中文版](./README_CN.md) |
||||||
|
|
||||||
|
AS3935 Lightning 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. |
||||||
|
|
||||||
|
![Product Image](./resources/images/SEN0290.png) |
||||||
|
|
||||||
|
## 产品链接(https://www.dfrobot.com/product-1828.html) |
||||||
|
|
||||||
|
SKU:SEN0290 |
||||||
|
|
||||||
|
## Table of Contents |
||||||
|
|
||||||
|
* [Summary](#summary) |
||||||
|
* [Installation](#Installation) |
||||||
|
* [Methods](#Methods) |
||||||
|
* [Compatibility](#compatibility) |
||||||
|
* [History](#history) |
||||||
|
* [Credits](#credits) |
||||||
|
|
||||||
|
## Summary |
||||||
|
|
||||||
|
Input commands and read data from AS3935 modules |
||||||
|
|
||||||
|
1. Lightning sensor warns of lightning storm activity within a radius of 40km |
||||||
|
2. Distance estimation to the head of the storm from overhead to 40km in 15 steps |
||||||
|
3. Detects both cloud-to-ground and intra-cloud(cloud-to-cloud) flashes |
||||||
|
4. Embedded man-made disturber rejection algorithm |
||||||
|
5. Programmable detection levels enable threshold setting for optimal controls |
||||||
|
6. Three i2c interfaces, switch freely to avoid site conflicts |
||||||
|
|
||||||
|
## Installation |
||||||
|
|
||||||
|
To use the library, first download it to Raspberry Pi, then open the routines folder.To execute a routine demox.py, type Python demox.py on the command line.For example, to execute the control_LEd.py routine, you need to enter: |
||||||
|
|
||||||
|
```python |
||||||
|
python DFRobot_AS3935_detailed.py |
||||||
|
``` |
||||||
|
|
||||||
|
## Methods |
||||||
|
|
||||||
|
```python |
||||||
|
''' |
||||||
|
@brief Sensor reset |
||||||
|
''' |
||||||
|
def reset(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Configure sensor |
||||||
|
@param capacitance Antenna tuning capcitance (must be integer multiple of 8, 8 - 120 pf) |
||||||
|
@param location Indoor/outdoor mode selection |
||||||
|
@param disturber Enable/disable disturber detection |
||||||
|
''' |
||||||
|
def manual_cal(self, capacitance, location, disturber); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Get mid-range type |
||||||
|
@return Return to interrupted state |
||||||
|
@retval 0 Unknown src |
||||||
|
@retval 1 Lightning detected |
||||||
|
@retval 2 Disturber |
||||||
|
@retval 3 Noise level too high |
||||||
|
''' |
||||||
|
def get_interrupt_src(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief get lightning distance |
||||||
|
@return unit kilometer |
||||||
|
''' |
||||||
|
def get_lightning_distKm(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief get lightning energy intensity |
||||||
|
@return lightning energy intensity(0-1000) |
||||||
|
''' |
||||||
|
def get_strike_energy_raw(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Sets LCO_FDIV register |
||||||
|
@param fdiv Set 0, 1, 2 or 3 for ratios of 16, 32, 64 and 128, respectively |
||||||
|
''' |
||||||
|
def set_lco_fdiv(self,fdiv); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Set interrupt source |
||||||
|
@param irqSelect 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
||||||
|
''' |
||||||
|
def set_irq_output_source(self, irqSelect); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Set to the outdoor model |
||||||
|
''' |
||||||
|
def set_outdoors(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Set to the indoor model |
||||||
|
''' |
||||||
|
def set_indoors(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Disturber detection enabled |
||||||
|
''' |
||||||
|
def disturber_en(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Disturber detection disenabled |
||||||
|
''' |
||||||
|
def disturber_dis(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Set the noise level |
||||||
|
@param 0~7,More than 7 will use the default value:2 |
||||||
|
''' |
||||||
|
def set_noise_floor_lv1(self, nfSel); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Get the noise level |
||||||
|
@return 0~7 |
||||||
|
''' |
||||||
|
def get_noise_floor_lv1(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Set an anti-interference rating |
||||||
|
@param 0~7,More than 7 will use the default value:2 |
||||||
|
''' |
||||||
|
def set_watchdog_threshold(self, wdth); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief read WDTH |
||||||
|
@return 0~7 |
||||||
|
''' |
||||||
|
def get_watchdog_threshold(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Modify SREJ (spike rejection) |
||||||
|
@param 0~7,More than 7 will use the default value:2 |
||||||
|
''' |
||||||
|
def set_spike_rejection(self, srej); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief read SREJ (spike rejection) |
||||||
|
@return 0~7 |
||||||
|
''' |
||||||
|
def get_spike_rejection(self); |
||||||
|
``` |
||||||
|
## Compatibility |
||||||
|
|
||||||
|
* RaspberryPi Version |
||||||
|
|
||||||
|
| Board | Work Well | Work Wrong | Untested | Remarks | |
||||||
|
| ------------ | :-------: | :--------: | :------: | ------- | |
||||||
|
| RaspberryPi2 | | | √ | | |
||||||
|
| RaspberryPi3 | | | √ | | |
||||||
|
| RaspberryPi4 | √ | | | | |
||||||
|
|
||||||
|
* Python Version |
||||||
|
|
||||||
|
| Python | Work Well | Work Wrong | Untested | Remarks | |
||||||
|
| ------- | :-------: | :--------: | :------: | ------- | |
||||||
|
| Python2 | √ | | | | |
||||||
|
| Python3 | √ | | | | |
||||||
|
## History |
||||||
|
|
||||||
|
- 2021/09/30 - Version 1.0.2 released. |
||||||
|
- 2021/08/24 - Version 1.0.1 released. |
||||||
|
- 2019/09/28 - Version 1.0.0 released. |
||||||
|
|
||||||
|
## Credits |
||||||
|
|
||||||
|
Written by TangJie(jie.Tang@dfrobot.com), 2019. (Welcome to our [website](https://www.dfrobot.com/)) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,173 @@ |
|||||||
|
# DFRobot_AS3935 |
||||||
|
|
||||||
|
* [English Version](./README.md) |
||||||
|
|
||||||
|
AS3935雷电传感器可以检测雷电,显示雷电的距离和强度,不受电弧和噪声的干扰 |
||||||
|
可设置为室内或室外模式 |
||||||
|
|
||||||
|
![Product Image](./resources/images/SEN0290.png) |
||||||
|
|
||||||
|
## 产品链接(https://www.dfrobot.com.cn/goods-1889.html) |
||||||
|
|
||||||
|
SKU:SEN0290 |
||||||
|
|
||||||
|
## 目录 |
||||||
|
|
||||||
|
* [概述](#概述) |
||||||
|
* [库安装](#库安装) |
||||||
|
* [方法](#方法) |
||||||
|
* [兼容性](#兼容性) |
||||||
|
* [历史](#历史) |
||||||
|
* [创作者](#创作者) |
||||||
|
|
||||||
|
## 概述 |
||||||
|
|
||||||
|
从AS3935模块中输入命令和读取数据 |
||||||
|
|
||||||
|
1. 闪电传感器对半径40公里以内的雷暴活动发出警报 |
||||||
|
2. 从头顶到风暴顶部的距离估计为40公里,每15步 |
||||||
|
3. 检测云对地和云内(云对云)闪烁 |
||||||
|
4. 嵌入人工干扰抑制算法 |
||||||
|
5. 可编程检测水平使阈值设置为最佳控制 |
||||||
|
6. 三个i2c接口,自由切换避免站点冲突 |
||||||
|
|
||||||
|
## 库安装 |
||||||
|
|
||||||
|
要使用这个库,首先将库下载到Raspberry Pi,然后打开例程文件夹。要执行一个例程demox.py,请在命令行中输入python demox.py。例如,要执行control_led.py例程,你需要输入: |
||||||
|
|
||||||
|
```python |
||||||
|
python DFRobot_AS3935_detailed.py |
||||||
|
``` |
||||||
|
|
||||||
|
## 方法 |
||||||
|
|
||||||
|
```python |
||||||
|
''' |
||||||
|
@brief 传感器重启 |
||||||
|
''' |
||||||
|
def reset(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 配置传感器 |
||||||
|
@param capacitance 天线调谐电容(必须是8,8 - 120pf的整数倍) |
||||||
|
@param location 室内或室外模式选择 |
||||||
|
@param disturber 启用/禁用干扰发射机检测 |
||||||
|
''' |
||||||
|
def manual_cal(self, capacitance, location, disturber); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief Get mid-range type |
||||||
|
@return 返回中断状态 |
||||||
|
@retval 0 Unknown src |
||||||
|
@retval 1 Lightning detected |
||||||
|
@retval 2 Disturber |
||||||
|
@retval 3 Noise level too high |
||||||
|
''' |
||||||
|
def get_interrupt_src(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 获取闪电距离 |
||||||
|
@return 闪电距离(单位公里) |
||||||
|
''' |
||||||
|
def get_lightning_distKm(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 获取闪电能力强度 |
||||||
|
@return 闪电能力强度(0-1000) |
||||||
|
''' |
||||||
|
def get_strike_energy_raw(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 设置 LCO_FDIV 寄存器 |
||||||
|
@param fdiv 设置0, 1, 2或3的比率分别为16,32,64和128 |
||||||
|
''' |
||||||
|
def set_lco_fdiv(self,fdiv); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 设置中断源 |
||||||
|
@param irqSelect 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
||||||
|
''' |
||||||
|
def set_irq_output_source(self, irqSelect); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 设置为室外模式 |
||||||
|
''' |
||||||
|
def set_outdoors(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 设置为室内模式 |
||||||
|
''' |
||||||
|
def set_indoors(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 中断检测使能 |
||||||
|
''' |
||||||
|
def disturber_en(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 中断检测失能 |
||||||
|
''' |
||||||
|
def disturber_dis(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 设置噪音等级 |
||||||
|
@param 0~7,大于7将使用默认值:2 |
||||||
|
''' |
||||||
|
def set_noise_floor_lv1(self, nfSel); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 获取噪音等级 |
||||||
|
@return 0~7 |
||||||
|
''' |
||||||
|
def get_noise_floor_lv1(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 设置抗干扰等级 |
||||||
|
@param 0~7,大于7将使用默认值:2 |
||||||
|
''' |
||||||
|
def set_watchdog_threshold(self, wdth); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 获取抗干扰等级 |
||||||
|
@return 0~7 |
||||||
|
''' |
||||||
|
def get_watchdog_threshold(self); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief 修改 SREJ (毛刺抑制) |
||||||
|
@param 0~7,大于7将使用默认值:2 |
||||||
|
''' |
||||||
|
def set_spike_rejection(self, srej); |
||||||
|
|
||||||
|
''' |
||||||
|
@brief r获取ead SREJ (毛刺抑制) |
||||||
|
@return 0~7 |
||||||
|
''' |
||||||
|
def get_spike_rejection(self); |
||||||
|
``` |
||||||
|
## 兼容性 |
||||||
|
|
||||||
|
* 树莓派版本 |
||||||
|
|
||||||
|
| Board | 通过 | 未通过 | 未测试 | 备注 | |
||||||
|
| ------------ | :-------: | :--------: | :------: | ------- | |
||||||
|
| RaspberryPi2 | | | √ | | |
||||||
|
| RaspberryPi3 | | | √ | | |
||||||
|
| RaspberryPi4 | √ | | | | |
||||||
|
|
||||||
|
* Python 版本 |
||||||
|
|
||||||
|
| Python | 通过 | 未通过 | 未测试 | 备注 | |
||||||
|
| ------- | :-------: | :--------: | :------: | ------- | |
||||||
|
| Python2 | √ | | | | |
||||||
|
| Python3 | √ | | | | |
||||||
|
|
||||||
|
## 历史 |
||||||
|
|
||||||
|
- 2021/09/30 - 1.0.2 版本 |
||||||
|
- 2021/08/24 - 1.0.1 版本 |
||||||
|
- 2019/09/28 - 1.0.0 版本 |
||||||
|
|
||||||
|
## 创作者 |
||||||
|
|
||||||
|
Written by TangJie(jie.Tang@dfrobot.com), 2019. (Welcome to our [website](https://www.dfrobot.com/)) |
@ -0,0 +1,107 @@ |
|||||||
|
''' |
||||||
|
# @file DFRobot_AS3935_detailed.py |
||||||
|
# @brief SEN0290 Lightning Sensor |
||||||
|
# @n This sensor can detect lightning and display the distance and intensity of the lightning within 40 km |
||||||
|
# @n It can be set as indoor or outdoor mode. |
||||||
|
# @n The module has three I2C, these addresses are: |
||||||
|
# @n AS3935_ADD1 0x01 A0 = 1 A1 = 0 |
||||||
|
# @n AS3935_ADD2 0x02 A0 = 0 A1 = 1 |
||||||
|
# @n AS3935_ADD3 0x03 A0 = 1 A1 = 1 |
||||||
|
# @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) |
||||||
|
# @licence The MIT License (MIT) |
||||||
|
# @author [TangJie](jie.tang@dfrobot.com) |
||||||
|
# @version V1.0.2 |
||||||
|
# @date 2019-09-28 |
||||||
|
# @url https://github.com/DFRobor/DFRobot_AS3935 |
||||||
|
''' |
||||||
|
import sys |
||||||
|
sys.path.append('../') |
||||||
|
import time |
||||||
|
from DFRobot_AS3935_Lib import DFRobot_AS3935 |
||||||
|
import RPi.GPIO as GPIO |
||||||
|
from datetime import datetime |
||||||
|
|
||||||
|
#I2C address |
||||||
|
AS3935_I2C_ADDR1 = 0X01 |
||||||
|
AS3935_I2C_ADDR2 = 0X02 |
||||||
|
AS3935_I2C_ADDR3 = 0X03 |
||||||
|
|
||||||
|
#Antenna tuning capcitance (must be integer multiple of 8, 8 - 120 pf) |
||||||
|
AS3935_CAPACITANCE = 96 |
||||||
|
IRQ_PIN = 7 |
||||||
|
|
||||||
|
GPIO.setmode(GPIO.BOARD) |
||||||
|
|
||||||
|
sensor = DFRobot_AS3935(AS3935_I2C_ADDR3, bus = 1) |
||||||
|
if (sensor.reset()): |
||||||
|
print("init sensor sucess.") |
||||||
|
else: |
||||||
|
print("init sensor fail") |
||||||
|
while True: |
||||||
|
pass |
||||||
|
#Configure sensor |
||||||
|
sensor.power_up() |
||||||
|
|
||||||
|
#set indoors or outdoors models |
||||||
|
sensor.set_indoors() |
||||||
|
#sensor.set_outdoors() |
||||||
|
|
||||||
|
#disturber detection |
||||||
|
sensor.disturber_en() |
||||||
|
#sensor.disturber_dis() |
||||||
|
|
||||||
|
sensor.set_irq_output_source(0) |
||||||
|
time.sleep(0.5) |
||||||
|
#set capacitance |
||||||
|
sensor.set_tuning_caps(AS3935_CAPACITANCE) |
||||||
|
|
||||||
|
# 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 plus 3.5% to 500/16 kHz minus 3.5% |
||||||
|
# |
||||||
|
# sensor.setLco_fdiv(0) |
||||||
|
# sensor.setIrq_output_source(3) |
||||||
|
|
||||||
|
#Set the noise level,use a default value greater than 7 |
||||||
|
sensor.set_noise_floor_lv1(2) |
||||||
|
#noiseLv = sensor.get_noise_floor_lv1() |
||||||
|
|
||||||
|
#used to modify WDTH,alues should only be between 0x00 and 0x0F (0 and 7) |
||||||
|
sensor.set_watchdog_threshold(2) |
||||||
|
#wtdgThreshold = sensor.get_watchdog_threshold() |
||||||
|
|
||||||
|
#used to modify SREJ (spike rejection),values should only be between 0x00 and 0x0F (0 and 7) |
||||||
|
sensor.set_spike_rejection(2) |
||||||
|
#spikeRejection = sensor.get_spike_rejection() |
||||||
|
|
||||||
|
#view all register data |
||||||
|
#sensor.print_all_regs() |
||||||
|
|
||||||
|
def callback_handle(channel): |
||||||
|
global sensor |
||||||
|
time.sleep(0.005) |
||||||
|
intSrc = sensor.get_interrupt_src() |
||||||
|
if intSrc == 1: |
||||||
|
lightning_distKm = sensor.get_lightning_distKm() |
||||||
|
print('Lightning occurs!') |
||||||
|
print('Distance: %dkm'%lightning_distKm) |
||||||
|
|
||||||
|
lightning_energy_val = sensor.get_strike_energy_raw() |
||||||
|
print('Intensity: %d '%lightning_energy_val) |
||||||
|
elif intSrc == 2: |
||||||
|
print('Disturber discovered!') |
||||||
|
elif intSrc == 3: |
||||||
|
print('Noise level too high!') |
||||||
|
else: |
||||||
|
pass |
||||||
|
#Set to input mode |
||||||
|
GPIO.setup(IRQ_PIN, GPIO.IN) |
||||||
|
#Set the interrupt pin, the interrupt function, rising along the trigger |
||||||
|
GPIO.add_event_detect(IRQ_PIN, GPIO.RISING, callback = callback_handle) |
||||||
|
print("start lightning detect.") |
||||||
|
|
||||||
|
while True: |
||||||
|
time.sleep(1.0) |
||||||
|
|
||||||
|
|
@ -0,0 +1,94 @@ |
|||||||
|
''' |
||||||
|
# @file DFRobot_AS3935_ordinary.py |
||||||
|
# @brief SEN0290 Lightning Sensor |
||||||
|
# @n This sensor can detect lightning and display the distance and intensity of the lightning within 40 km |
||||||
|
# @n It can be set as indoor or outdoor mode. |
||||||
|
# @n The module has three I2C, these addresses are: |
||||||
|
# @n AS3935_ADD1 0x01 A0 = 1 A1 = 0 |
||||||
|
# @n AS3935_ADD2 0x02 A0 = 0 A1 = 1 |
||||||
|
# @n AS3935_ADD3 0x03 A0 = 1 A1 = 1 |
||||||
|
# @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) |
||||||
|
# @licence The MIT License (MIT) |
||||||
|
# @author [TangJie](jie.tang@dfrobot.com) |
||||||
|
# @version V1.0.2 |
||||||
|
# @date 2019-09-28 |
||||||
|
# @url https://github.com/DFRobor/DFRobot_AS3935 |
||||||
|
''' |
||||||
|
|
||||||
|
import sys |
||||||
|
sys.path.append('../') |
||||||
|
import time |
||||||
|
from DFRobot_AS3935_Lib import DFRobot_AS3935 |
||||||
|
import RPi.GPIO as GPIO |
||||||
|
from datetime import datetime |
||||||
|
|
||||||
|
#I2C address |
||||||
|
AS3935_I2C_ADDR1 = 0X01 |
||||||
|
AS3935_I2C_ADDR2 = 0X02 |
||||||
|
AS3935_I2C_ADDR3 = 0X03 |
||||||
|
|
||||||
|
#Antenna tuning capcitance (must be integer multiple of 8, 8 - 120 pf) |
||||||
|
AS3935_CAPACITANCE = 96 |
||||||
|
IRQ_PIN = 7 |
||||||
|
|
||||||
|
#Indoor/outdoor mode selection |
||||||
|
AS3935_INDOORS = 0 |
||||||
|
AS3935_OUTDOORS = 1 |
||||||
|
AS3935_MODE = AS3935_INDOORS |
||||||
|
|
||||||
|
#Enable/disable disturber detection |
||||||
|
AS3935_DIST_DIS = 0 |
||||||
|
AS3935_DIST_EN = 1 |
||||||
|
AS3935_DIST = AS3935_DIST_EN |
||||||
|
|
||||||
|
GPIO.setmode(GPIO.BOARD) |
||||||
|
|
||||||
|
sensor = DFRobot_AS3935(AS3935_I2C_ADDR3, bus = 1) |
||||||
|
if (sensor.reset()): |
||||||
|
print("init sensor sucess.") |
||||||
|
else: |
||||||
|
print("init sensor fail") |
||||||
|
while True: |
||||||
|
pass |
||||||
|
|
||||||
|
#Configure sensor |
||||||
|
sensor.manual_cal(AS3935_CAPACITANCE, AS3935_MODE, AS3935_DIST) |
||||||
|
|
||||||
|
# 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 plus 3.5% to 500/16 kHz minus 3.5% |
||||||
|
# |
||||||
|
# sensor.setLco_fdiv(0) |
||||||
|
# sensor.set_irq_output_source(3) |
||||||
|
|
||||||
|
#view all register data |
||||||
|
#sensor.print_all_regs() |
||||||
|
|
||||||
|
def callback_handle(channel): |
||||||
|
global sensor |
||||||
|
time.sleep(0.005) |
||||||
|
intSrc = sensor.get_interrupt_src() |
||||||
|
if intSrc == 1: |
||||||
|
lightning_distKm = sensor.get_lightning_distKm() |
||||||
|
print('Lightning occurs!') |
||||||
|
print('Distance: %dkm'%lightning_distKm) |
||||||
|
|
||||||
|
lightning_energy_val = sensor.get_strike_energy_raw() |
||||||
|
print('Intensity: %d '%lightning_energy_val) |
||||||
|
elif intSrc == 2: |
||||||
|
print('Disturber discovered!') |
||||||
|
elif intSrc == 3: |
||||||
|
print('Noise level too high!') |
||||||
|
else: |
||||||
|
pass |
||||||
|
#Set to input mode |
||||||
|
GPIO.setup(IRQ_PIN, GPIO.IN) |
||||||
|
#Set the interrupt pin, the interrupt function, rising along the trigger |
||||||
|
GPIO.add_event_detect(IRQ_PIN, GPIO.RISING, callback = callback_handle) |
||||||
|
print("start lightning detect.") |
||||||
|
|
||||||
|
while True: |
||||||
|
time.sleep(1.0) |
||||||
|
|
||||||
|
|
@ -1,202 +1,229 @@ |
|||||||
# AS3935 |
# DFRobot_AS3935 |
||||||
|
|
||||||
AS3935 Lightning Sensor can detect lightning and display the distance and intensity of the lightning without the disturbance of electric arc and noise.<br> |
* [中文版](./README_CN.md) |
||||||
It can be set as indoor or outdoor mode.<br> |
|
||||||
|
|
||||||
## DFRobot_AS3934 Library for Arduino |
AS3935 Lightning 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. |
||||||
Provide a library faciltates operations in the as3935 modules. |
|
||||||
|
|
||||||
## Table of Contents |
![Product Image](./resources/images/SEN0290.png) |
||||||
|
|
||||||
|
## product link (https://www.dfrobot.com/product-1828.html) |
||||||
|
|
||||||
|
SKU:SEN0290 |
||||||
|
|
||||||
* [Summary](#summary) |
## Table of Contents |
||||||
* [Feature](#feature) |
|
||||||
* [Installation](#installation) |
|
||||||
* [Methods](#methods) |
|
||||||
|
|
||||||
* [Compatibility](#compatibility) |
* [Summary](#summary) |
||||||
* [Credits](#credits) |
* [Installation](#Installation) |
||||||
<snippet> |
* [Methods](#Methods) |
||||||
<content> |
* [Compatibility](#compatibility) |
||||||
|
* [History](#history) |
||||||
|
* [Credits](#credits) |
||||||
|
|
||||||
## Summary |
## Summary |
||||||
|
|
||||||
Input commands and read data from AS3935 modules |
Input commands and read data from AS3935 modules |
||||||
|
|
||||||
## Feature |
1. Lightning sensor warns of lightning storm activity within a radius of 40km |
||||||
|
2. Distance estimation to the head of the storm from overhead to 40km in 15 steps |
||||||
1. Lightning sensor warns of lightning storm activity within a radius of 40km <br> |
3. Detects both cloud-to-ground and intra-cloud(cloud-to-cloud) flashes |
||||||
2. Distance estimation to the head of the storm from overhead to 40km in 15 steps <br> |
4. Embedded man-made disturber rejection algorithm |
||||||
3. Detects both cloud-to-ground and intra-cloud(cloud-to-cloud) flashes <br> |
5. Programmable detection levels enable threshold setting for optimal controls |
||||||
4. Embedded man-made disturber rejection algorithm <br> |
6. Three i2c interfaces, switch freely to avoid site conflicts |
||||||
5. Programmable detection levels enable threshold setting for optimal controls <br> |
|
||||||
6. Three i2c interfaces, switch freely to avoid site conflicts <br> |
|
||||||
|
|
||||||
## Installation |
## Installation |
||||||
|
|
||||||
Download the library ZIP file and unzip it to the Arduino folder of the library.<br> |
To use this library, first download the library file, paste it into the \Arduino\libraries directory, then open the examples folder and run the demo in the folder. |
||||||
|
|
||||||
## Methods |
## Methods |
||||||
|
|
||||||
```C++ |
```C++ |
||||||
|
/** |
||||||
#include "DFRobot_AS3935_I2C.h" |
* @fn begin |
||||||
|
* @brief I2C init |
||||||
/* |
* @return uint8_t type, indicates the initialization status |
||||||
* @brief AS3935 object |
* @retval 0 succeed |
||||||
* |
* @retval 1 failure |
||||||
* @param irqx irq pin |
*/ |
||||||
* devAddx i2c address |
uint8_t begin(void); |
||||||
*/ |
|
||||||
DFRobot_AS3935_I2C(uint8_t irqx, uint8_t devAddx); |
/** |
||||||
|
* @fn setI2CAddress |
||||||
/* |
* @brief set i2c address |
||||||
* @brief AS3935 object |
* @param devAddx i2c address |
||||||
* |
* @return None |
||||||
* @param irqx irq pin |
*/ |
||||||
*/ |
void setI2CAddress(uint8_t devAddx); |
||||||
DFRobot_AS3935_I2C(uint8_t irqx); |
|
||||||
|
/** |
||||||
/* |
* @fn manualCal |
||||||
* @brief reset registers to default |
* @brief manual calibration |
||||||
* |
* @param capacitance capacitance |
||||||
* @return 0 success |
* @param location location |
||||||
*/ |
* @param disturber disturber |
||||||
int defInit(void); |
* @return None |
||||||
|
*/ |
||||||
/* |
void manualCal(uint8_t capacitance, uint8_t location, uint8_t disturber); |
||||||
* @brief set i2c address |
|
||||||
* |
/** |
||||||
* @param devAddx i2c address |
* @fn defInit |
||||||
*/ |
* @brief reset registers to default |
||||||
void setI2CAddress(uint8_t devAddx); |
* @return int type,represents rest state |
||||||
|
* @retval 0 success |
||||||
/* |
*/ |
||||||
* @brief manual calibration |
int defInit(void); |
||||||
* |
|
||||||
* @param capacitance capacitance |
/** |
||||||
* location location |
* @fn disturberEn |
||||||
* disturber disturber |
* @brief Disturber detection enabled |
||||||
*/ |
* @return None |
||||||
void manualCal(uint8_t capacitance, uint8_t location, uint8_t disturber); |
*/ |
||||||
|
void disturberEn(void); |
||||||
/* |
|
||||||
* @brief view register data |
/** |
||||||
*/ |
* @fn disturberDis |
||||||
void printAllRegs(void); |
* @brief Disturber detection disenabled |
||||||
|
* @return None |
||||||
/* |
*/ |
||||||
* @brief get interrupt source |
void disturberDis(void); |
||||||
* |
|
||||||
* @return 0 interrupt result not expected |
/** |
||||||
* 1 lightning caused interrupt |
* @fn setIRQOutputSource |
||||||
* 2 disturber detected |
* @brief Set interrupt source |
||||||
* 3 Noise level too high |
* @param irqSelect 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
||||||
*/ |
* @return None |
||||||
uint8_t getInterruptSrc(void); |
*/ |
||||||
|
void setIRQOutputSource(uint8_t irqSelect); |
||||||
/* |
|
||||||
* @brief get lightning distance |
/** |
||||||
* |
* @fn setTuningCaps |
||||||
* @return unit kilometer |
* @brief set capacitance |
||||||
*/ |
* @param capVal size |
||||||
uint8_t getLightningDistKm(void); |
* @return None |
||||||
|
*/ |
||||||
/* |
void setTuningCaps(uint8_t capVal); |
||||||
* @brief get lightning energy intensity |
|
||||||
* |
/** |
||||||
* @return lightning energy intensity(0-1000) |
* @fn getInterruptSrc |
||||||
*/ |
* @brief get interrupt source |
||||||
uint32_t getStrikeEnergyRaw(void); |
* @return uint8_t type,returns the interrupt source type |
||||||
|
* @retval 0 interrupt result not expected |
||||||
/* |
* @retval 1 lightning caused interrupt |
||||||
* @brief Set to the outdoor model |
* @retval 2 disturber detected |
||||||
*/ |
* @retval 3 Noise level too high |
||||||
void setOutdoors(void); |
*/ |
||||||
|
uint8_t getInterruptSrc(void); |
||||||
/* |
|
||||||
* @brief Set to the indoor model |
/** |
||||||
*/ |
* @fn getLightningDistKm |
||||||
void setIndoors(void); |
* @brief get lightning distance |
||||||
|
* @return unit kilometer |
||||||
/* |
*/ |
||||||
* @brief Disturber detection enabled |
uint8_t getLightningDistKm(void); |
||||||
*/ |
|
||||||
void disturberEn(void); |
/** |
||||||
|
* @fn getStrikeEnergyRaw |
||||||
/* |
* @brief get lightning energy intensity |
||||||
* @brief Disturber detection disenabled |
* @return lightning energy intensity(0-1000) |
||||||
*/ |
*/ |
||||||
void disturberDis(void); |
uint32_t getStrikeEnergyRaw(void); |
||||||
|
|
||||||
/* |
/** |
||||||
* @brief Sets LCO_FDIV register |
* @fn setIndoors |
||||||
* |
* @brief Set to the indoor model |
||||||
* @param fdiv Set 0, 1, 2 or 3 for ratios of 16, 32, 64 and 128, respectively |
* @return None |
||||||
*/ |
*/ |
||||||
void setLcoFdiv(uint8_t fdiv); |
void setIndoors(void); |
||||||
|
|
||||||
/* |
/** |
||||||
* @brief Set interrupt source |
* @fn setOutdoors |
||||||
* |
* @brief Set to the outdoor model |
||||||
* @param irqSelect 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
* @return None |
||||||
*/ |
*/ |
||||||
void setIRQOutputSource(uint8_t irqSelect); |
void setOutdoors(void); |
||||||
|
|
||||||
/* |
/** |
||||||
* @brief Set the noise level |
* @fn setOutdoors |
||||||
* |
* @brief Get the noise level |
||||||
* @param 0~7,More than 7 will use the default value:2 |
* @return Return noise level |
||||||
*/ |
*/ |
||||||
void setNoiseFloorLvl(uint8_t nfSel); |
uint8_t getNoiseFloorLvl(void); |
||||||
|
|
||||||
/* |
/** |
||||||
* @brief Get the noise level |
* @fn setNoiseFloorLvl |
||||||
* |
* @brief Set the noise level |
||||||
* @return 0~7 |
* @param 0~7,More than 7 will use the default value:2 |
||||||
*/ |
* @return None |
||||||
uint8_t getNoiseFloorLvl(void); |
*/ |
||||||
|
void setNoiseFloorLvl(uint8_t nfSel); |
||||||
/* |
|
||||||
* @brief Set an anti-interference rating |
/** |
||||||
* |
* @fn getWatchdogThreshold |
||||||
* @param 0~7,More than 7 will use the default value:2 |
* @brief read WDTH |
||||||
*/ |
* @return Return interference level |
||||||
void setWatchdogThreshold(uint8_t wdth); |
*/ |
||||||
|
uint8_t getWatchdogThreshold(void); |
||||||
/* |
|
||||||
* @brief read WDTH |
/** |
||||||
* |
* @fn setWatchdogThreshold |
||||||
* @return 0~7 |
* @brief Set an anti-interference rating |
||||||
*/ |
* @param 0~7,More than 7 will use the default value:2 |
||||||
uint8_t getWatchdogThreshold(void); |
* @return None |
||||||
|
*/ |
||||||
/* |
void setWatchdogThreshold(uint8_t wdth); |
||||||
* @brief Modify SREJ (spike rejection) |
|
||||||
* |
/** |
||||||
* @param 0~7,More than 7 will use the default value:2 |
* @fn getSpikeRejection |
||||||
*/ |
* @brief read SREJ (spike rejection) |
||||||
void setSpikeRejection(uint8_t srej); |
* @return Return SREJ value |
||||||
|
*/ |
||||||
/* |
uint8_t getSpikeRejection(void); |
||||||
* @brief read SREJ (spike rejection) |
|
||||||
* |
/** |
||||||
* @return 0~7 |
* @fn setSpikeRejection |
||||||
*/ |
* @brief Modify SREJ (spike rejection) |
||||||
uint8_t getSpikeRejection(void); |
* @param 0~7,More than 7 will use the default value:2 |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void setSpikeRejection(uint8_t srej); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn setLcoFdiv |
||||||
|
* @brief Sets LCO_FDIV register |
||||||
|
* @param fdiv Set 0, 1, 2 or 3 for ratios of 16, 32, 64 and 128, respectively |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void setLcoFdiv(uint8_t fdiv); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn printAllRegs |
||||||
|
* @brief view register data |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void printAllRegs(void); |
||||||
|
|
||||||
|
/** |
||||||
|
* @fn powerUp |
||||||
|
* @brief Configure sensor |
||||||
|
* @return None |
||||||
|
*/ |
||||||
|
void powerUp(void); |
||||||
|
|
||||||
``` |
``` |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Compatibility |
## Compatibility |
||||||
|
|
||||||
MCU | Work Well | Work Wrong | Untested | Remarks |
MCU | Work Well | Work Wrong | Untested | Remarks | |
||||||
------------------ | :----------: | :----------: | :---------: | ----- |
------------------ | :----------: | :----------: | :---------: | :-----: | |
||||||
Arduino uno | √ | | | |
Arduino uno | √ | | | | |
||||||
esp8266 | √ | | | |
esp8266 | √ | | | | |
||||||
|
|
||||||
|
## History |
||||||
|
|
||||||
|
- 2021/09/30 - Version 1.0.2 released. |
||||||
|
- 2021/08/24 - Version 1.0.1 released. |
||||||
|
- 2019/09/28 - Version 1.0.0 released. |
||||||
|
|
||||||
## Credits |
## Credits |
||||||
|
|
||||||
Written by DFRobot_JH, 2018. (Welcome to our [website](https://www.dfrobot.com/)) |
Written by TangJie(jie.Tang@dfrobot.com), 2019. (Welcome to our [website](https://www.dfrobot.com/)) |
||||||
|
|
||||||
|
After Width: | Height: | Size: 110 KiB |
Loading…
Reference in new issue