You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
4.1 KiB
137 lines
4.1 KiB
/*!
|
|
* @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/DFRobot/DFRobot_AS3935
|
|
*/
|
|
|
|
|
|
#include "DFRobot_AS3935_I2C.h"
|
|
|
|
volatile int8_t AS3935IsrTrig = 0;
|
|
|
|
// The Arduino UNO can only use IO2 or IO3 as interrupt pins, whereas the
|
|
// ESP32 can use all pins as interrupt pins. Connect the lightning sensor's
|
|
// IRQ pin to a GPIO pin on the microcontroller then replace the number
|
|
// below with the connected GPIO pin.
|
|
#define IRQ_PIN 2
|
|
|
|
// Antenna tuning capcitance (must be integer multiple of 8, 8 - 120 pf)
|
|
#define AS3935_CAPACITANCE 96
|
|
|
|
// I2C address
|
|
#define AS3935_I2C_ADDR AS3935_ADD3
|
|
|
|
void AS3935_ISR();
|
|
|
|
DFRobot_AS3935_I2C lightning0((uint8_t)IRQ_PIN);
|
|
|
|
void setup()
|
|
{
|
|
|
|
Serial.begin(115200);
|
|
Serial.println("DFRobot AS3935 lightning sensor begin!");
|
|
|
|
lightning0.setI2CAddress(AS3935_ADD3);
|
|
|
|
while (lightning0.begin() != 0){
|
|
Serial.print(".");
|
|
}
|
|
lightning0.defInit();
|
|
|
|
// Configure sensor
|
|
lightning0.powerUp();
|
|
|
|
//set indoors or outdoors models
|
|
lightning0.setIndoors();
|
|
//lightning0.setOutdoors();
|
|
|
|
//disturber detection
|
|
lightning0.disturberEn();
|
|
//lightning0.disturberDis();
|
|
|
|
lightning0.setIRQOutputSource(0);
|
|
|
|
#if defined(ESP32) || defined(ESP8266)
|
|
attachInterrupt(digitalPinToInterrupt(IRQ_PIN),AS3935_ISR,RISING);
|
|
#else
|
|
attachInterrupt(/*Interrupt No*/0,AS3935_ISR,RISING);
|
|
#endif
|
|
delay(500);
|
|
//set capacitance
|
|
lightning0.setTuningCaps(AS3935_CAPACITANCE);
|
|
Serial.println("AS3935 manual cal complete");
|
|
|
|
// Enable interrupt (connect IRQ pin IRQ_PIN: 2, default)
|
|
// Connect the IRQ and GND pin to the oscilloscope.
|
|
// uncomment the following sentences to fine tune the antenna for better performance.
|
|
// This will dispaly the antenna's resonance frequency/16 on IRQ pin (The resonance frequency will be divided by 16 on this pin)
|
|
// Tuning AS3935_CAPACITANCE to make the frequency within 500/16 kHz ± 3.5%
|
|
// lightning0.setLcoFdiv(0);
|
|
// lightning0.setIRQOutputSource(3);
|
|
|
|
// Set the noise level,more than 7 will use the default value:2
|
|
lightning0.setNoiseFloorLvl(2);
|
|
//uint8_t noiseLv = lightning0.getNoiseFloorLvl();
|
|
|
|
//used to modify WDTH,alues should only be between 0x00 and 0x0F (0 and 7)
|
|
lightning0.setWatchdogThreshold(2);
|
|
//uint8_t wtdgThreshold = lightning0.getWatchdogThreshold();
|
|
|
|
//used to modify SREJ (spike rejection),values should only be between 0x00 and 0x0F (0 and 7)
|
|
lightning0.setSpikeRejection(2);
|
|
//uint8_t spikeRejection = lightning0.getSpikeRejection();
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
// It does nothing until an interrupt is detected on the IRQ pin.
|
|
while (AS3935IsrTrig == 0) {delay(1);}
|
|
delay(5);
|
|
|
|
// Reset interrupt flag
|
|
AS3935IsrTrig = 0;
|
|
|
|
// Get interrupt source
|
|
uint8_t intSrc = lightning0.getInterruptSrc();
|
|
if (intSrc == 1){
|
|
// Get rid of non-distance data
|
|
uint8_t lightningDistKm = lightning0.getLightningDistKm();
|
|
Serial.println("Lightning occurs!");
|
|
Serial.print("Distance: ");
|
|
Serial.print(lightningDistKm);
|
|
Serial.println(" km");
|
|
|
|
// Get lightning energy intensity
|
|
uint32_t lightningEnergyVal = lightning0.getStrikeEnergyRaw();
|
|
Serial.print("Intensity: ");
|
|
Serial.print(lightningEnergyVal);
|
|
Serial.println("");
|
|
}else if (intSrc == 2){
|
|
Serial.println("Disturber discovered!");
|
|
}else if (intSrc == 3){
|
|
Serial.println("Noise level too high!");
|
|
}
|
|
//View register data
|
|
//lightning0.printAllRegs();
|
|
}
|
|
|
|
//IRQ handler for AS3935 interrupts
|
|
#if defined(ESP32) || defined(ESP8266)
|
|
void IRAM_ATTR AS3935_ISR()
|
|
#else
|
|
void AS3935_ISR()
|
|
#endif
|
|
{
|
|
AS3935IsrTrig = 1;
|
|
}
|
|
|