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" |
||||
|
||||
DFRobot_AS3935_I2C::DFRobot_AS3935_I2C(uint8_t irqx, uint8_t devAddx) |
||||
{ |
||||
devAdd = devAddx; |
||||
irq = irqx; |
||||
// initalize the IRQ pins
|
||||
pinMode(irq, INPUT); |
||||
devAdd = devAddx; |
||||
irq = irqx; |
||||
// initalize the IRQ pins
|
||||
pinMode(irq, INPUT); |
||||
} |
||||
|
||||
DFRobot_AS3935_I2C::DFRobot_AS3935_I2C(uint8_t irqx) |
||||
{ |
||||
irq = irqx; |
||||
// initalize the IRQ pins
|
||||
// pinMode(irq, OUTPUT);
|
||||
// digitalWrite(irq,1);
|
||||
pinMode(irq, INPUT); |
||||
|
||||
irq = irqx; |
||||
pinMode(irq, INPUT); |
||||
} |
||||
|
||||
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; |
||||
} |
||||
else if (devAddx == AS3935_ADD2) |
||||
{ |
||||
devAdd = devAddx; |
||||
} |
||||
else |
||||
{ |
||||
devAdd = AS3935_ADD3; |
||||
} |
||||
}else{ |
||||
devAdd = AS3935_ADD3; |
||||
} |
||||
} |
||||
|
||||
uint8_t DFRobot_AS3935_I2C::singRegRead(uint8_t regAdd) |
||||
{ |
||||
// I2C address Register address num bytes
|
||||
//I2c.read((uint8_t)devAdd, (uint8_t)regAdd, (uint8_t)0x01); // Use I2C library to read register
|
||||
//uint8_t regData = I2c.receive(); // receive the I2C data
|
||||
uint8_t buf[1]; |
||||
readReg(regAdd, buf, 1); |
||||
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) |
||||
{ |
||||
// start by reading original register data (only modifying what we need to)
|
||||
uint8_t origRegData = singRegRead(regAdd); |
||||
// start by reading original register data (only modifying what we need to)
|
||||
uint8_t origRegData = 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
|
||||
uint8_t newRegData = ((origRegData & ~dataMask) | (regData & dataMask)); |
||||
uint8_t buf[1]; |
||||
buf[0] = newRegData; |
||||
|
||||
// finally, write the data to the register
|
||||
//I2c.write(devAdd, regAdd, newRegData);
|
||||
writeReg(regAdd, buf, 1); |
||||
//Serial.print("wrt: ");
|
||||
//Serial.print(newRegData,HEX);
|
||||
//Serial.print(" Act: ");
|
||||
//Serial.println(singRegRead(regAdd),HEX);
|
||||
// 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
|
||||
uint8_t newRegData = ((origRegData & ~dataMask) | (regData & dataMask)); |
||||
uint8_t buf[1]; |
||||
buf[0] = newRegData; |
||||
|
||||
// finally, write the data to the register
|
||||
//I2c.write(devAdd, regAdd, newRegData);
|
||||
writeReg(regAdd, buf, 1); |
||||
} |
||||
|
||||
int DFRobot_AS3935_I2C::defInit() |
||||
{ |
||||
return reset(); // reset registers to default
|
||||
return reset(); // reset registers to default
|
||||
} |
||||
|
||||
int DFRobot_AS3935_I2C::reset() |
||||
{ |
||||
// run PRESET_DEFAULT Direct Command to set all registers in default state
|
||||
//int error = I2c.write(devAdd, (uint8_t)0x3C, (uint8_t)0x96);
|
||||
uint8_t buf[1]; |
||||
buf[0] = 0x96; |
||||
|
||||
writeReg(0x3c, buf, 1); |
||||
return 0; |
||||
// run PRESET_DEFAULT Direct Command to set all registers in default state
|
||||
//int error = I2c.write(devAdd, (uint8_t)0x3C, (uint8_t)0x96);
|
||||
uint8_t buf[1]; |
||||
buf[0] = 0x96; |
||||
writeReg(0x3c, buf, 1); |
||||
return 0; |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::calRCO() |
||||
{ |
||||
// run ALIB_RCO Direct Command to cal internal RCO
|
||||
//I2c.write(devAdd, (uint8_t)0x3D, (uint8_t)0x96);
|
||||
uint8_t buf[1]; |
||||
buf[0] = 0x96; |
||||
writeReg(0x3D, buf, 1); |
||||
delay(2); // wait 2ms to complete
|
||||
// run ALIB_RCO Direct Command to cal internal RCO
|
||||
//I2c.write(devAdd, (uint8_t)0x3D, (uint8_t)0x96);
|
||||
uint8_t buf[1]; |
||||
buf[0] = 0x96; |
||||
writeReg(0x3D, buf, 1); |
||||
delay(2); // wait 2ms to complete
|
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::powerUp(void) |
||||
{ |
||||
// power-up sequence based on datasheet, pg 23/27
|
||||
// register 0x00, PWD bit: 0 (clears PWD)
|
||||
singRegWrite(0x00, 0x01, 0x00); |
||||
calRCO(); // run RCO cal cmd
|
||||
singRegWrite(0x08, 0x20, 0x20); // set DISP_SRCO to 1
|
||||
delay(2); |
||||
singRegWrite(0x08, 0x20, 0x00); // set DISP_SRCO to 0
|
||||
// power-up sequence based on datasheet, pg 23/27
|
||||
// register 0x00, PWD bit: 0 (clears PWD)
|
||||
singRegWrite(0x00, 0x01, 0x00); |
||||
calRCO(); // run RCO cal cmd
|
||||
singRegWrite(0x08, 0x20, 0x20); // set DISP_SRCO to 1
|
||||
delay(2); |
||||
singRegWrite(0x08, 0x20, 0x00); // set DISP_SRCO to 0
|
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::powerDown(void) |
||||
{ |
||||
// register 0x00, PWD bit: 0 (sets PWD)
|
||||
singRegWrite(0x00, 0x01, 0x01); |
||||
Serial.println("AS3935 powered down"); |
||||
// register 0x00, PWD bit: 0 (sets PWD)
|
||||
singRegWrite(0x00, 0x01, 0x01); |
||||
Serial.println("AS3935 powered down"); |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::disturberEn(void) |
||||
{ |
||||
// register 0x03, PWD bit: 5 (sets MASK_DIST)
|
||||
singRegWrite(0x03, 0x20, 0x00); |
||||
Serial.println("disturber detection enabled"); |
||||
// register 0x03, PWD bit: 5 (sets MASK_DIST)
|
||||
singRegWrite(0x03, 0x20, 0x00); |
||||
Serial.println("disturber detection enabled"); |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::disturberDis(void) |
||||
{ |
||||
// register 0x03, PWD bit: 5 (sets MASK_DIST)
|
||||
singRegWrite(0x03, 0x20, 0x20); |
||||
// register 0x03, PWD bit: 5 (sets MASK_DIST)
|
||||
singRegWrite(0x03, 0x20, 0x20); |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::setIRQOutputSource(uint8_t 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(1 == irqSelect) |
||||
{ |
||||
singRegWrite(0x08, 0xE0, 0x20); // set only TRCO bit
|
||||
} |
||||
else if(2 == irqSelect) |
||||
{ |
||||
singRegWrite(0x08, 0xE0, 0x40); // set only SRCO bit
|
||||
} |
||||
else if(3 == irqSelect) |
||||
{ |
||||
singRegWrite(0x08, 0xE0, 0x80); // set only LCO bit
|
||||
} |
||||
else // assume 0
|
||||
{ |
||||
singRegWrite(0x08, 0xE0, 0x00); // clear IRQ pin display bits
|
||||
} |
||||
|
||||
// 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(1 == irqSelect){ |
||||
singRegWrite(0x08, 0xE0, 0x20); // set only TRCO bit
|
||||
}else if(2 == irqSelect){ |
||||
singRegWrite(0x08, 0xE0, 0x40); // set only SRCO bit
|
||||
}else if(3 == irqSelect){ |
||||
singRegWrite(0x08, 0xE0, 0x80); // set only LCO bit
|
||||
}else{ |
||||
singRegWrite(0x08, 0xE0, 0x00); // clear IRQ pin display bits
|
||||
}
|
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::setTuningCaps(uint8_t capVal) |
||||
{ |
||||
// Assume only numbers divisible by 8 (because that's all the chip supports)
|
||||
if(120 < capVal) // cap_value out of range, assume highest capacitance
|
||||
{ |
||||
singRegWrite(0x08, 0x0F, 0x0F); // set capacitance bits to maximum
|
||||
} |
||||
else |
||||
{ |
||||
singRegWrite(0x08, 0x0F, (capVal >> 3)); // set capacitance bits
|
||||
} |
||||
//Serial.print("capacitance set to 8x");
|
||||
//Serial.println((singRegRead(0x08) & 0x0F));
|
||||
// Assume only numbers divisible by 8 (because that's all the chip supports)
|
||||
if(120 < capVal){ // cap_value out of range, assume highest capacitance
|
||||
singRegWrite(0x08, 0x0F, 0x0F); // set capacitance bits to maximum
|
||||
}else{ |
||||
singRegWrite(0x08, 0x0F, (capVal >> 3)); // set capacitance bits
|
||||
} |
||||
} |
||||
|
||||
uint8_t DFRobot_AS3935_I2C::getInterruptSrc(void) |
||||
{ |
||||
// 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
|
||||
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
|
||||
if(0x08 == intSrc) |
||||
{ |
||||
return 1; // lightning caused interrupt
|
||||
} |
||||
else if(0x04 == intSrc) |
||||
{ |
||||
return 2; // disturber detected
|
||||
} |
||||
else if(0x01 == intSrc) |
||||
{ |
||||
return 3; // Noise level too high
|
||||
} |
||||
else{return 0;} // interrupt result not expected
|
||||
|
||||
// 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
|
||||
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
|
||||
if(0x08 == intSrc){ |
||||
return 1; // lightning caused interrupt
|
||||
}else if(0x04 == intSrc){ |
||||
return 2; // disturber detected
|
||||
}else if(0x01 == intSrc){ |
||||
return 3; // Noise level too high
|
||||
}else{ |
||||
return 0; |
||||
} // interrupt result not expected
|
||||
} |
||||
|
||||
uint8_t DFRobot_AS3935_I2C::getLightningDistKm(void) |
||||
{ |
||||
uint8_t strikeDist = (singRegRead(0x07) & 0x3F); // read register, get rid of non-distance data
|
||||
return strikeDist; |
||||
uint8_t strikeDist = (singRegRead(0x07) & 0x3F); // read register, get rid of non-distance data
|
||||
return strikeDist; |
||||
} |
||||
|
||||
uint32_t DFRobot_AS3935_I2C::getStrikeEnergyRaw(void) |
||||
{ |
||||
uint32_t nrgyRaw = ((singRegRead(0x06) & 0x1F) << 8); // MMSB, shift 8 bits left, make room for MSB
|
||||
nrgyRaw |= singRegRead(0x05); // read MSB
|
||||
nrgyRaw <<= 8; // shift 8 bits left, make room for LSB
|
||||
nrgyRaw |= singRegRead(0x04); // read LSB, add to others
|
||||
|
||||
return nrgyRaw/16777; |
||||
uint32_t nrgyRaw = ((singRegRead(0x06) & 0x1F) << 8); // MMSB, shift 8 bits left, make room for MSB
|
||||
nrgyRaw |= singRegRead(0x05); // read MSB
|
||||
nrgyRaw <<= 8; // shift 8 bits left, make room for LSB
|
||||
nrgyRaw |= singRegRead(0x04); // read LSB, add to others
|
||||
return nrgyRaw/16777; |
||||
} |
||||
|
||||
uint8_t DFRobot_AS3935_I2C::setMinStrikes(uint8_t 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.
|
||||
// see pg 22 of the datasheet for more info (#strikes in 17 min)
|
||||
if(5 > minStrk) |
||||
{ |
||||
singRegWrite(0x02, 0x30, 0x00); |
||||
return 1; |
||||
}else if(9 > minStrk) |
||||
{ |
||||
singRegWrite(0x02, 0x30, 0x10); |
||||
return 5; |
||||
}else if(16 > minStrk) |
||||
{ |
||||
singRegWrite(0x02, 0x30, 0x20); |
||||
return 9; |
||||
}else{ |
||||
singRegWrite(0x02, 0x30, 0x30); |
||||
return 16; |
||||
} |
||||
// 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.
|
||||
// see pg 22 of the datasheet for more info (#strikes in 17 min)
|
||||
if(5 > minStrk){ |
||||
singRegWrite(0x02, 0x30, 0x00); |
||||
return 1; |
||||
}else if(9 > minStrk){ |
||||
singRegWrite(0x02, 0x30, 0x10); |
||||
return 5; |
||||
}else if(16 > minStrk){ |
||||
singRegWrite(0x02, 0x30, 0x20); |
||||
return 9; |
||||
}else{ |
||||
singRegWrite(0x02, 0x30, 0x30); |
||||
return 16; |
||||
} |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::setIndoors(void) |
||||
{ |
||||
// 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)
|
||||
singRegWrite(0x00, 0x3E, 0x24); |
||||
Serial.println("set up for indoor operation"); |
||||
// 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)
|
||||
singRegWrite(0x00, 0x3E, 0x24); |
||||
Serial.println("set up for indoor operation"); |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::setOutdoors(void) |
||||
{ |
||||
// AFE settings addres 0x00, bits 5:1 (01110, based on datasheet, pg 19, table 15)
|
||||
singRegWrite(0x00, 0x3E, 0x1C); |
||||
Serial.println("set up for outdoor operation"); |
||||
// AFE settings addres 0x00, bits 5:1 (01110, based on datasheet, pg 19, table 15)
|
||||
singRegWrite(0x00, 0x3E, 0x1C); |
||||
Serial.println("set up for outdoor operation"); |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::clearStatistics(void) |
||||
{ |
||||
// 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, 0x00); // low
|
||||
singRegWrite(0x02, 0x40, 0x40); // high
|
||||
// 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, 0x00); // low
|
||||
singRegWrite(0x02, 0x40, 0x40); // high
|
||||
} |
||||
|
||||
uint8_t DFRobot_AS3935_I2C::getNoiseFloorLvl(void) |
||||
{ |
||||
// NF settings addres 0x01, bits 6:4
|
||||
// default setting of 010 at startup (datasheet, table 9)
|
||||
uint8_t regRaw = singRegRead(0x01); // read register 0x01
|
||||
return ((regRaw & 0x70) >> 4); // should return value from 0-7, see table 16 for info
|
||||
// NF settings addres 0x01, bits 6:4
|
||||
// default setting of 010 at startup (datasheet, table 9)
|
||||
uint8_t regRaw = singRegRead(0x01); // read register 0x01
|
||||
return ((regRaw & 0x70) >> 4); // should return value from 0-7, see table 16 for info
|
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::setNoiseFloorLvl(uint8_t nfSel) |
||||
{ |
||||
// NF settings addres 0x01, bits 6:4
|
||||
// default setting of 010 at startup (datasheet, table 9)
|
||||
if(7 >= nfSel) // nfSel within expected range
|
||||
{ |
||||
singRegWrite(0x01, 0x70, ((nfSel & 0x07) << 4)); |
||||
} |
||||
else |
||||
{ // out of range, set to default (power-up value 010)
|
||||
singRegWrite(0x01, 0x70, 0x20); |
||||
} |
||||
// NF settings addres 0x01, bits 6:4
|
||||
// default setting of 010 at startup (datasheet, table 9)
|
||||
if(7 >= nfSel){ // nfSel within expected range
|
||||
singRegWrite(0x01, 0x70, ((nfSel & 0x07) << 4)); |
||||
}else{ // out of range, set to default (power-up value 010)
|
||||
singRegWrite(0x01, 0x70, 0x20); |
||||
} |
||||
} |
||||
|
||||
uint8_t DFRobot_AS3935_I2C::getWatchdogThreshold(void) |
||||
{ |
||||
// 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 0001
|
||||
// values should only be between 0x00 and 0x0F (0 and 7)
|
||||
uint8_t regRaw = singRegRead(0x01); |
||||
return (regRaw & 0x0F); |
||||
// 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 0001
|
||||
// values should only be between 0x00 and 0x0F (0 and 7)
|
||||
uint8_t regRaw = singRegRead(0x01); |
||||
return (regRaw & 0x0F); |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::setWatchdogThreshold(uint8_t 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)
|
||||
singRegWrite(0x01, 0x0F, (wdth & 0x0F)); |
||||
// 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)
|
||||
singRegWrite(0x01, 0x0F, (wdth & 0x0F)); |
||||
} |
||||
|
||||
uint8_t DFRobot_AS3935_I2C::getSpikeRejection(void) |
||||
{ |
||||
// 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)
|
||||
uint8_t regRaw = singRegRead(0x02); |
||||
return (regRaw & 0x0F); |
||||
// 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)
|
||||
uint8_t regRaw = singRegRead(0x02); |
||||
return (regRaw & 0x0F); |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::setSpikeRejection(uint8_t 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)
|
||||
singRegWrite(0x02, 0x0F, (srej & 0x0F)); |
||||
// 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)
|
||||
singRegWrite(0x02, 0x0F, (srej & 0x0F)); |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::setLcoFdiv(uint8_t fdiv) |
||||
{ |
||||
// This function sets LCO_FDIV register. This is useful in the tuning of the antenna
|
||||
// LCO_FDIV register: add 0x03, bits 7:6
|
||||
// default value: 00
|
||||
// set 0, 1, 2 or 3 for ratios of 16, 32, 64 and 128, respectively.
|
||||
// See pg 23, Table 20 for more info.
|
||||
singRegWrite(0x03, 0xC0, ((fdiv & 0x03) << 6)); |
||||
// This function sets LCO_FDIV register. This is useful in the tuning of the antenna
|
||||
// LCO_FDIV register: add 0x03, bits 7:6
|
||||
// default value: 00
|
||||
// set 0, 1, 2 or 3 for ratios of 16, 32, 64 and 128, respectively.
|
||||
// See pg 23, Table 20 for more info.
|
||||
singRegWrite(0x03, 0xC0, ((fdiv & 0x03) << 6)); |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::printAllRegs(void) |
||||
{ |
||||
Serial.print("Reg 0x00: "); |
||||
Serial.println(singRegRead(0x00)); |
||||
Serial.print("Reg 0x01: "); |
||||
Serial.println(singRegRead(0x01)); |
||||
Serial.print("Reg 0x02: "); |
||||
Serial.println(singRegRead(0x02)); |
||||
Serial.print("Reg 0x03: "); |
||||
Serial.println(singRegRead(0x03)); |
||||
Serial.print("Reg 0x04: "); |
||||
Serial.println(singRegRead(0x04)); |
||||
Serial.print("Reg 0x05: "); |
||||
Serial.println(singRegRead(0x05)); |
||||
Serial.print("Reg 0x06: "); |
||||
Serial.println(singRegRead(0x06)); |
||||
Serial.print("Reg 0x07: "); |
||||
Serial.println(singRegRead(0x07)); |
||||
Serial.print("Reg 0x08: "); |
||||
Serial.println(singRegRead(0x08)); |
||||
uint32_t nrgyVal = getStrikeEnergyRaw(); |
||||
Serial.println(nrgyVal); |
||||
Serial.print("Reg 0x00: "); |
||||
Serial.println(singRegRead(0x00)); |
||||
Serial.print("Reg 0x01: "); |
||||
Serial.println(singRegRead(0x01)); |
||||
Serial.print("Reg 0x02: "); |
||||
Serial.println(singRegRead(0x02)); |
||||
Serial.print("Reg 0x03: "); |
||||
Serial.println(singRegRead(0x03)); |
||||
Serial.print("Reg 0x04: "); |
||||
Serial.println(singRegRead(0x04)); |
||||
Serial.print("Reg 0x05: "); |
||||
Serial.println(singRegRead(0x05)); |
||||
Serial.print("Reg 0x06: "); |
||||
Serial.println(singRegRead(0x06)); |
||||
Serial.print("Reg 0x07: "); |
||||
Serial.println(singRegRead(0x07)); |
||||
Serial.print("Reg 0x08: "); |
||||
Serial.println(singRegRead(0x08)); |
||||
uint32_t nrgyVal = getStrikeEnergyRaw(); |
||||
Serial.println(nrgyVal); |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::manualCal(uint8_t capacitance, uint8_t location, uint8_t disturber) |
||||
{ |
||||
// start by powering up
|
||||
powerUp(); |
||||
|
||||
// indoors/outdoors next...
|
||||
if(1 == location) // set outdoors if 1
|
||||
{ |
||||
setOutdoors(); |
||||
} |
||||
else // set indoors if anything but 1
|
||||
{ |
||||
setIndoors(); |
||||
} |
||||
|
||||
// disturber cal
|
||||
if(0 == disturber) // disabled if 0
|
||||
{
|
||||
disturberDis(); |
||||
} |
||||
else // enabled if anything but 0
|
||||
{ |
||||
disturberEn(); |
||||
} |
||||
|
||||
setIRQOutputSource(0); |
||||
|
||||
delay(500); |
||||
// capacitance first... directly write value here
|
||||
setTuningCaps(capacitance); |
||||
|
||||
Serial.println("AS3935 manual cal complete"); |
||||
// start by powering up
|
||||
powerUp(); |
||||
// indoors/outdoors next...
|
||||
if(1 == location){ // set outdoors if 1
|
||||
setOutdoors(); |
||||
}else{ // set indoors if anything but 1
|
||||
setIndoors(); |
||||
} |
||||
// disturber cal
|
||||
if(0 == disturber){ // disabled if 0
|
||||
disturberDis(); |
||||
}else{ // enabled if anything but 0
|
||||
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....
|
||||
|
||||
uint8_t DFRobot_AS3935_I2C::begin(void) |
||||
{ |
||||
uint8_t buf[2]; |
||||
Wire.begin(); |
||||
Wire.setClock(400000); |
||||
DBG("i2c init"); |
||||
if(readReg(0, buf, 2) == 2){ |
||||
DBG("return"); |
||||
return 0; |
||||
} |
||||
return 1; |
||||
uint8_t buf[2]; |
||||
Wire.begin(); |
||||
Wire.setClock(400000); |
||||
DBG("i2c init"); |
||||
if(readReg(0, buf, 2) == 2){ |
||||
DBG("return"); |
||||
return 0; |
||||
} |
||||
return 1; |
||||
} |
||||
|
||||
void DFRobot_AS3935_I2C::writeReg(uint8_t reg, void *pBuf, size_t size) |
||||
{ |
||||
if(pBuf == NULL){ |
||||
DBG("pBuf ERROR!! :null pointer"); |
||||
} |
||||
uint8_t *_pBuf = (uint8_t*)pBuf; |
||||
Wire.beginTransmission(devAdd); |
||||
Wire.write(reg); |
||||
for(size_t i = 0; i < size; i++){ |
||||
Wire.write(_pBuf[i]); |
||||
} |
||||
Wire.endTransmission(); |
||||
DBG("i2c write"); |
||||
if(pBuf == NULL){ |
||||
DBG("pBuf ERROR!! :null pointer"); |
||||
} |
||||
uint8_t *_pBuf = (uint8_t*)pBuf; |
||||
Wire.beginTransmission(devAdd); |
||||
Wire.write(reg); |
||||
for(size_t i = 0; i < size; i++){ |
||||
Wire.write(_pBuf[i]); |
||||
} |
||||
Wire.endTransmission(); |
||||
DBG("i2c write"); |
||||
} |
||||
|
||||
size_t DFRobot_AS3935_I2C::readReg(uint8_t reg, void *pBuf, size_t size) |
||||
{ |
||||
if(pBuf == NULL){ |
||||
DBG("pBuf ERROR!!:null pointer"); |
||||
return 0; |
||||
} |
||||
uint8_t *_pBuf = (uint8_t*)pBuf; |
||||
Wire.beginTransmission(devAdd); |
||||
Wire.write(reg); |
||||
Wire.endTransmission(false); |
||||
Wire.requestFrom(devAdd, size); |
||||
for(size_t i = 0; i < size; i++){ |
||||
_pBuf[i] = Wire.read(); |
||||
DBG(_pBuf[i], HEX); |
||||
} |
||||
return size; |
||||
if(pBuf == NULL){ |
||||
DBG("pBuf ERROR!!:null pointer"); |
||||
return 0; |
||||
} |
||||
uint8_t *_pBuf = (uint8_t*)pBuf; |
||||
Wire.beginTransmission(devAdd); |
||||
Wire.write(reg); |
||||
Wire.endTransmission(false); |
||||
Wire.requestFrom(devAdd, size); |
||||
for(size_t i = 0; i < size; i++){ |
||||
_pBuf[i] = Wire.read(); |
||||
DBG(_pBuf[i], HEX); |
||||
} |
||||
return size; |
||||
} |
||||
|
||||
|
@ -1,504 +1,21 @@ |
||||
GNU LESSER GENERAL PUBLIC LICENSE |
||||
Version 2.1, February 1999 |
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc. |
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
Everyone is permitted to copy and distribute verbatim copies |
||||
of this license document, but changing it is not allowed. |
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts |
||||
as the successor of the GNU Library Public License, version 2, hence |
||||
the version number 2.1.] |
||||
|
||||
Preamble |
||||
|
||||
The licenses for most software are designed to take away your |
||||
freedom to share and change it. By contrast, the GNU General Public |
||||
Licenses are intended to guarantee your freedom to share and change |
||||
free software--to make sure the software is free for all its users. |
||||
|
||||
This license, the Lesser General Public License, applies to some |
||||
specially designated software packages--typically libraries--of the |
||||
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! |
||||
MIT License |
||||
|
||||
Copyright (c) 2020 DFRobot |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
of this software and associated documentation files (the "Software"), to deal |
||||
in the Software without restriction, including without limitation the rights |
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
copies of the Software, and to permit persons to whom the Software is |
||||
furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included in all |
||||
copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
SOFTWARE. |
||||
|
@ -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> |
||||
It can be set as indoor or outdoor mode.<br> |
||||
* [中文版](./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. |
||||
|
||||
## DFRobot_AS3934 Library for Arduino |
||||
--------------------------------------------------------- |
||||
Provide a library faciltates operations in the as3935 modules. |
||||
![Product Image](./resources/images/SEN0290.png) |
||||
|
||||
## Table of Contents |
||||
## product link (https://www.dfrobot.com/product-1828.html) |
||||
|
||||
* [Summary](#summary) |
||||
* [Feature](#feature) |
||||
* [Installation](#installation) |
||||
* [Methods](#methods) |
||||
SKU:SEN0290 |
||||
|
||||
* [Compatibility](#compatibility) |
||||
* [Credits](#credits) |
||||
<snippet> |
||||
<content> |
||||
## Table of Contents |
||||
|
||||
* [Summary](#summary) |
||||
* [Installation](#Installation) |
||||
* [Methods](#Methods) |
||||
* [Compatibility](#compatibility) |
||||
* [History](#history) |
||||
* [Credits](#credits) |
||||
|
||||
## Summary |
||||
|
||||
Input commands and read data from AS3935 modules |
||||
|
||||
## Feature |
||||
|
||||
1. Lightning sensor warns of lightning storm activity within a radius of 40km <br> |
||||
2. Distance estimation to the head of the storm from overhead to 40km in 15 steps <br> |
||||
3. Detects both cloud-to-ground and intra-cloud(cloud-to-cloud) flashes <br> |
||||
4. Embedded man-made disturber rejection algorithm <br> |
||||
5. Programmable detection levels enable threshold setting for optimal controls <br> |
||||
6. Three i2c interfaces, switch freely to avoid site conflicts <br> |
||||
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 |
||||
|
||||
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 |
||||
|
||||
```C++ |
||||
|
||||
#include "DFRobot_AS3935_I2C.h" |
||||
|
||||
/* |
||||
* @brief AS3935 object |
||||
* |
||||
* @param irqx irq pin |
||||
* devAddx i2c address |
||||
*/ |
||||
DFRobot_AS3935_I2C(uint8_t irqx, uint8_t devAddx); |
||||
|
||||
/* |
||||
* @brief AS3935 object |
||||
* |
||||
* @param irqx irq pin |
||||
*/ |
||||
DFRobot_AS3935_I2C(uint8_t irqx); |
||||
|
||||
/* |
||||
* @brief reset registers to default |
||||
* |
||||
* @return 0 success |
||||
*/ |
||||
int defInit(void); |
||||
|
||||
/* |
||||
* @brief set i2c address |
||||
* |
||||
* @param devAddx i2c address |
||||
*/ |
||||
void setI2CAddress(uint8_t devAddx); |
||||
|
||||
/* |
||||
* @brief manual calibration |
||||
* |
||||
* @param capacitance capacitance |
||||
* location location |
||||
* disturber disturber |
||||
*/ |
||||
void manualCal(uint8_t capacitance, uint8_t location, uint8_t disturber); |
||||
|
||||
/* |
||||
* @brief view register data |
||||
*/ |
||||
void printAllRegs(void); |
||||
|
||||
/* |
||||
* @brief get interrupt source |
||||
* |
||||
* @return 0 interrupt result not expected |
||||
* 1 lightning caused interrupt |
||||
* 2 disturber detected |
||||
* 3 Noise level too high |
||||
*/ |
||||
uint8_t getInterruptSrc(void); |
||||
|
||||
/* |
||||
* @brief get lightning distance |
||||
* |
||||
* @return unit kilometer |
||||
*/ |
||||
uint8_t getLightningDistKm(void); |
||||
|
||||
/* |
||||
* @brief get lightning energy intensity |
||||
* |
||||
* @return lightning energy intensity(0-1000) |
||||
*/ |
||||
uint32_t getStrikeEnergyRaw(void); |
||||
|
||||
/* |
||||
* @brief Set to the outdoor model |
||||
*/ |
||||
void setOutdoors(void); |
||||
|
||||
/* |
||||
* @brief Set to the indoor model |
||||
*/ |
||||
void setIndoors(void); |
||||
|
||||
/* |
||||
* @brief Disturber detection enabled |
||||
*/ |
||||
void disturberEn(void); |
||||
|
||||
/* |
||||
* @brief Disturber detection disenabled |
||||
*/ |
||||
void disturberDis(void); |
||||
|
||||
/* |
||||
* @brief Sets LCO_FDIV register |
||||
* |
||||
* @param fdiv Set 0, 1, 2 or 3 for ratios of 16, 32, 64 and 128, respectively |
||||
*/ |
||||
void setLcoFdiv(uint8_t fdiv); |
||||
|
||||
/* |
||||
* @brief Set interrupt source |
||||
* |
||||
* @param irqSelect 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
||||
*/ |
||||
void setIRQOutputSource(uint8_t irqSelect); |
||||
|
||||
/* |
||||
* @brief Set the noise level |
||||
* |
||||
* @param 0~7,More than 7 will use the default value:2 |
||||
*/ |
||||
void setNoiseFloorLvl(uint8_t nfSel); |
||||
|
||||
/* |
||||
* @brief Get the noise level |
||||
* |
||||
* @return 0~7 |
||||
*/ |
||||
uint8_t getNoiseFloorLvl(void); |
||||
|
||||
/* |
||||
* @brief Set an anti-interference rating |
||||
* |
||||
* @param 0~7,More than 7 will use the default value:2 |
||||
*/ |
||||
void setWatchdogThreshold(uint8_t wdth); |
||||
|
||||
/* |
||||
* @brief read WDTH |
||||
* |
||||
* @return 0~7 |
||||
*/ |
||||
uint8_t getWatchdogThreshold(void); |
||||
|
||||
/* |
||||
* @brief Modify SREJ (spike rejection) |
||||
* |
||||
* @param 0~7,More than 7 will use the default value:2 |
||||
*/ |
||||
void setSpikeRejection(uint8_t srej); |
||||
|
||||
/* |
||||
* @brief read SREJ (spike rejection) |
||||
* |
||||
* @return 0~7 |
||||
*/ |
||||
uint8_t getSpikeRejection(void); |
||||
|
||||
/** |
||||
* @fn begin |
||||
* @brief I2C init |
||||
* @return uint8_t type, indicates the initialization status |
||||
* @retval 0 succeed |
||||
* @retval 1 failure |
||||
*/ |
||||
uint8_t begin(void); |
||||
|
||||
/** |
||||
* @fn setI2CAddress |
||||
* @brief set i2c address |
||||
* @param devAddx i2c address |
||||
* @return None |
||||
*/ |
||||
void setI2CAddress(uint8_t devAddx); |
||||
|
||||
/** |
||||
* @fn manualCal |
||||
* @brief manual calibration |
||||
* @param capacitance capacitance |
||||
* @param location location |
||||
* @param disturber disturber |
||||
* @return None |
||||
*/ |
||||
void manualCal(uint8_t capacitance, uint8_t location, uint8_t disturber); |
||||
|
||||
/** |
||||
* @fn defInit |
||||
* @brief reset registers to default |
||||
* @return int type,represents rest state |
||||
* @retval 0 success |
||||
*/ |
||||
int defInit(void); |
||||
|
||||
/** |
||||
* @fn disturberEn |
||||
* @brief Disturber detection enabled |
||||
* @return None |
||||
*/ |
||||
void disturberEn(void); |
||||
|
||||
/** |
||||
* @fn disturberDis |
||||
* @brief Disturber detection disenabled |
||||
* @return None |
||||
*/ |
||||
void disturberDis(void); |
||||
|
||||
/** |
||||
* @fn setIRQOutputSource |
||||
* @brief Set interrupt source |
||||
* @param irqSelect 0 = NONE, 1 = TRCO, 2 = SRCO, 3 = LCO |
||||
* @return None |
||||
*/ |
||||
void setIRQOutputSource(uint8_t irqSelect); |
||||
|
||||
/** |
||||
* @fn setTuningCaps |
||||
* @brief set capacitance |
||||
* @param capVal size |
||||
* @return None |
||||
*/ |
||||
void setTuningCaps(uint8_t capVal); |
||||
|
||||
/** |
||||
* @fn getInterruptSrc |
||||
* @brief get interrupt source |
||||
* @return uint8_t type,returns the interrupt source type |
||||
* @retval 0 interrupt result not expected |
||||
* @retval 1 lightning caused interrupt |
||||
* @retval 2 disturber detected |
||||
* @retval 3 Noise level too high |
||||
*/ |
||||
uint8_t getInterruptSrc(void); |
||||
|
||||
/** |
||||
* @fn getLightningDistKm |
||||
* @brief get lightning distance |
||||
* @return unit kilometer |
||||
*/ |
||||
uint8_t getLightningDistKm(void); |
||||
|
||||
/** |
||||
* @fn getStrikeEnergyRaw |
||||
* @brief get lightning energy intensity |
||||
* @return lightning energy intensity(0-1000) |
||||
*/ |
||||
uint32_t getStrikeEnergyRaw(void); |
||||
|
||||
/** |
||||
* @fn setIndoors |
||||
* @brief Set to the indoor model |
||||
* @return None |
||||
*/ |
||||
void setIndoors(void); |
||||
|
||||
/** |
||||
* @fn setOutdoors |
||||
* @brief Set to the outdoor model |
||||
* @return None |
||||
*/ |
||||
void setOutdoors(void); |
||||
|
||||
/** |
||||
* @fn setOutdoors |
||||
* @brief Get the noise level |
||||
* @return Return noise level |
||||
*/ |
||||
uint8_t getNoiseFloorLvl(void); |
||||
|
||||
/** |
||||
* @fn setNoiseFloorLvl |
||||
* @brief Set the noise level |
||||
* @param 0~7,More than 7 will use the default value:2 |
||||
* @return None |
||||
*/ |
||||
void setNoiseFloorLvl(uint8_t nfSel); |
||||
|
||||
/** |
||||
* @fn getWatchdogThreshold |
||||
* @brief read WDTH |
||||
* @return Return interference level |
||||
*/ |
||||
uint8_t getWatchdogThreshold(void); |
||||
|
||||
/** |
||||
* @fn setWatchdogThreshold |
||||
* @brief Set an anti-interference rating |
||||
* @param 0~7,More than 7 will use the default value:2 |
||||
* @return None |
||||
*/ |
||||
void setWatchdogThreshold(uint8_t wdth); |
||||
|
||||
/** |
||||
* @fn getSpikeRejection |
||||
* @brief read SREJ (spike rejection) |
||||
* @return Return SREJ value |
||||
*/ |
||||
uint8_t getSpikeRejection(void); |
||||
|
||||
/** |
||||
* @fn setSpikeRejection |
||||
* @brief Modify SREJ (spike rejection) |
||||
* @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 |
||||
|
||||
MCU | Work Well | Work Wrong | Untested | Remarks |
||||
------------------ | :----------: | :----------: | :---------: | ----- |
||||
Arduino uno | √ | | | |
||||
esp8266 | √ | | | |
||||
MCU | Work Well | Work Wrong | Untested | Remarks | |
||||
------------------ | :----------: | :----------: | :---------: | :-----: | |
||||
Arduino uno | √ | | | | |
||||
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 |
||||
|
||||
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