Passiver optischer Bewegungsmelder
von Lukas und Heinz D.
Vor einigen Wochen erschien auf einer Kinderzeitschrift eine
'Alarmanlage'. Zunächst sah es so aus, dass die rote LED mit dem
Fototransistor eine Reflex-Lichtschranke bildet. Die Reichweite wäre
für ein Zimmer jedoch viel zu gering. Im Innern arbeitet ein
Fototransistor mit einem Transistor als Hochpass und ein Tonchip mit
Piezo. Dadurch werden langsame Lichtänderungen nicht signalisiert. Ein
schneller Lichtabfall wird signalisiert, ein schneller Anstieg nicht.
Nun kann man der Meinung sein, dass das ausreicht, der Sparrow sollte
für beide Fälle programmierbar sein.
Aus 64 Adc-Werten der
Helligkeit an der roten Led (B.3) wird der Mittelwert gebildet, um 50Hz
zu unterdrücken (Tiefpass). Dann wird die Differenz zum vorherigen Wert
gebiltet (Hochpass). In Tmpi wird die Hysterese berechnet. Ist die
Differenz größer als die Hysterese, wurde eine schnelle Lichtänderung
festgestellt. Die grüne LED wird eingeschaltet und in Delayms wird die
Alarm-Zeit festgelegt. Mit dem Timer0 wird ein PWM-Signal (am
PortB.1=green) erzeugt (hier kann optional ein Piezo angeschlossen
werden, der Piezo im Bild ist auf eine leere Tesarolle geklebt). Als
Licht-'Schranke' sollte der Winkel der roten Led mit einem Pappröllchen
in Richtung der max. Lichtquelle eingeschränkt werden. Bei zu vielen
Fehlalarmen kann der Divisor in Zeile 40 verkleinert werden (32..16).
Download: Sparrow-Bewgung-bas-hex.zip
Direkt laden: http://tiny.systems/categorie/cheepit/Bewegungsmelder.html
' Sparrow-Bewegungsmelder
'
' passive Lichtmessung an Led-red, mit vorhandenen Lichtquellen
'
' (Ein Piezo parallel zur Led-green kann, muss aber nicht geschaltet sein.)
' (Um störende Beeinflussung zu vermeiden, sollte PortB.4 nicht genutzt werden.)
'-------------------------------------------------------------------------------
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack
=
16
'8
$swstack =
16
'4
$framesize =
16
'4
Green Alias Portb.1 : Red Alias Portb.3
U3 Alias
Getadc(3)
' B.3, Led rot
Ddrb = &B00010 : Portb =
&B10101
' aux, red, S2, green, S1; pullup für aux, Sx
Config Adc = Single , Prescaler = Auto , Reference = Avcc : Start Adc
Config
Timer0 = Pwm , Compare_b_pwm = Clear_up , Prescale = 1 : Start
Timer0 '1,2MHz/512 ~2344Hz
Const
Alarm_zeit =
24
' Alarm
Const Messdauer =
1
' 1ms*64 oder 2ms*64=128ms
Declare Sub Mittelwert
Dim
Index As
Byte
'
Dim Adc_rot As
Word
'Adc
Dim Tmpi As Integer
Dim Delta As
Integer
'delta +-?
Dim Green_flag As
Byte
'green on
Dim Delayms As
Byte
' (ms) = Alarm_zeit * Messdauer(ms) * 64
Mittelwert
'in Adc_rot
Do
Tmpi =
Adc_rot
'Adc_alt
Mittelwert
'in Adc_rot
Delta = Tmpi -
Adc_rot
'Differenz zum vorherigen Wert
'Hysterese berechnen: unabhängig von Vcc oder Helligkeit (Autumatik)
Tmpi = Adc_rot / 32
If Delta > Tmpi Then Delayms =
Alarm_zeit
'nachtriggern
Tmpi =
-tmpi
'negieren
If Delta < Tmpi Then Delayms =
Alarm_zeit
'nachtriggern
If Delayms > 0 Then
:
'Wartezeit = Do:Loop-Schleifen
Pwm0b
= 128
:
'Green = 1 + Piezo
Delayms = Delayms - 1 :
Else :
Pwm0b = 0
:
'Green = 0 :
End If
Loop
'-------------------------------------------------------------------------------
Sub
Mittelwert
:
'var: Adc_rot, Index, Messdauer
'Aus 64 Adc-Werten der roten Led wird der Mittelwert gebildet.
Adc_rot =
0
'Integral über 64 Werte
For Index = 0 To 63 :
Adc_rot = Adc_rot + U3
:
'~1V..1,4V -> U3= 190..500
Waitms
Messdauer
:
'*64 (ms)
Next :
Adc_rot = Adc_rot /
64
'Tiefpass
End Sub
'-------------------------------------------------------------------------------
Sparrow-Zahl, ein- bis fünfstellige Dezimal-Anzeige (Word)
Dieses
Hilfsprogramm wurde zur Entwicklung des Bewegungsmelders genutzt. Ohne
PC möchte man hin und wieder den Inhalt einer Variablen wissen. Die
Anzeige kann über eine vorhandene Led erfolgen. Versuche mit
Morse-Zeichen waren nicht so einfach zu erkennen. Deshalb wurde die
simple Dezimal-Ausgabe für einfaches Mitzählen probiert. Im Beispiel
wird die Helligkeit an der roten Led (B.3) als 4-stelliger Adc-Wert
ausgegeben (0227).
Das Programm: besteht im Wesentlichen
aus 3 Sub-Routinen. In Zeig_dez wird eine (Word-) Variable in 5
Einzelziffern zerlegt (-> Tmpb(5) bis Tmpb(1). Mit Ab_stelle und
Bis_stelle kann bestimmt werden, welche Ziffern ausgegeben werden. In
Zeig wird eine Ziffer ausgegeben. Jede Ziffer beginnt mit Gblitz (grün
blitzt). Die Anzahl der grün-Impulse ist die Ziffer (1-9) zum
Mitzählen. Da eine '0' keine Impulse erzeugt, ist Gblitz zur Trennung
der Ziffern erforderlich. Um auch einen Piezo an B.1 anschließen zu
können, wird die grüne LED mit PWM ein- und ausgeschaltet.
Download: Sparrow-zahltest-bas-hex.zip
Direkt laden (zweite App auf der Seite): http://tiny.systems/categorie/cheepit/Bewegungsmelder.html
' Sparrow-Zahlenausgabe via Led (und Piezo) dezimal bis 65535 (=word)
'-------------------------------------------------------------------------------
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 16 '32
$swstack = 4 '8
$framesize = 8 '16
$programmer = 19 'UsbAsp
Green Alias Portb.1 : Red Alias Portb.3
U0 Alias Getadc(0) 'reset
U1 Alias Getadc(1) 'B.2, S2
U2 Alias Getadc(2) 'B.4, aux
U3 Alias Getadc(3) 'B.3, Led rot
Ddrb = &B00010 : Portb = &B00101 'aux, red, S2, green, S1 : pullup
Config Adc = Single , Prescaler = Auto , Reference = Avcc : Start Adc
Config Timer0 = Pwm , Compare_b_pwm = Clear_up , Prescale = 1 : '1,2MHz/511/1 = ~2344Hz = ~425,83us
Start Timer0
Const Wartkurz = 25
Const Wartlang = 200
Declare Sub Zeig_dez 'bis 65535
Declare Sub Zeig 'eine Ziffer
Declare Sub Gblitz 'grün blitzt
Declare Sub Mittelwert 'test adc(2)
Dim I As Byte , J As Byte
Dim Tmpb(5) As Byte
Dim Tmpw(5) As Word
Dim Ab_stelle As Byte
Dim Bis_stelle As Byte
Do
Mittelwert
' Tmpw(3) = 65432 'test word
' Tmpw(3) = 43210 'test word
Ab_stelle = 2 'ad-wert 4-stellig
Bis_stelle = 5
Zeig_dez
Wait 5
Loop
'-------------------------------------------------------------------------------
Sub Zeig_dez:
Tmpw(1) = Tmpw(3)
For J = 5 To 1 Step -1 'ziffern isolieren, von hinten
Tmpw(2) = Tmpw(1) Mod 10
Tmpb(j) = Tmpw(2)
Tmpw(1) = Tmpw(1) / 10
Next J
For J = Ab_stelle To Bis_stelle : 'von vorn nach hinten
Zeig :
Next J
End Sub
Sub Zeig:
Gblitz 'begin mit blitz
For I = 1 To Tmpb(j) : 'eine ziffer
Waitms Wartlang :
Pwm0b = 128: 'Green = 1 :
Waitms Wartlang :
Pwm0b = 0: 'Green = 0 :
Next I
Wait 1 'Zifferende
End Sub
Sub Gblitz : 'grün blitzt
For I = 0 To 4 :
Waitms Wartkurz :
Pwm0b = 128:
Waitms Wartkurz :
Pwm0b = 0:
Next I :
Waitms Wartlang :
End Sub
'-------------------------------------------------------------------------------
Sub Mittelwert :
'Aus 64 Adc-Werten der roten Led wird der Mittelwert gebildet.
Tmpw(3) = 0 'Integral über 64 Werte
For I = 0 To 63 :
Tmpw(3) = Tmpw(3) + U3 : '~1V..1,4V -> Ad3= 200..500
Waitms 1 : 'Messdauer*64
Next :
Tmpw(3) = Tmpw(3) / 64 'Tiefpass
End Sub
'-------------------------------------------------------------------------------