AS3935 Franklin Lightning Sensor

Simmicht

Senior Member
Working Code

Ok it is "working" but short of a storm or two, it is hard to really know.
So here is code that will do stuff. It is bit banged SPI, but that works and allows different pins to be used.


Code:
#picaxe 28x2
#terminal 38400
#SLOT 0
#no_data
#no_table



'================READ VALUES ===============
'SYMBOL StdFreq = EM16         'Has 4MHz Xtal installed
'setfreq StdFreq    



#DEFINE RESONATOR_8MHZ
'#DEFINE RESONATOR_4MHZ

#IFDEF RESONATOR_8MHZ
    #terminal 38400
    SYMBOL StdFreq = EM32         'Has 4MHz Xtal installed
    setfreq StdFreq    
    SYMBOL TXbaud=            T9600_32
    settimer t1s_16            'half seconds

    SYMBOL FourSecond =         16000
    SYMBOL TwoSecond =         8000
    SYMBOL OneSecond =         4000
    SYMBOL Point5Second =         2000
    SYMBOL Point3Second =         1200
    SYMBOL Point1Second =         400
#ENDIF

#IFDEF RESONATOR_4MHZ
    #terminal 19200
    SYMBOL StdFreq = EM16         'Has 4MHz Xtal installed
    setfreq StdFreq    
    SYMBOL TXbaud=            T9600_16

    SYMBOL FourSecond =         8000
    SYMBOL TwoSecond =         4000
    SYMBOL OneSecond =         2000
    SYMBOL Point5Second =         1000
    SYMBOL Point3Second =         600
    SYMBOL Point1Second =         200
#ENDIF





'===-[ VARIABLES ]-========================================
symbol maxreg =             b8    ' register for MAX7219
symbol maxdata =             b9    ' data to send to MAX7219

Symbol     _Tmp_1         = b0
Symbol     _Tmp_2         = b1
Symbol     _Tmp_Data_Snd     = b2
Symbol     _Tmp_Data_Rcv     = b3
Symbol     _TMP_bit         = b4 ' MISO Bit Value
Symbol     _Register_Name     = b5 ' Register Name
Symbol     _Register_Value_W = W3 ' Register Value as WORD
Symbol     _Register_Value_L = b6 ' Register Value LSB
Symbol     _Register_Value_M = b7 ' Register Value MSB


SYMBOL    CT            = B10
SYMBOL     BestCT        = W11
SYMBOL    BestDiff         = W12
SYMBOL    Diff             = W13


'===-[ AS3835 Franklin Lightning Pins ]-========================================
symbol CS1     =             B.4    ' to AS3835 chip select
SYMBOL MOSI    =             B.3    ' to MOSI on AS3835
SYMBOL MISO    =            pinB.2   ' to MISO on AS3835
SYMBOL MISO_=             B.2   ' to MISO on AS3835
SYMBOL CLK =             B.1    ' to SCK  on AS3835
SYMBOL IRQ =             B.0    ' to AS3835 IRQ


SYMBOL blueLED         =     B.7

setfreq EM32


'set CS pin HIGH to deactivate
HIGH CS1

pause 1000
sertxd("OK .",cr,lf)
pause 100





SerTxd("AS3935 ")



' 
' RESET

SerTxd("reset ",cr,lf)
_Register_Name=0x3C
_Register_Value_L=0x96
gosub write_register
' 

'
SerTxd("set Power ON ",cr,lf)
_Register_Name=0x00
_Register_Value_L=%00000000
gosub write_register


'  Calibrates automatically the internal RC Oscillators
SerTxd("Calibrates RC",cr,lf)
_Register_Name=0x3D
_Register_Value_L=0x96
gosub write_register
'
'set freq div to 16 for tuning
SerTxd("freq div 16",cr,lf)
_Register_Name=0x03
_Register_Value_L=0x00
gosub write_register

'set LCO to out on INT
SerTxd("LCO to out on INT",cr,lf)
_Register_Name=0x08
_Register_Value_L=%10000000
gosub write_register



CT=0
BestCT=0
BestDiff =$FFFF

Captune:
    _Register_Name=0x08
    _Register_Value_L=%10000000 OR CT
    gosub write_register

    count IRQ , 2000 , w0
    
    IF W0>7812 THEN
        Diff = W0-7812
    ELSE
        Diff = 7812-W0
    ENDIF
    
    IF Diff<BestDiff THEN
        BestDiff=Diff
        BestCT=CT
    ENDIF
    
'    pulsin IRQ ,1 ,W0
    sertxd("captune = ",#CT," f=",#w0,cr,lf)
    
    
'    end

    INC CT
    
IF CT<=$0F THEN Captune


sertxd("BestCT = ",#BestCT," f=",#w0,cr,lf)

_Register_Name=0x08
_Register_Value_L=%00000000 OR BestCT
gosub write_register



'  Calibrates automatically the internal RC Oscillators
SerTxd("Calibrates RC",cr,lf)
_Register_Name=0x3D
_Register_Value_L=0x96
gosub write_register
'


'set INDOOR/OUTDOOR MODE
_Register_Name=0x00
 _Register_Value_L=%00010010    'INDOOR 
'_Register_Value_L=%00001110    'OUTDOOR
_Register_Value_L=_Register_Value_L <<1
gosub write_register


doit:



'SET  WatchDog
_Register_Name=0x01
gosub read_register_8
_Register_Value_L = _Register_Value_L AND %11110000
gosub write_register

'SET  Spike Rejection
_Register_Name=0x02
gosub read_register_8
_Register_Value_L =  _Register_Value_L AND %11110000
gosub write_register


' Floor Noise level
_Register_Name=0x01
gosub read_register_8
_Register_Value_L = _Register_Value_L AND %01110000 >>4
sertxd("Noise Floor is: ",#_Register_Value_L,cr,lf)

' WatchDog Threshold
_Register_Name=0x01
gosub read_register_8
_Register_Value_L = _Register_Value_L AND %00001111
sertxd("WatchDog Threshold is: ",#_Register_Value_L,cr,lf)


' Spike rejection
_Register_Name=0x02
gosub read_register_8
_Register_Value_L = _Register_Value_L AND %00001111
sertxd("Spike rejection is: ",#_Register_Value_L,cr,lf)



#rem
pause OneSecond ' Wait a Time
'pause OneSecond




' Read Register 0X00 for get Revision Number
_Register_Name=0x00
gosub read_register_8
sertxd("The Reg 0 is : ",#_Register_Value_L,cr,lf)

' Read Register 0X00 for get Revision Number
_Register_Name=0x01
gosub read_register_8
sertxd("The Reg 1 is : ",#_Register_Value_L,cr,lf)

' Read Register 0X00 for get Revision Number
_Register_Name=0x02
gosub read_register_8
sertxd("The Reg 2 is : ",#_Register_Value_L,cr,lf)

' Read Register 0X00 for get Revision Number
_Register_Name=0x03
gosub read_register_8
sertxd("The Reg 3 is : ",#_Register_Value_L,cr,lf)

' Read Register 0X00 for get Revision Number
_Register_Name=0x04
gosub read_register_8
sertxd("The Reg 4 is : ",#_Register_Value_L,cr,lf)

' Read Register 0X07  DISTANCE
_Register_Name=0x07
gosub read_register_8
sertxd("The Reg 7 is : ",#_Register_Value_L,cr,lf)

' Read Register 0X08 for get Revision Number
_Register_Name=0x08
gosub read_register_8
sertxd("The Reg 8 is : ",#_Register_Value_L,cr,lf)






'maxreg = $07    'get distance
'GOSUB GetFrom_AS3935
'sertxd("The Reg 7 is : ",#maxdata,cr,lf)

'maxreg = $08    'get distance
'GOSUB GetFrom_AS3935
'sertxd("The Reg 8 is : ",#maxdata,cr,lf)

#endrem
'goto doit


hintsetup %00000001 ; enable all 1 pin
SETINTFLAGS %00000001 , %00000100


do

loop

END

'===-[ Subroutines ]-========================================================

INTERRUPT:
HIGH blueLED
timer= timer / 2
sertxd(cr,lf,#TIMER,":")


'IF hint0flag=1 THEN
    DO
    LOOP UNTIL PINB.0=1



    'read IRQ source
    ' Read Register 0X00 for get Revision Number
    _Register_Name=0x03
    gosub read_register_8
    _Register_Value_L = _Register_Value_L AND %00001111    'mask out other bits
    sertxd(" int type : ",#_Register_Value_L," ")


    IF _Register_Value_L=1 THEN
        Sertxd(" Noisy much")
    ENDIF
    
    IF _Register_Value_L=4 THEN
        Sertxd(" Disturber detected")
    ENDIF

    IF _Register_Value_L=8 THEN

        ' Read Register 0X07  DISTANCE
        _Register_Name=0x07
        gosub read_register_8
        _Register_Value_L = _Register_Value_L AND %00111111    'mask out other bits
        sertxd(" Distance ",#_Register_Value_L," km ")
        
    ENDIF
    
    sertxd(cr,lf)
'ENDIF



LOW blueLED

flags=0'hint0flag=0:hint1flag=0:hint2flag=0:hintflag=0
SETINTFLAGS OR %00000001 , %00000001
timer=0

RETURN



'===-[ Subroutines ]-========================================================

SendTo_AS3935:
LOW CS1
SHIFTOUT CLK,MOSI,MSBFirst_L,(maxreg,maxdata)
HIGH CS1
RETURN


GetFrom_AS3935:
LOW CS1
maxreg = maxreg OR %01000000
maxdata=0
SHIFTOUT CLK,MOSI ,MSBFirst_L,(maxreg)
SHIFTIN  CLK,MISO_,MSBPost_L,(maxdata /9)
HIGH CS1
maxdata = INV maxdata
RETURN





'---------------------------------------------------------------------------------------------------------
Write_Register:
' 
'
low CS1
_Tmp_Data_Snd=_Register_Name
gosub Snd_Rcv
_Tmp_Data_Snd=_Register_Value_L
gosub Snd_Rcv
high CS1

Return

'---------------------------------------------------------------------------------------------------------
Read_Register_8:

'
low CS1
_Tmp_Data_Snd=_Register_Name OR  %01000000 ' set bit 14 for read mode
gosub Snd_Rcv
_Tmp_Data_Snd=0
gosub Snd_Rcv
_Register_Value_L=_TMP_Data_Rcv
high CS1
Return

'---------------------------------------------------------------------------------------------------------
Read_Register_16:

'
LOW CS1
_Tmp_Data_Snd=_Register_Name
gosub Snd_Rcv
_Tmp_Data_Snd=0
gosub Snd_Rcv
_Register_Value_M=_TMP_Data_Rcv
gosub Snd_Rcv
_Register_Value_L=_TMP_Data_Rcv
HIGH CS1
Return


'---------------------------------------------------------------------------------------------------------
Snd_Rcv:
' Send Receive Data With Spi Clock
For _Tmp_2=1 to 8 ' 8 bit Frame
HIGH CLK
'Send Data MOSI ------------------------------------
_Tmp_1=128
_TMP_bit=_Tmp_Data_Snd & _Tmp_1
_Tmp_Data_Snd=_Tmp_Data_Snd<<1

IF _TMP_bit = 128 then
'    sertxd("1")
    HIGH MOSI
Else
'    sertxd("0")
    LOW MOSI
Endif
'Receve Data MISO ------------------------------------
LOW CLK
_Tmp_Data_Rcv=_Tmp_Data_Rcv<<1

IF MISO = 1 then            'MISO
    _Tmp_Data_Rcv=_Tmp_Data_Rcv+1
Endif
'-----------------------------------------------------------------------------------------------------------
Next _Tmp_2 ' Next Bit of Frame

'sertxd(cr,lf)
RETURN
 

hippy

Technical Support
Staff member
The blurb on the website says that the developer used a 'lightning emulator board'.

Have you asked him what this is ?
I'd be tempted to see what clicking a piezo-powered cigarette lighter or gas lighter did.
 

Jamster

Senior Member
Everytime I flick past this thread on the main page I read it as "Aretha Franklin Lightning Sensor"... :confused:
 

Buzby

Senior Member
Hi Nick,

I think we got a misunderstanding. I thought you meant the 2 page pdf was the one in your link !.

The 16 page pdf I found yesterday, after Googling like Lanternfish suggested, and as you say, it is not on the AMS website.

It looks like the emulator board is supplied with the evaluation kit, but the AMS website jumps all over the place, and I can't find a reference to it there.

Not that I'm bothered, I don't need a lightning detector !.

Cheers,

Buzby
 

Simmicht

Senior Member
Piezo BBQ lighter does create enough spark to make the circuit throw a DISTURBER interrupt. that some conformation at least.
Storm season is here now in Brisbane, Australia, storms keeps going around me (drats?) ... so nothing directly passing over, though a friend reported lighting about 15km away and i dodnt get a single recording.

so if anyone has some data, i would really like to get a view of it.
T
 
Top