diff --git a/DFRobot_AS3935_I2C.cpp b/DFRobot_AS3935_I2C.cpp index 3061d3e..af51901 100644 --- a/DFRobot_AS3935_I2C.cpp +++ b/DFRobot_AS3935_I2C.cpp @@ -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; } diff --git a/DFRobot_AS3935_I2C.h b/DFRobot_AS3935_I2C.h index b491db4..cce502b 100644 --- a/DFRobot_AS3935_I2C.h +++ b/DFRobot_AS3935_I2C.h @@ -1,3 +1,15 @@ + +/*! + * @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 + */ + #ifndef DFRobot_AS3935_I2C_h #define DFRobot_AS3935_I2C_h @@ -7,9 +19,9 @@ #include "Wire.h" // I2C address -#define AS3935_ADD1 0x01 // A0=high, A1=low -#define AS3935_ADD3 0x03 // A0=high, A1=high -#define AS3935_ADD2 0x02 // A0=low, A1=high +#define AS3935_ADD1 0x01 ///< A0=high, A1=low +#define AS3935_ADD3 0x03 ///< A0=high, A1=high +#define AS3935_ADD2 0x02 ///< A0=low, A1=high //#define ENABLE_DBG #ifdef ENABLE_DBG @@ -20,74 +32,226 @@ #define DBG(...) #endif -class DFRobot_AS3935_I2C -{ - public: - DFRobot_AS3935_I2C(uint8_t irqx, uint8_t devAddx); - DFRobot_AS3935_I2C(uint8_t irqx); - uint8_t begin(void); - /*! Set i2c address */ - void setI2CAddress(uint8_t devAddx); - /*! Manual calibration */ - void manualCal(uint8_t capacitance, uint8_t location, uint8_t disturber); - /*! reset registers to default */ - int defInit(void); - void disturberEn(void); - void disturberDis(void); - void setIRQOutputSource(uint8_t irqSelect); - void setTuningCaps(uint8_t capVal); - /*! 0 = unknown src, 1 = lightning detected, 2 = disturber, 3 = Noise level too high */ - uint8_t getInterruptSrc(void); - /*! Get rid of non-distance data */ - uint8_t getLightningDistKm(void); - /*! Get lightning energy intensity */ - uint32_t getStrikeEnergyRaw(void); - uint8_t setMinStrikes(uint8_t minStrk); - void clearStatistics(void); - void setIndoors(void); - void setOutdoors(void); - uint8_t getNoiseFloorLvl(void); - void setNoiseFloorLvl(uint8_t nfSel); - uint8_t getWatchdogThreshold(void); - void setWatchdogThreshold(uint8_t wdth); - uint8_t getSpikeRejection(void); - void setSpikeRejection(uint8_t srej); - void setLcoFdiv(uint8_t fdiv); - /*! View register data */ - void printAllRegs(void); - void powerUp(void); +class DFRobot_AS3935_I2C{ +public: + /** + * @fn DFRobot_AS3935_I2C + * @brief AS3935 object + * @param irqx irq pin + * @param devAddx i2c address + * @return None + */ + DFRobot_AS3935_I2C(uint8_t irqx, uint8_t devAddx); + + /** + * @fn DFRobot_AS3935_I2C + * @brief AS3935 object + * @param irqx irq pin + * @return None + */ + DFRobot_AS3935_I2C(uint8_t irqx); + + /** + * @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); - private: - uint8_t irq, devAdd; - uint8_t singRegRead(uint8_t regAdd);//原始I2C数据读取 - void singRegWrite(uint8_t regAdd, uint8_t dataMask, uint8_t regData);//原始数据发送 - int reset(void); - void powerDown(void); - void calRCO(void); - - /** - * @brief Write register value through IIC bus - * - * @param reg Register address 8bits - * @param pBuf Storage cache to write data in - * @param size The length of data to be written - */ - void writeReg(uint8_t reg, void *pBuf, size_t size); - //void writeRegNoStop(uint8_t reg, void *pBuf, size_t size) - - /** - * @brief Read register value through IIC bus - * - * @param reg Register address 8bits - * @param pBuf Read data storage cache - * @param size Read the length of data - * @return Return the read length - */ - size_t readReg(uint8_t reg, void *pBuf, size_t size); +private: + uint8_t irq, devAdd; + uint8_t singRegRead(uint8_t regAdd); + void singRegWrite(uint8_t regAdd, uint8_t dataMask, uint8_t regData); + int reset(void); + void powerDown(void); + void calRCO(void); + void clearStatistics(void); + uint8_t setMinStrikes(uint8_t minStrk); + /** + * @fn writeReg + * @brief Write register value through IIC bus + * @param reg Register address 8bits + * @param pBuf Storage cache to write data in + * @param size The length of data to be written + */ + void writeReg(uint8_t reg, void *pBuf, size_t size); + //void writeRegNoStop(uint8_t reg, void *pBuf, size_t size) + /** + * @fn readReg + * @brief Read register value through IIC bus + * @param reg Register address 8bits + * @param pBuf Read data storage cache + * @param size Read the length of data + * @return Return the read length + */ + size_t readReg(uint8_t reg, void *pBuf, size_t size); }; - #endif diff --git a/LICENSE b/LICENSE index 8000a6f..d96afd5 100644 --- a/LICENSE +++ b/LICENSE @@ -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. - - - Copyright (C) - - 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. - - , 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. diff --git a/README_CN.md b/README_CN.md new file mode 100644 index 0000000..96d27fe --- /dev/null +++ b/README_CN.md @@ -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/)) diff --git a/RaspberryPi/Python/DFRobot_AS3935_Lib.py b/RaspberryPi/Python/DFRobot_AS3935_Lib.py deleted file mode 100644 index e08d8d3..0000000 --- a/RaspberryPi/Python/DFRobot_AS3935_Lib.py +++ /dev/null @@ -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]) - - - diff --git a/RaspberryPi/Python/README.md b/RaspberryPi/Python/README.md deleted file mode 100644 index 58063ec..0000000 --- a/RaspberryPi/Python/README.md +++ /dev/null @@ -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) - - - -## 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/)) - - - - - - - diff --git a/RaspberryPi/Python/example/DFRobot_AS3935_detailed.py b/RaspberryPi/Python/example/DFRobot_AS3935_detailed.py deleted file mode 100644 index 58a548e..0000000 --- a/RaspberryPi/Python/example/DFRobot_AS3935_detailed.py +++ /dev/null @@ -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) - - diff --git a/RaspberryPi/Python/example/DFRobot_AS3935_ordinary.py b/RaspberryPi/Python/example/DFRobot_AS3935_ordinary.py deleted file mode 100644 index ef8e723..0000000 --- a/RaspberryPi/Python/example/DFRobot_AS3935_ordinary.py +++ /dev/null @@ -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) - - diff --git a/examples/DFRobot_AS3935_lightning_sensor_detailed/DFRobot_AS3935_lightning_sensor_detailed.ino b/examples/DFRobotAS3935LightningSensorDetailed/DFRobotAS3935LightningSensorDetailed.ino similarity index 79% rename from examples/DFRobot_AS3935_lightning_sensor_detailed/DFRobot_AS3935_lightning_sensor_detailed.ino rename to examples/DFRobotAS3935LightningSensorDetailed/DFRobotAS3935LightningSensorDetailed.ino index 67a3c72..40b141a 100644 --- a/examples/DFRobot_AS3935_lightning_sensor_detailed/DFRobot_AS3935_lightning_sensor_detailed.ino +++ b/examples/DFRobotAS3935LightningSensorDetailed/DFRobotAS3935LightningSensorDetailed.ino @@ -1,21 +1,20 @@ /*! - file DFRobot_AS3935_lightning_sensor.ino - - SEN0290 Lightning Sensor - This sensor can detect lightning and display the distance and intensity of the lightning within 40 km - It can be set as indoor or outdoor mode. - The module has three I2C, these addresses are: - AS3935_ADD1 0x01 A0 = 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 + * @file DFRobot_AS3935_lightning_sensor_detailed.ino + * @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) + * @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 + */ - version V1.1 - date 2021-08-24 -*/ #include "DFRobot_AS3935_I2C.h" @@ -28,8 +27,6 @@ volatile int8_t AS3935IsrTrig = 0; #define IRQ_PIN 2 #endif - - // Antenna tuning capcitance (must be integer multiple of 8, 8 - 120 pf) #define AS3935_CAPACITANCE 96 @@ -48,8 +45,7 @@ void setup() lightning0.setI2CAddress(AS3935_ADD3); - while (lightning0.begin() != 0) - { + while (lightning0.begin() != 0){ Serial.print("."); } lightning0.defInit(); @@ -109,8 +105,7 @@ void loop() // Get interrupt source uint8_t intSrc = lightning0.getInterruptSrc(); - if (intSrc == 1) - { + if (intSrc == 1){ // Get rid of non-distance data uint8_t lightningDistKm = lightning0.getLightningDistKm(); Serial.println("Lightning occurs!"); @@ -123,16 +118,11 @@ void loop() Serial.print("Intensity: "); Serial.print(lightningEnergyVal); Serial.println(""); - } - else if (intSrc == 2) - { + }else if (intSrc == 2){ Serial.println("Disturber discovered!"); - } - else if (intSrc == 3) - { + }else if (intSrc == 3){ Serial.println("Noise level too high!"); } - //View register data //lightning0.printAllRegs(); } diff --git a/examples/DFRobot_AS3935_lightning_sensor_ordinary/DFRobot_AS3935_lightning_sensor_ordinary.ino b/examples/DFRobotAS3935LightningSensorOrdinary/DFRobotAS3935LightningSensorOrdinary.ino similarity index 76% rename from examples/DFRobot_AS3935_lightning_sensor_ordinary/DFRobot_AS3935_lightning_sensor_ordinary.ino rename to examples/DFRobotAS3935LightningSensorOrdinary/DFRobotAS3935LightningSensorOrdinary.ino index 27949db..340826b 100644 --- a/examples/DFRobot_AS3935_lightning_sensor_ordinary/DFRobot_AS3935_lightning_sensor_ordinary.ino +++ b/examples/DFRobotAS3935LightningSensorOrdinary/DFRobotAS3935LightningSensorOrdinary.ino @@ -1,20 +1,19 @@ /*! - file DFRobot_AS3935_lightning_sensor.ino - - SEN0290 Lightning Sensor - This sensor can detect lightning and display the distance and intensity of the lightning within 40 km - It can be set as indoor or outdoor mode. - The module has three I2C, these addresses are: - AS3935_ADD1 0x01 A0 = 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.1 - date 2021-08-24 -*/ + * @file DFRobot_AS3935_lightning_sensor_ordinary.ino + * @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) + * @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" @@ -52,8 +51,7 @@ void setup() Serial.begin(115200); Serial.println("DFRobot AS3935 lightning sensor begin!"); - while (lightning0.begin() != 0) - { + while (lightning0.begin() != 0){ Serial.print("."); } lightning0.defInit(); @@ -88,8 +86,7 @@ void loop() // Get interrupt source uint8_t intSrc = lightning0.getInterruptSrc(); - if (intSrc == 1) - { + if (intSrc == 1){ // Get rid of non-distance data uint8_t lightningDistKm = lightning0.getLightningDistKm(); Serial.println("Lightning occurs!"); @@ -102,18 +99,12 @@ void loop() Serial.print("Intensity: "); Serial.print(lightningEnergyVal); Serial.println(""); - } - else if (intSrc == 2) - { + }else if (intSrc == 2){ Serial.println("Disturber discovered!"); - } - else if (intSrc == 3) - { + }else if (intSrc == 3){ Serial.println("Noise level too high!"); } - } - //IRQ handler for AS3935 interrupts void AS3935_ISR() { diff --git a/library.properties b/library.properties new file mode 100644 index 0000000..173384f --- /dev/null +++ b/library.properties @@ -0,0 +1,9 @@ +name=DFRobot_AS3935 +version=1.0.2 +author=DFRobot +maintainer=TangJie +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=* diff --git a/python/raspberrypi/DFRobot_AS3935_Lib.py b/python/raspberrypi/DFRobot_AS3935_Lib.py new file mode 100644 index 0000000..db4e477 --- /dev/null +++ b/python/raspberrypi/DFRobot_AS3935_Lib.py @@ -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]) + + + diff --git a/python/raspberrypi/README.md b/python/raspberrypi/README.md new file mode 100644 index 0000000..14f465f --- /dev/null +++ b/python/raspberrypi/README.md @@ -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/)) + + + + + + + diff --git a/python/raspberrypi/README_CN.md b/python/raspberrypi/README_CN.md new file mode 100644 index 0000000..9b0754e --- /dev/null +++ b/python/raspberrypi/README_CN.md @@ -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/)) diff --git a/python/raspberrypi/example/DFRobot_AS3935_detailed/DFRobot_AS3935_detailed.py b/python/raspberrypi/example/DFRobot_AS3935_detailed/DFRobot_AS3935_detailed.py new file mode 100644 index 0000000..bafc648 --- /dev/null +++ b/python/raspberrypi/example/DFRobot_AS3935_detailed/DFRobot_AS3935_detailed.py @@ -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) + + diff --git a/python/raspberrypi/example/DFRobot_AS3935_ordinary/DFRobot_AS3935_ordinary.py b/python/raspberrypi/example/DFRobot_AS3935_ordinary/DFRobot_AS3935_ordinary.py new file mode 100644 index 0000000..402ac55 --- /dev/null +++ b/python/raspberrypi/example/DFRobot_AS3935_ordinary/DFRobot_AS3935_ordinary.py @@ -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) + + diff --git a/readme.md b/readme.md index 07adc41..c72ca0c 100644 --- a/readme.md +++ b/readme.md @@ -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.
-It can be set as indoor or outdoor mode.
+ * [中文版](./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) - - +## 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
-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
+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.
+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/)) + diff --git a/resources/images/SEN0290.png b/resources/images/SEN0290.png new file mode 100644 index 0000000..daa1f27 Binary files /dev/null and b/resources/images/SEN0290.png differ