I = I + 1
Sta = 0
Trigger = 0
Level = Level + 600 'ca. 10 Blitze für maximalen Level 6000
If Level > 6000 Then Level = 6000 'max. 10 Blitze in der Auswertung
Ticks = Ticks + 1
If Ticks >= 22000 Then 'ca. 1 s
If Level > 0 Then '1 Blitz in 10 min vergessen
Level = Level - 1
If Level > 2000 Then Level = Level - 9 '1 Bltz in 1 min vergessen
End If
Locate 2 , 1
Lcd Level
Lcd " "
If Level > 2000 Then Out2 = 1 Else Out2 = 0 '> 1 Blitz pro Minute
If Level > 1000 Then Out1 = 1 Else Out1 = 0 '> 0,1 Blitz pro Minute
End If
J = Ischarwaiting(#1)Das Programm hat übrigens noch eine zweite Erweiterung bekommen. Man kann jetzt das EEPROM löschen. Das ist sinnvoll wenn man bei einer längeren Messreihe die Grenze der neuen Daten von älteren Daten unterscheiden will.
If J > 0 Then
Get #1 , J
If J = 100 Then
B = 0
For N = 0 To 1023
Writeeeprom B , N
Next N
End If
Eeadr = J * 128
For N = 1 To 128
Readeeprom B , Eeadr
Put #1 , B
Eeadr = Eeadr + 1
Next N
End If
Das VB-Programm wurde entsprechend erweitert und hat nun eine Löschtaste. Außerdem wurde der Plotterbereich in vier Abteilungen für die vier Einzelmessungen unterteilt.
Arduino-Blitzwarner
' 1306-Blitz-Detector1 digital (TA7642+BC547)
'-------------------------------------------------------------------------------
' Ein positiver Impuls an PB4 speichert den Wert und zeigt rt/ge/gn an
' Nach 1,5s wird die Anzeige abgeschaltet, wg. Stromverbrauch
' Mit der Taste wird nur die Anzeige für 1,5s eingeschaltet
'###############################################################################
' T13 ___
' Reset/Adc0 /-_-| +3 Vcc o-|___|-|>|+
' Anzeige | | 220 rt | ___
' -Taste Pb3/Adc3 | | Pb2/Adc1 o----------+-|___|-|>|-+
' Blitz- | | 220 gn | ___
' Input Pb4/Adc2 | | Pb1 o----------------------+-|___|-|>|-| Gnd
' | | 220 ge
' Gnd |___| Pb0 o---||--|
' Piezo
'###############################################################################
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 16
$framesize = 24
Data "1 3 0 6 _ B l i t z _ D e t e c t o r 1 _ D i g i t a l " 'an Adr 0x46=Name
'-------------------------------------------------------------------------------
Ddrb = &B00111
Piezo Alias Portb.0 'Piep für 0,1s
Led_1 Alias Portb.1
Led_2 Alias Portb.2
Taste Alias Pinb.3 : Portb.3 = 1 'pullup
Inpu1 Alias Pinb.4 : Portb.4 = 1 'pullup
Const Totzeit = 1500 'ms zwischen 2 Blitzen
Const Tonhohe = 500 'us=1kHz
Const Tonlang = 99 'Cyclen
Const Grenz_rt = 20 'unter 20s
Const Grenz_gn = 200 'über 200s
Dim I As Byte 'für Piep
Dim Delay200ms As Byte '5Hz bei 1,2MHz
Dim Delay1s As Word '1s Zähler
Dim Blitzabstand As Word 'letzter Wert
Blitzabstand = 2000 'grün
Config Timer0 = Timer , Prescale = 1024
On Ovf0 Int_t0 : Enable Timer0 : Start Timer0 : Enable Interrupts
Do
Main:
If Inpu1 = 1 Then 'Blitzimpuls 1=aktiv=TA7642
Blitzabstand = Delay1s :
Delay1s = 0 :
Goto Anzeige
End If
If Taste = 1 Then Goto Main 'Taste gedrückt ?
Anzeige:
Ddrb = &B00111
For I = 0 To Tonlang :
Piezo = 1 : Waitus Tonhohe :
Piezo = 0 : Waitus Tonhohe :
Next I
If Blitzabstand < Grenz_rt Then '<20s
Led_1 = 0 : Led_2 = 0 'rot
Else '>20s
If Blitzabstand > Grenz_gn Then
Led_1 = 0 : Led_2 = 1 'grün
Else '20s-200s
Led_1 = 1 : Led_2 = 1 'gelb
End If
End If
Waitms Totzeit :
Ddrb = &B00000 'LED aus
Loop
'###############################################################################
Int_t0:
Timer0 = 21 '255-234 1,2MHz -> 5Hz
If Delay200ms < 4 Then
Incr Delay200ms
Else
Delay200ms = 0
If Delay1s < 65534 Then Incr Delay1s '
End If
Return
'###############################################################################
'Gewitterwarner 2
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 8
$framesize = 8
Config Adc = Single , Prescaler = 2 , Reference = Avcc ' Pre 8...32
Start Adc
Open "comb.1:9600,8,n,1,INVERTED" For Output As #1
Config Portb.4 = Output
Portb.3 = 1
Dim D As Word
Dim B As Byte
Dim U1 As Byte
Dim U2 As Byte
Dim Ticks As Byte
Dim Ticks2 As Byte
Dim Level As Word
Config Portb = &B00010111
U2 = 15
U1 = 15
Do
D = Getadc(3)
Shift D , Right , 4 '0..63
B = D
U1 = B
'B = B + 2 'VCC=5V
B = B + 8 'Vcc=1,5 V
If B < U2 Then
Portb.0 = 1
Waitms 4
Portb.0 = 0
Level = Level + 600
If Level > 20000 Then Level = 20000
End If
U2 = U1
U1 = B
'Put #1 , U
'Waitms 10
Ticks = Ticks + 1
If Ticks >= 200 Then
Ticks = 0
Ticks2 = Ticks2 + 1
If Ticks2 > 35 Then
Ticks2 = 0 'ca. 1 s
Put #1 , B
If Level > 10 Then
Level = Level - 1 '1 Blitz in 10 min vergessen
If Level > 2000 Then Level = Level - 9 '1 Blitz in 1 min vergessen
If Level > 6000 Then Level = Level - 20 '3 Blitze in 1 min vergessen
End If
If Level < 1000 Then Portb = &B00010000 'weniger als 1 Blitz in 10 min
If Level > 1000 Then Portb = &B00010010 '>10 Blitze pro min
If Level > 2000 Then Portb = &B00010100 '<1 Blitz pro min
If Level > 6000 Then Portb = &B00010110 '>3 Blitze pro min
End If
End If
Loop
End