Passiver optischer Bewegungsmelder         

von Lukas und Heinz D.                           
      
Elektronik-Labor  Projekte  AVR  Sparrow  Contest          



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)

Anhören: zahl-0227.mp3

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
'-------------------------------------------------------------------------------




Elektronik-Labor  Projekte  AVR  Sparrow Contest