View previous topic :: View next topic |
Author |
Message |
EDC
Joined: 26 Mar 2014 Posts: 971
|
Posted: Sat Dec 03, 2016 11:45 pm Post subject: AS3935 Franklin Lightning Sensor IC |
|
|
Hello.
This sensor can detect "storm" from 40km
It detect lighting but can reject incorrect signals.
Sensor have antenna that must be tuned for 500kHz.
For that purpose device have internall capacitors that can be attached via software settings.
Device can be set to mode in which one pin give output of antena resonation/16 (this divider can be also set but this is default)
So we need some time base (1s from RTC or Timer) and once choose best tune value.
After best value is found there is no need to search it every boot.
Enough is to read it from eeprom and write to device reg.
But at every reboot, and after write correct tune value, RCO calibration is needed (takes 2ms)
If you find bug please share
Code: | $regfile = "m644pdef.dat"
$crystal = 11059200
$hwstack = 64
$swstack = 32
$framesize = 128
Config Submode = New
Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.4 , Db6 = Porta.5 , Db7 = Porta.6 , E = Porta.2 , Rs = Porta.0 , Wr = Porta.1 'Kujawa
Cursor Off , Noblink
Config Lcd = 20x4
Cls
'***********************************************************
'* I2C CONFIG *
'***********************************************************
$lib "i2c_twi.lbx"
Config Scl = Portc.0
Config Sda = Portc.1
I2cinit
Config Twi = 100000
'***********************************************************
'* TIMER FOR TIMEBASE *
'***********************************************************
Config Timer0 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
Enable Compare0a : On Compare0a Timer0_isr : Compare0a = 107 '10ms @11MHz/1024
Dim 10ms As Byte , 1s As Byte , Overflows As Byte , N As Byte , Helpb As Byte
'***********************************************************
'* ALS CONFIG *
'***********************************************************
Const Als_addr = &H06 : Const Direct = &H96
Dim Read_als As Byte , Antena As Byte , Antena_ee As Eram Byte
Int_pin Alias Pinb.1
Buzz Alias Portc.7 : Config Buzz = Output
'***********************************************************
'* FUNCTIONS *
'***********************************************************
'Function Tune() is only needed once after programming.
' AS3935 have internal capacitors for antena tune to 500kHz.
' Output INT pin can be temporary programmed to be output of antena frequency/16 (by default)
' So 500000/16=31250 and by setting one of 16 capacitors variation we search best tune
' Last step is memorize best combination for skip 16s test in next boot
Function Tune () As Byte
Config Timer1 = Counter , Edge = Falling
Locate 1 , 1 : Lcd "Wait..."
Local Reg As Byte : Reg = &B10000000
Local Helpi As Integer , Diff As Word , Mem As Word
Local Tim As Word , Best As Byte
Waitms 10
For N = 0 To 15
Locate 1 , 15 : Lcd N
I2cstart 'send start
I2cwbyte Als_addr 'send address
If Err = 0 Then
I2cwbyte &H08
I2cwbyte Reg
I2cstop
1s = 0
Do : Loop Until 1s = 1
Timer1 = 0 : 1s = 0
Do : Loop Until 1s = 1
Tim = Timer1
Helpi = Tim - 31250 'search for minimal diff
Diff = Abs(helpi )
Locate 4 , 1 : Lcd Diff ; " "
If N > 0 Then
If Diff < Mem Then
Best = N : Mem = Diff
End If
Else
Best = N : Mem = Diff
End If
Incr Reg
Else
Locate 3 , 1 : Lcd "I2C ERROR"
Exit For
End If
Next
Locate 2 , 1 : Lcd "N=" ; Best ; " Diff=" ; Mem
Tune = Best
End Function
Sub Write_reg (byval Adrs As Byte , Value As Byte)
I2cstart
I2cwbyte Als_addr
I2cwbyte Adrs
I2cwbyte Value
I2cstop
End Sub
Sub Tune_cap ()
'This sub write learned value of needed capacitors or run Tune() function for first time
Antena = Antena_ee
If Antena_ee = &HFF Then
Antena = Tune ()
Antena_ee = Antena
Cls
End If
Call Write_reg (&H08 , Antena )
Waitms 2
End Sub
Sub Tune_rco ()
'This is procedure that must be performed once at reboot
Helpb = Direct 'constant &H96
Call Write_reg ( &H3d, Helpb ) 'write &H96 into Reg &H3D
Antena.5 = 1
Call Write_reg (&H08 , Antena )
Waitms 2
Antena.5 = 0
Call Write_reg (&H08 , Antena )
End Sub
Function Read_reg (byval Adrs As Byte)as Byte
I2cstart
I2cwbyte Als_addr
I2cwbyte Adrs
I2crepstart
I2cwbyte Als_addr +1
I2crbyte Read_reg , Nack
I2cstop
End Function
Sub Set_outside ()
'Use this if sensor is outside because default sense is boosted for indoor use
Helpb = Read_reg (&H00 ) And &B00000001
Helpb = Helpb Or &B00011100
Write_reg (&H00 , Helpb )
End Sub
Sub Set_powerdown ()
'Not tested but this should set this mode
Helpb = Read_reg (&H00 ) Or &B00000001
Write_reg (&H00 , Helpb )
End Sub
Enable Interrupts
Call Tune_cap ()
Call Tune_rco ()
Waitms 500 : Lcd "Waiting..."
Pcmsk1 = &B00000010 : Portb.1 = 1
Enable Pcint1 : On Pcint1 Als_isr
Do
If Read_als = 1 Then
Read_als = 0
Set Buzz : Waitms 2 : Reset Buzz 'quick beep and needed(datasheet) wait time for read
Locate 2 , 1 : Lcd "Got something!"
Helpb = Read_reg (&H03 ) And &B00001111
Locate 2 , 1
Select Case Helpb
Case &B00000001 : Lcd "Noise to high"
Case &B00000100 : Lcd "Disturber det"
Case &B00001000 : Lcd "Lightening ! "
Helpb = Read_reg (&H07 ) And &B00111111
Locate 3 , 1
Select Case Helpb
Case &H01 : Lcd "Storm is here"
Case &H05 To &H28 : Lcd Helpb ; "km "
Case &H3F : Lcd "Out of range"
End Select
Case Else
Locate 3 , 1 : Lcd Bin(helpb )
End Select
End If
Loop
End
Timer0_isr :
Incr 10ms
If 10ms = 100 Then '100x10ms=1s
10ms = 0
1s = 1
End If
Return
Als_isr :
If Int_pin = 1 Then Read_als = 1
'if sensor report event you must wait 2ms and then read regs
Return |
EDIT : Address for read fixed
Last edited by EDC on Mon Jan 02, 2017 12:26 am; edited 6 times in total |
|
Back to top |
|
|
O-Family
Joined: 23 May 2010 Posts: 320 Location: Japan
|
Posted: Sun Dec 04, 2016 1:30 am Post subject: |
|
|
Hi EDC
I also like this sensor.
What kind of system are you assembling?
I made it possible to operate about half a year on dry batteries.
The distance of lightning is also displayed on the LCD with an easy graph.
I can output the recorded lightning movement to the serial terminal.
I'm sorry it's written in Japanese.
http://www.ne.jp/asahi/shared/o-family/ElecRoom/AVRMCOM/AS3935/AS3935_test.html#AS3935Clk |
|
Back to top |
|
|
EDC
Joined: 26 Mar 2014 Posts: 971
|
Posted: Sun Dec 04, 2016 2:13 am Post subject: |
|
|
Haha I know your code O-Family and thats why I mentioned about RTC for 1s signal
For those who wants your code is not complicated but this is code for complete clock with alarms etc.
So essential way to understand how it works is blurred
Thats why I read datasheet and want to clarify how to handle it- it is simple I think |
|
Back to top |
|
|
O-Family
Joined: 23 May 2010 Posts: 320 Location: Japan
|
Posted: Sun Dec 04, 2016 3:32 am Post subject: |
|
|
Thank you for knowing my site!
My program is completed as a clock, but each process is divided into blocks.
If can understand Japanese comments, I think that it can be used as a module.
I am not good at English, so I'm sorry I have not written comments in English.
I think that your program is also good, but I was interested in your whole system! |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Mon Dec 05, 2016 4:11 pm Post subject: |
|
|
amazing chip. had no idea something like that was possible and/or existed.
Thanks for sharing the code and pdf. _________________ Mark |
|
Back to top |
|
|
aphawk
Joined: 23 Jan 2010 Posts: 168 Location: Brazil
|
Posted: Sun Jan 01, 2017 11:08 pm Post subject: |
|
|
Hi EDC,
I have some problems with your program and my sensor.
First, in the sub tune_rco() :
This don't worked ( don't set the frequency to the correct ) :
Code: | Antena.5 = 1
Call Write_reg(&H08 , Antena)
Waitms 2
Antena.5 = 0
|
This worked :
Code: | Antena.7 = 1
Call Write_reg(&H08 , Antena)
Waitms 2
Antena.7 = 0
|
Second, in the function Read_reg() :
The code you used don't works to me. I always receive &b00000101 in all register I tried read.
I changed to this code and now is reading ok :
Code: | Local Buff As Byte
Buff = Adrs
I2creceive Als_addr , Buff , 1 , 1
Read_reg = Buff
|
My sensor is form Embedded Adventures, version 8.
Paulo |
|
Back to top |
|
|
EDC
Joined: 26 Mar 2014 Posts: 971
|
|
Back to top |
|
|
aphawk
Joined: 23 Jan 2010 Posts: 168 Location: Brazil
|
Posted: Mon Jan 02, 2017 3:35 am Post subject: |
|
|
EDC,
What a hell ..... I downloaded the last version from the datasheet in the AMS Website, Version 1.04... see this :
Maybe the AMS people likes to see many of us in despair kkkkk ! Wait for the next revision, they will put bit 7 here !
Anyway, this information is in the case of the CI be set in powerdown mode, that is not the case here ( well ... i think .... is debatable, really ).
But I used antena.7 , and this fixed the LCO frequency. But the only way I found to calibrate the SRCO and TRCO was using that auto-calibrate command sequence after made the antenna LCO tuning.
I had lost two days to learn a lot of this sensor, tried many ways to calibrate all the oscillators, and the best I could was put the Antenna oscillator in 500.680 hz. But the SRCO is at 1.134 Mhz , and the TRCO is running at 32468 Hz. My room temperature is 25 Celsius.
The datasheet indicate that is possible to make the manual calibration for SRCO and TRCO, but I can't made this work...
My sensor is a little deaf, even at maximum sensibility only detects a strike very near.
I buy another today, maybe I have a better luck.
Paulo |
|
Back to top |
|
|
O-Family
Joined: 23 May 2010 Posts: 320 Location: Japan
|
Posted: Mon Jan 02, 2017 2:00 pm Post subject: |
|
|
Antenna tuning DISP_LCO is bit 7 of register 08h.
In my case, SRCO and TRCO are operating normally with automatic calibration.
The manual states that it is necessary to perform the CALIB_RCO command (Write 96h to register 3Dh) when putting AS3935 into power down mode.
In case of normal power on (including reset), I think that RCO automatic calibration (bit 6 of register 08h) is good after antenna tuning.
Quote: | My sensor is a little deaf, even at maximum sensibility only detects a strike very near. |
This sensor analyzes the components of lightning over time, so it may be difficult to test if it is not actual lightning. |
|
Back to top |
|
|
aphawk
Joined: 23 Jan 2010 Posts: 168 Location: Brazil
|
Posted: Mon Jan 02, 2017 2:43 pm Post subject: |
|
|
O-Family,
Thanks a lot for your confirmation.
I found one small bug in the EDC code, and that was blinding my sensor.
If the sensor catches some disturb or high noise , the interrupt goes high. If there is a lot of noise, this can happens very quickly.
After the instruction CALL Tune_rco() , there is a delay before the interrupt be enabled, about 500 milliseconds.
If during this time the interrupt fires, the INT pin goes HIGH, and stay HIGH, waiting for the interrupt register be read, and only after this the interrupt can works again.
But the interrupt enabled in Atmega is a Changing Level interrupt. If the pin stay high, interrupt never will be triggered and the Read_als flag was not set !
And even if other interrupt fire INSIDE the Do : Loop code, this will blind the sensor again.
Then I modified the code, disabling the interrupt, and checking if the Interrupt pin are in High state, then the code can proceed to check what was reported by the sensor. This resolved the blinding situation.
After that, I had a lot of beeps, like a Geiger counter kkkkk .... and can make a better adjust of noise level and watchdog. I had 2 or 3 beeps every minute, reported as Disturbs, and now I set the flag to ignore the Disturb detection with this small code :
Code: |
Helpb = Read_reg(&H03)
Helpb.5 = 1
Call Write_reg(&H03 , Helpb)
|
I think that now the sensor will catch more lightnings... almost every day one storm pass near my house ( its Summer here and with temperatures above 30 Celsius every day... )
I modified all the program to works with one Arduino Uno, and I'm using one PCF8574 LCD adapter in my LCD and using only I2C to make the wiring less complicated. I will test more one or two days and report the progress here.
EDC, I can post the code modified for Arduino Uno in the Arduino section of this Forum ( sure with your credits ) ?
Paulo |
|
Back to top |
|
|
O-Family
Joined: 23 May 2010 Posts: 320 Location: Japan
|
Posted: Mon Jan 02, 2017 3:20 pm Post subject: |
|
|
Hi aphawk
I am using the sensitivity setting of the sensor as the initial value.
It is an "indoor" mode.
Quote: | If the sensor catches some disturb or high noise , the interrupt goes high. If there is a lot of noise, this can happens very quickly. |
Yes, the datasheet says that it will wait for 1 second after detecting lightning, but in fact it will detect continuously.
I think this is a sensor bug or a mistake in the datasheet.
After detecting the pin change interrupt, I detect the level of the [IRQ] pin in the main routine, judge the INT bit of register 03h, display it, read register 03h again and reset [IRQ] pin.
Quote: | After that, I had a lot of beeps, like a Geiger counter kkkkk .... and can make a better adjust of noise level and watchdog. |
This sensor is a radio receiver. And it is very delicate!
Therefore, switching power supplies with poor performance can not be used for the power supply of the sensor.
We recommend batteries.
Also, if there is a computer, monitor display, or a device that generates noise near the sensor, the sensor will not operate normally.
Frequently detect noise and miss the lightning.
AVR is also desirable to sleep while waiting. |
|
Back to top |
|
|
EDC
Joined: 26 Mar 2014 Posts: 971
|
|
Back to top |
|
|
O-Family
Joined: 23 May 2010 Posts: 320 Location: Japan
|
Posted: Mon Jan 02, 2017 5:20 pm Post subject: |
|
|
Hi EDC
Quote: | I saw O-Family RCO tuning code part with Bit 6 but I`ve read my datasheet and with my 5 bit my sensor in autumn shows storms. |
The data sheet you are looking at is old.
The latest version is below.
https://www.openhacks.com/uploadsproductos/as3935_datasheet_v1-04.pdf
I think that calibration of SRCO and TRCO will work with initial value if antenna tuning is done normally.
Therefore, even though mistook bit 5 and bit 6, I think there is no big influence on the detection of lightning. |
|
Back to top |
|
|
aphawk
Joined: 23 Jan 2010 Posts: 168 Location: Brazil
|
Posted: Tue Jan 03, 2017 12:50 am Post subject: |
|
|
EDC,
Wow .... I think that maybe we can exchange our homes kkkkk ... at now, 21:08 , temperature outside my room is 29 Celsius, and is "so low" because some hours ago a storm with many rain passed here in São Paulo, Brasil...... really here is very hot ( and wet ) at this month.
I loved to see your picture, is like a dream to me. Snow, animals, quiet, all things I hoped ! What is the name of the city you live ?
Finally my sensor detected many strikes today ! From 27 Km ( the far ) until Storm Here, I'm happy with it.
My final goal is using this sensor with an ESP8266 with battery, this way I can put it at high, outside, some meters above my roof, sending only strikes report via WIFI using the website ThingSpeak. Will use the interrupt to wake up the ESP8266. But this is for some time ahead. I need to learn mode about ESP8266Basic to use sleep modes.
Now I will make small mods in this program, including one button to show the events in sequence with relative time between them.
I made one smalll routine to show the values of the SRCO and TRCO, will include then in the program.
Thanks for your permission to modify and share this project !
O-Family,
I see your project too, I learned a lot seeing your code. Thanks for sharing it !
I will make other project, and using one RTC, using the AVR sleep mode too, and awake with interrupt from sensor or pressing a button. Will use one small Nokia display too, but from now I will play a little more based in my Arduino Uno.
Paulo |
|
Back to top |
|
|
O-Family
Joined: 23 May 2010 Posts: 320 Location: Japan
|
Posted: Tue Jan 03, 2017 4:13 am Post subject: |
|
|
Quote: | MFinally my sensor detected many strikes today ! From 27 Km ( the far ) until Storm Here, I'm happy with it. |
that's nice!
Quote: | My final goal is using this sensor with an ESP8266 with battery, this way I can put it at high, outside, some meters above my roof, sending only strikes report via WIFI using the website ThingSpeak. |
This sensor is designed to be usable even indoors.
If you can receive Medium wave radio broadcasts in your room, the AS3935 will fully inform us of the thunder's approach.
Quote: | I see your project too, I learned a lot seeing your code. Thanks for sharing it ! |
Although the source comment is Japanese, the language of BASCOM is common all over the world!
Thank you Mark.
I edited the motion video so that everyone can be helpful.
https://youtu.be/eRW2tWo0w4g
After detecting the lightning strike as noise, you can see how it is determined to be a lightning strike about 1 second later. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You cannot download files in this forum
|
|