Probably, it makes sense. I would suggest as follows:
if distance < 100 then cm
else if distance <10000 then meters
else km
this means 100 = 1m, 10000 = 100m, >10000 is > 0.1km
This is sketch. The distance can be multiplied easily:
Code: Select all
#define MY_DEBUG
//#define MY_DEBUG_VERBOSE_SIGNING
// Enable and select radio type attached
#define MY_RF24_CE_PIN 7
#define MY_RF24_CS_PIN 8
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
#define MY_NODE_ID 13
//Signing soft
//#define MY_SIGNING_SOFT
//#define MY_SIGNING_SOFT_RANDOMSEED_PIN 7
//#define MY_SIGNING_ATSHA204
//#define MY_SIGNING_REQUEST_SIGNATURES
#include <Wire.h>
#include <MySensors.h>
#include <AS3935.h> // AS3935 MOD-1016 by Embedded Adventures
volatile bool detected = false;
//-----------------IMPORTANT--------------------
//---------------CHANGE SETTINGS HERE-----------
#define IRQ_pin 2
#define AS3935_TUNE_CAPS 6 // <-- SET THIS VALUE TO THE NUMBER LISTED ON YOUR BOARD
#define AS3935_INDOORS 1 // AS3935_INDOORS=1 indoors, AS3935_INDOORS=0 outdoors
#define AS3935_NOISE_FLOOR 6
#define AS3935_ENABLE_DISTURBERS 1 // 0 or 1
#define CHILD_ID_DISTANCE 1
#define CHILD_ID_INTENSITY 2
#define CHILD_ID_STAT 3
MyMessage msgDist(CHILD_ID_DISTANCE, V_DISTANCE);
MyMessage Prefix(CHILD_ID_DISTANCE, V_UNIT_PREFIX);
MyMessage msgInt(CHILD_ID_INTENSITY, V_VAR5);
MyMessage msgStat(CHILD_ID_STAT, V_TEXT);
void setup()
{
Serial.begin(115200);
while (!Serial) {}
Serial.println("MOD-1016 (AS3935) Lightning Sensor");
Serial.println("beginning boot procedure....");
Wire.begin();
mod1016.init(IRQ_pin);
//-----------------IMPORTANT--------------------
//---------------CHANGE SETTINGS HERE-----------
//Tune Caps, Set AFE, Set Noise Floor
//autoTuneCaps(IRQ_pin);
mod1016.setTuneCaps(AS3935_TUNE_CAPS);
delay(2);
#if AS3935_INDOORS == 1
mod1016.setIndoors();
#else
mod1016.setOutdoors();
#endif
delay(2);
mod1016.setNoiseFloor(AS3935_NOISE_FLOOR);
delay(2);
#if AS3935_ENABLE_DISTURBERS == 1
mod1016.enableDisturbers();
#else
mod1016.disableDisturbers();
#endif
//mod1016.calibrateRCO();
delay(2);
Serial.println("TUNE\tIN/OUT\tNOISEFLOOR");
Serial.print(mod1016.getTuneCaps(), HEX);
Serial.print("\t");
Serial.print(mod1016.getAFE(), BIN);
Serial.print("\t");
Serial.println(mod1016.getNoiseFloor(), HEX);
//Serial.print("\n");
pinMode(IRQ_pin, INPUT);
attachInterrupt(digitalPinToInterrupt(IRQ_pin), alert, RISING);
Serial.println("after interrupt");
// delay execution to allow chip to stabilize.
delay(1000);
}
void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo("Lightning Sensor MOD-1016", "1.0");
// Register all sensors to gw (they will be created as child devices)
present(CHILD_ID_DISTANCE, S_DISTANCE);
send(Prefix.set("km"));
present(CHILD_ID_INTENSITY, S_CUSTOM);
present(CHILD_ID_STAT, S_INFO);
}
void loop() {
if (detected) {
translateIRQ(mod1016.getIRQ());
detected = false;
}
}
void alert() {
detected = true;
}
void translateIRQ(uns8 irq) {
switch(irq) {
case 1:
Serial.println("Noise detected");
break;
case 4:
Serial.println("Disturber detected");
//send(msgStat.setSensor(CHILD_ID_STAT).set("Disturber detected"));
break;
case 8:
Serial.println("Lightning detected!");
printandsendToGW();
break;
}
}
void printandsendToGW() {
int distance = mod1016.calculateDistance();
unsigned int lightning_intensity = mod1016.getIntensity();
if (distance == -1)
Serial.println("Lightning out of range");
else if (distance == 1)
Serial.println("Distance not in table");
else if (distance == 0)
Serial.println("Lightning overhead") & send(msgStat.setSensor(CHILD_ID_STAT).set("Lightning overhead!"));
else {
Serial.print("Lightning ~");
Serial.print(distance);
Serial.println("km away\n");
Serial.print("Lightning Intensity: ");
Serial.println(lightning_intensity);
send(msgStat.setSensor(CHILD_ID_STAT).set("Lightning in a distance"));
send(msgDist.set(distance));
send(msgInt.set(lightning_intensity));
}
}