| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • You already know Dokkio is an AI-powered assistant to organize & manage your digital files & messages. Very soon, Dokkio will support Outlook as well as One Drive. Check it out today!

View
 

Reaktivlicht Programmcode LDR

Page history last edited by stonewood 14 years, 4 months ago

 

' ********************************************************

' *** ***

' *** Tiny-Reaktivlicht mit LDR und A/D-Wandler ***

' *** mit Watchdog-Energiesparmodus und Tagabschaltung ***

' *** ***

' ********************************************************

 

$regfile = "ATtiny13.DAT"

$crystal = 116000 'Frequenz des internen Oszillators

$hwstack = 2 'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen

 

Config Adc = Single , Prescaler = Auto

' 2 alternativen: LDR fest auf Vcc, oder auf PB0

'Config Portb = &B00001000                                   'Pinb.3 auf 'Ausgang', Rest auf 'Eingang' schalten

Config Portb = &B00001001                                   'Pinb.3 auf 'Ausgang' (LED), Pinb.0 auf 'Ausgang' (LDR-Versorgung), Rest auf 'Eingang' schalten

Portb = 0 'Ausgänge auf Low setzen

Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen

Wdtcr = &B11010011 'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset

Enable Interrupts 'Interrupts freigeben

 

Const Schwelle = 50 'je größer der Schwellwert, desto unempfindlicher

Const Tagschwelle = 800 'Schwellwert für Schlafmodus

Const Zwangsimpuls = 8 'LED-Impuls tagsÄuber alle X Schlafzyklen (a ca. 8 Sekunden)

Dim A As Byte 'Variablen definieren

Dim Tagzaehler As Byte

Dim Schlafzaehler As Byte

Dim Ldr As Integer '0 = Dunkel, 1023 = Hell

Dim Alt As Integer

Dim Merker As Integer

 

Do

  Reset Watchdog

  Powerdown 'prozessor bremsen da sonst lichtänderung nicht erkannt wird

' Auskommentieren wenn LDR fest auf Vcc

  Portb.0 = 1                                               'LDR-Stromversorgung ein 

  Start Adc 'A/D-Wandler starten

  Ldr = Getadc(2) 'Helligkeitswert einlesen

  Stop Adc 'A/D-Wandler zum Stromsparen wieder stoppen

' Auskommentieren wenn LDR fest auf Vcc

  Portb.0 = 0                                               'LDR-Stromversorgung aus              

  Merker = Ldr - Alt 'Unterschied zwischen letzter und aktueller Messung ermitteln

  Alt = Ldr 'letzten LDR-Wert sichern

  If Merker > Schwelle Then

    Gosub Blinken 'Bei großer Änderung Dunkel->Hell: Blinken

  End If

  If Ldr > Tagschwelle Then 'prüfen ob helligkeit über tagschwelle liegt

    If Tagzaehler < 255 Then 'int-variable geht nur bis 255

      Tagzaehler = Tagzaehler + 1

    End If

  Else

    Tagzaehler = 0 'wenn wieder dunkel tagzÄahler lÄoschen

  End If

  If Tagzaehler > 200 Then

    Gosub Pause 'wenn mehr als x zyklen hell dann schlafmodus

  End If

Loop

 

Blinken: 'LED blinken lassen

  For A = 1 To 10

    Portb.3 = 1

    Reset Watchdog

    Powerdown

    Portb.3 = 0

    Reset Watchdog

    Powerdown

  Next A

  Alt = 1023 'Doppelauslösung verhindern

Return

 

Pause:

  Wdtcr = &B11110001 'Watchdog auf 8 Sekunden stellen

  Reset Watchdog

  Powerdown

  Wdtcr = &B11010011 'Watchdog wieder auf 0,125 Sekunden zurückstellen

  Schlafzaehler = Schlafzaehler + 1 'merken wie oft Schlafmodus durchlaufen wurde

  If Schlafzaehler = Zwangsimpuls Then 'als Funktionskontrolle tagsüber LED auslösen

' wenn kein Zwangsimpuls gewünscht einfach die folgenden 4 Zeilen auskommentieren

    Portb.3 = 1

    Reset Watchdog

    Powerdown

    Portb.3 = 0

' ende Zwangsimpuls schalten

    Schlafzaehler = 0

  End If

Return

 

End

Comments (2)

kopito said

at 8:48 am on May 15, 2012

Hallo an alle Forumsteilnehmer.
Ich bin ein Geocacher Spanisch und interessiere mich für die Herstellung von reaktiven Lichter LDR.
Ich habe bereits die ersten von ihnen geplant mit dem Code aus dem Wiki-Link.

Ich habe einen Zweifel: Das Ergebnis ist eine blinkende LED, die etwa 4 Sekunden dauert und es blinkt (10) mit einem kurzen Intervall zwischen ihnen. Fast kontinuierlich.

Was muss ich im Quellcode ändern, um die Zeit zwischen den Blitzen zu erhöhen?

Die Anzahl der Blitze scheinen Recht (10), aber ich möchte die Gesamtlänge von ihnen zu erhöhen.

Ich hoffe, Ihre Hilfe.
Regards,

Rafa
Trushoo bei geocaching.com

upigors said

at 12:37 pm on Nov 19, 2012

change this:

For A = 1 To 10
Portb.3 = 1
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Next A

to this:
For A = 1 To 10
Portb.3 = 1
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Next A

or change the watchdog parameter : Wdtcr = &B11010011 to Wdtcr = &B11010100.......xxxxxxxxx101................xxxxxxxxxxxx110............

You don't have permission to comment on this page.