• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Reaktives Licht mit Atmel AVR

eigengott

Geowizard
conrad schrieb:
Allerdings benötige ich das Programm so das die LED so lange leuchtet wie der LDR angeleuchtet wird. Da ich vermute das beißt sich mit dem Tag-Ruhe-Modus irgendwie,

Eigentlich nicht.

1. Warten bis LDR-Änderung > Schwellwert
2. Dunkel = LDR - Schwellwert
3. LED an
4. Warten bis LDR <= Dunkel
5. LED aus
 

conrad

Geocacher
Ja aber woher weiß der Tiny denn dann ob Tag ist oder ob da einer gegenfunzelt?
Ich geb ehrlich zu das ich die Funktion der ganzen Geschichte in ihrer Gesamtheit nicht nachvollziehen kann. Hab mal versucht mich in dei Schaltungen reinzudenken, ist aber nicht wirklich gelungen......
Gruß Conrad
 

stonewood

Geowizard
Das Programm hat einen Zähler eingebaut - die Variable nennt sich sinnigerweise tagzaehler. Wenn die Tagschwelle 200 mal hintereinander überschritten wurde (also der Tiny alle 1/8 sekunde 200 mal hintereinander 'hell' mißt, was dann so ca. 25 Sekunden sind ...) schaltet das Programm in den Tagmodus. Wer nun auf die Idee kommt den Tiny 30 Sekunden lang mit dem Flakscheinwerfer zu brutzeln hat halt selbst schuld, der muß sich dann nicht wundern daß der Tiny nicht mehr antwortet.
Also: Nur kurz Hell: Nacht, jemand leuchtet mit der Taschenlampe. Da reagiert also das Reaktivlicht. Lange hell: Tag, also in den Schlafmodus wechseln und alle paar Sekunden (genauer 8 Sekunden, länger kann der Tiny halt nicht schlafen) mal nachsehen ob's schon wieder dunkel ist.
 

conrad

Geocacher
Jetzt hast DU evtl. 2 Sachen durcheinander gewürfelt. Mein Problem mit dem nicht mehr antwortenden Reaktiven ist völlig losgelöst von der letzten Frage zu sehen. Ich plane einen Cache bei dem ich etwas aktiviere indem ein LDR angeleuchtet wird und das genau so lange wie dieser angeleuchtet wird......
Den nicht mehr antwortenden Blinker hab ich in die Bastelkiste geschmissen......
Gruß Conrad
 

ceddy

Geocacher
Ein herzliches Dankeschön an die Entwickler des Reaktiven Licht und den Verfasser des "Kochbuches".
Heute mit Erfolg das Reaktivlicht fertiggestellt und in PET Rohlinge eingebettet !

Nun muss ich nur noch die Zeit finden um den Nachtcache zu legen !

viele Grüße

Ceddy
 
Hallo miteinander,

nachdem das Reaktivlicht mit LDR und A/D-Wandler auf Anhieb recht gut funktionierte, sollte nun eine Variante mit Phototransistor her.

Also einfach Schaltung 6 aufgebaut und den LDR durch einen BPW40 ersetzt.

Aber nun war das Reaktivlicht absolut überempfindlich und ließ sich sogar schon bei Tag und diffusen Lichtänderungen auslösen.

Deshalb das Programm einmal komplett umgestrickt:

Code:
'============================================================
'
' ********************************************************
' ***                                                  ***
' *** Tiny-Reaktivlicht mit Photodiode und A/D-Wandler ***
' *** mit Watchdog-Energiesparmodus und Tagabschaltung ***
' ***                                                  ***
' *** erstellt von Ubique Terrarum                     ***
' *** 14.02.2008                                       ***
' ***                                                  ***
' ********************************************************
'
' µC: ATtiny13V
' +Ub: 3,6V
'
'============================================================
$regfile = "ATtiny13.DAT"
$crystal = 16000                                            'Frequenz des internen Oszillators
$hwstack = 6                                                'Hardwarestack herabsetzen damit genügend variablen zur verfügung stehen

Config Adc = Single , Prescaler = Auto
Config Portb = &B00001000                                   'Pinb.3 auf 'Ausgang', 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 = 50                                      'Schwellwert für Schlafmodus
Const Zwangsimpuls = 1                                      'LED-Impuls tagsüber alle X Schlafyklen (á ca. 8 Sekunden)

Dim A As Byte                                               'Variablen definieren
Dim Z As Byte                                               'Tagzähler
Dim Schlafzaehler As Byte
Dim H As Integer                                            'Helligkeitswert: 0 = Hell, 1023 = Dunkel
Dim Alt As Integer                                          'alter Helligkeitswert
Dim Merker As Integer                                       'Unterschied der Helligkeitswerte

Z = 200                                                     'Tagzähler auf Startwert setzen
Alt = 0                                                     'alten Helligkeitswert auf Startwert setzen

Do
 Reset Watchdog
 Powerdown                                                  'Prozessor bremsen da sonst Helligkeitsänderung nicht erkannt wird

 Start Adc                                                  'A/D-Wandler starten
 H = Getadc(2)                                              'Helligkeitswert einlesen
 Stop Adc                                                   'A/D-Wandler zum Stromsparen wieder stoppen

 Merker = H - Alt                                           'Unterschied zwischen letzter und aktueller Messung ermitteln
 Alt = H                                                    'letzten Helligkeitswert sichern

    If H >= Tagschwelle Then Z = Z + 1                      'prüfen ob Helligkeit über Tagschwelle liegt, dann Tagzähler erhöhen
    If H < Tagschwelle Then Z = Z - 1                       'prüfen ob Helligkeit unter Tagschwelle liegt, dann Tagzähler verringern

      If Z = 255 Then Z = 200                               'Int-Variable geht nur bis 255
      If Z = 0 Then Z = 199                                 'Int-Variable nicht negativ werden lassen


   If Z >= 200 Then Gosub Pause                             'wenn mehr als 200 Zyklen hell dann Schlafmodus

   If Z < 200 Then Gosub Auswerten                          'wenn weniger als 200 Zyklen hell dann Auswerten

Loop


Auswerten:
 If Merker > Schwelle Then Gosub Blinken                    'Bei großer Helligkeitsänderung Blinken
 Return



Blinken:                                                    '10mal blinken
 For A = 0 To 10
 Portb.3 = 1
 Reset Watchdog
 Powerdown
 Portb.3 = 0
 Reset Watchdog
 Powerdown
 Next A
 Z = 200                                                    'Tagzähler zurückstellen                                                    '
 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
  Portb.3 = 1
  Reset Watchdog
  Powerdown
  Portb.3 = 0
  Schlafzaehler = 0
 End If
Return

End

Zur Funktionskontrolle blinkt jetzt im Tagmodus etwa alle acht Sekunden einmal die LED (das kann man im Cacheeinsatz natürlich vergrößern oder ganz weglassen).
Ist das Reaktivlicht im Nachtmodus, also "scharf" erlischt das Blinken.
Nur im Nachtmodus ist eine Auslösung möglich.

Gruß, Thomas
 

stonewood

Geowizard
conrad schrieb:
Jetzt hast DU evtl. 2 Sachen durcheinander gewürfelt. Mein Problem mit dem nicht mehr antwortenden Reaktiven ist völlig losgelöst von der letzten Frage zu sehen. Ich plane einen Cache bei dem ich etwas aktiviere indem ein LDR angeleuchtet wird und das genau so lange wie dieser angeleuchtet wird......
Den nicht mehr antwortenden Blinker hab ich in die Bastelkiste geschmissen......
Aber das muß doch genau so zwischen 'Tag' und 'Nacht, mit der Taschenlampe angeleuchtet' unterscheiden? Was Du da willst ist nicht so viel anders als ein Reaktivlicht - Anleuchten, reagiert. Statt der Blinksequenz muß der Tiny dann natürlich testen wann's wieder dunkel wird, aber der erste Teil ist der gleiche.
 

upigors

Geowizard
Ubique Terrarum schrieb:
nachdem das Reaktivlicht mit LDR und A/D-Wandler auf Anhieb recht gut funktionierte, sollte nun eine Variante mit Phototransistor her.

Welchen Transistor hast Du genommen? Würde nun da es einige Proggis für die Transistorvariante gibt, diese auch mal bauen wollen.
Gruß Uwe
 
Nachtrag:

So, endlich finster draußen :p - eben mal 'ne Strommessung durchgeführt.

Im Nachtmodus nur sagenhafte 8µA - also noch sparsamer als die LDR-Variante. Und das bei 3,6V Versorgungsspannung!

Im Tagmodus bleibt es bei den 5µA - ohne das Kontrollblinken natürlich.

Da der ReaktivTiny schon um 18:00 Uhr zu Bett gehen wollte, hab ich die Tagschwelle mal auf den Wert 20 gesetzt. Mal schauen wann er jetzt müde wird :?
 

conrad

Geocacher
Windi schrieb:
Code:
'============================================================
'
' ********************************************************
' ***                                                  ***
' ***    Tiny-Reaktivlicht mit LDR und A/D-Wandler     ***
' *** mit Watchdog-Energiesparmodus und Tagabschaltung ***
' *** Ausgabe von Morsesignalen beim Anleuchten        ***
' ***                                                  ***
' ***      erstellt von Windi für www.geoclub.de       ***
' ***                   04.01.2008                     ***
' ***                                                  ***
' ********************************************************
'
' µC: ATtiny13V
' +Ub: 3,00 V
' I: 17 µA im Leerlauf (Nachtbetrieb)
' I: 5 µA bei Tagabschaltung
' Reichweite: 650 m mit Maglite 5D
'
'============================================================

$hwstack = 20                                               'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
$regfile = "ATtiny13.DAT"
$crystal = 128000                                           'Frequenz des internen Oszillators




Config Adc = Single , Prescaler = Auto
Config Portb = &B00001000                                   'Pinb.3 auf 'Ausgang', 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über alle X Schlafyklen (á 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
Dim Zeichen As String * 1

Do
Reset Watchdog
Powerdown                                                   'prozessor bremsen da sonst lichtänderung nicht erkannt wird
Start Adc                                                   'A/D-Wandler starten
Ldr = Getadc(2)                                             'Helligkeitswert einlesen
Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen
Merker = Ldr - Alt                                          'Unterschied zwischen letzter und aktueller Messung ermitteln
Alt = Ldr                                                   'letzten LDR-Wert sichern
If Merker > Schwelle Then Gosub Morsen                      'Bei großer Änderung Dunkel->Hell: Blinken
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ähler löschen
End If

If Tagzaehler > 200 Then Gosub Pause                        'wenn mehr als x zyklen hell dann schlafmodus

Loop


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
   Portb.3 = 1
   Reset Watchdog
   Powerdown
   Portb.3 = 0
   Schlafzaehler = 0
End If
Return

Morsen:
Restore Daten                                               'Am Beginn der Daten anfangen
Alt = 1023                                                  'Doppelauslösung verhindern
Do
 Read Zeichen
 Wdtcr = &B11010100                                         'Watchdog auf 250ms stellen
 If Zeichen = "*" Then Gosub Kurz
 If Zeichen = "-" Then Gosub Lang
 If Zeichen = " " Then Gosub Leer
 Wdtcr = &B11010011                                         'Watchdog wieder auf 125ms stellen
 If Zeichen = "X" Then Return
Loop

Kurz:
Portb.3 = 1
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Return

Lang:
Portb.3 = 1
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Return


Leer:
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Return

End

Daten:
Data "*" , "-" , " "                                        'A
Data "-" , "-" , "*" , "*" , "*" , " "                      '7
Data "-" , "*" , "*" , "*" , " "                            'B
Data "*" , "*" , "*" , "*" , "-" , " "                      '4
Data "X"

Danke Windi für das Proggi. Hab damit ein Reaktivlauflicht gebaut :shock: :D
Ich möchte den Kontrollblink weg haben, welche Zeilen müssen da weg? Ich hab die Frage hier schon mal gelesen, finde sie aber unter > 80 Seiten einfach nicht mehr raus.
Danke für Eure Hilfe.
 

conrad

Geocacher
schon gefunden....

Windi schrieb:
[Wenn Du auf die Funktionskontrolle verzichten willst musst Du folgende Zeile löschen:
Code:
Schlafzaehler = Schlafzaehler + 1                           'merken wie oft Schlafmodus durchlaufen wurde
If Schlafzaehler = Zwangsimpuls Then                        'als Funktionskontrolle tagsüber LED auslösen
   Portb.3 = 1
   Reset Watchdog
   Powerdown
   Portb.3 = 0
   Schlafzaehler = 0
End If
 

conrad

Geocacher
und jetzt gleich noch eine Frage wenn das ok ist ;-)
ich benötige nach anleuchten einen impuls bzw eine leuchtende LED von etwa 15 sekunden. läßt sich der Wert für lang irgendwie so verändern? oder muß da nen anderes Programm ran?
Danke im Vorraus an die Programmierer für nen Lösungsansatz
Conrad
 

Windi

Geoguru
conrad schrieb:
und jetzt gleich noch eine Frage wenn das ok ist ;-)
ich benötige nach anleuchten einen impuls bzw eine leuchtende LED von etwa 15 sekunden. läßt sich der Wert für lang irgendwie so verändern? oder muß da nen anderes Programm ran?
Danke im Vorraus an die Programmierer für nen Lösungsansatz
Conrad
Willst Du nach dem Anleuchten nur einen Dauerimpuls von 15 Sekunden.
Kein Geblinke oder sonstiges?
Dann sieht das "Blinken" bzw. "Morsen"-Unterprogramm so aus:
Ich hoffe 16 Sekunden sind auch o.k.

Code:
Blinken:                                                    'LED blinken lassen
Wdtcr = &B11110001                                          'Watchdog auf 8 Sekunden stellen
  Portb.3 = 1
  Reset Watchdog
  Powerdown
  Reset Watchdog
  Powerdown
  Portb.3 = 0
Wdtcr = &B11010011                                          'Watchdog wieder auf 0,125 Sekunden zurückstellen
Alt = 1023                                                  'Doppelauslösung verhindern
Return
 

conrad

Geocacher
Danke Windi für die schnelle Antwort ;-)
Kannst du mir sagen wie sich hier die 15 Sekunden zusammensetzen? Dann muß ich nicht wieder fragen wenn ich doch 20 brauch ;-)
Danke vielmals
 

Windi

Geoguru
conrad schrieb:
Kannst du mir sagen wie sich hier die 15 Sekunden zusammensetzen? Dann muß ich nicht wieder fragen wenn ich doch 20 brauch ;-)
Steht eigentlich in der Bemrkung des Quelltextes dabei.
Mit "Wdtcr = &B11110001" wird der Watchdog-Timer auf 8 Sekunden eingestellt.
Mit den Befehlen "Reset Watchdog" und "Powerdown" wird der Watchdog-Timer aktiviert, d.h. das Programm fällt für diese Zeit in einen "Schlafmodus". Da Du 15 Sekunden brauchst aktiviere ich den Watchdog-Timer 2 mal hintereinander und komme damit auf ca. 16 Sekunden.
8 Sekunden sind das längste was man einstellen kann. Kürzere Intervalle gehen aber auch.
 

Chris601

Geomaster
Nachdem ich jetzt den kompletten Beitrag gelesen habe und meine ersten 2 Schaltungen erfolgreich im Wald deponiert habe, wollte ich an die Initiatoren dieses Beitrages und allen Usern, die Ideen und Verbesserungen eingebracht haben, ein ganz großes
DANKE
sagen!

Das Kochbuch ist prima und der Aufbau und die Programmierung damit haben auf Anhieb funktioniert!

Ich habe mich bewusst für die LED-only-Version entschieden.

Als Spannungsquelle habe ich R20-Batterien verwendet.

Jetzt bin ich gespannt, was die Zeit bringt..
 

conrad

Geocacher
Windi schrieb:
Steht eigentlich in der Bemrkung des Quelltextes dabei.
Mit "Wdtcr = &B11110001" wird der Watchdog-Timer auf 8 Sekunden eingestellt.
Mit den Befehlen "Reset Watchdog" und "Powerdown" wird der Watchdog-Timer aktiviert, d.h. das Programm fällt für diese Zeit in einen "Schlafmodus". Da Du 15 Sekunden brauchst aktiviere ich den Watchdog-Timer 2 mal hintereinander und komme damit auf ca. 16 Sekunden.
8 Sekunden sind das längste was man einstellen kann. Kürzere Intervalle gehen aber auch.

DANKE WINDI....
 

dr.gonzo

Geonewbie
Hallo und guten Tag,

Ich habe diesen Artikel jetzt schon oft durchsucht und muss erstmal an Lob an die vielen klugen Köpfe hier richten!!!

Jetzt mein Problem:

Ich versuche gerade ein reaktive Licht wie "4.10 Morsecodeausgabe- und Abfrage" aus dem Kochbuch in Betrieb zu nehmen. Mein Problem liegt beim beschreiben des eeproms, denn es werden nicht alle Zeichen ins eeprom geschrieben, denke ich. Ich verwende genau den vorgegeben Quelltext (per Copy and Paste), tausche nur ein paar Buchstaben, aber ab dem 25 Buchstaben wir für jedes Zeichen nur einmal lang gesendet. Also nochmal klartext: "Alles funktioniert bis zum 25 Buchstaben, ab da immer nur einmal lang". Wenn ich das original Programm verwende funktioniert es meistens, auch nicht immer. Ich habe die Länge meines zu morsenden Codes im Programm an sich angeglichen.


Hat schonmal jemand das gleiche Problem gehabt?

'============================================================
'
' ***********************************************************
' *** ***
' *** Reaktiv-Tiny EEPROM schreiben 2006-02-25 (AP) ***
' *** ***
' *** ***
' *** Beachtet das Fusebit G. Es muss auf 0 stehen! ***
' *** ***
' *** Fusebit H: 0 ***
' *** Fusebit G: 0 ***
' *** Fusebit F: 1 ***
' *** Fusebit E: 1 ***
' *** Fusebit DCBA: 1011 ***
' *** ***
' *** ***
' ***********************************************************
'
' ATtiny13V
'
'============================================================
'
$regfile = "ATtiny13.DAT"
$crystal = 113000 'Reale Frequenz des internen 128kHz-Oszillators
$hwstack = 6
'
Config Portb = &B00011000 'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111 'Pullups zuschalten, auser fur Pinb.3 und .4
'
'Stop Adc 'A/D-Wandler abschalten, um Strom zu sparen
'Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen
'
'
Dim A As Byte
'
'
'--------------------------------------------------------------
' Bitwert 0=dit, 1=dah
' das Byte von rechts lesen, da Schleife von 0 bis z lauft
' z ist die Zeichenlange minus eins, die in den oberen 3 Bit festegelgt wird
'
' Morse Bit v.r. Hex Dec
'1 = .---- = 100|11110 1 9E 158
'2 = ..--- = 100|11100 2 9C 156
'3 = ...-- = 100|11000 3 98 152
'4 = ....- = 100|10000 4 90 144
'5 = ..... = 100|00000 5 80 128
'6 = -.... = 100|00001 6 81 129
'7 = --... = 100|00011 7 83 131
'8 = ---.. = 100|00111 8 87 135
'9 = ----. = 100|01111 9 8F 143
'0 = ----- = 100|11111 0 9F 159
'
'N = -. = 001|00001 N 21 33
'E = . = 000|00000 E 00 0
'
' Pause = 111|11111 0 FF 255
'
' KA (Spruch Anfang) = -.-.- = 100|10101 95 149
' AR (Spruch Ende) = .-.-. = 100|01010 8A 138
'''
'Wortabstand == FF
'H = .... = 011|00000 H 60 96
'A = .- = 001|00010 A 22 34
'P = .--. = 011|00110 P 66 102
'P .--. = 011|00110 P 66 102
'Y = -.-- = 011|01101 Y 6D 109
'Wortabstand == FF
'H = .... = 011|00000 H 60 96
'U = ..- = 010|00100 U 44 68
'N = -. = 001|00001 N 21 33
'T = - = 000|00001 T 01 1
'I = .. = 001|00000 I 20 32
'N = -. = 001|00001 N 21 33
'G = --. = 010|00011 G 43 67
'Wortabstand == FF
'Ende 8A
'''
'=============================================
' Beispiel Cache: N49.12.345 E008.56.789
'=============================================
'
'
A = &B01100001 ' B = -...
Writeeeprom A , 1
A = &B01000100 ' U = ..-
Writeeeprom A , 2
A = &B00100001 ' N = -.
Writeeeprom A , 3
A = &B01000101 ' K = -.-
Writeeeprom A , 4
A = &B00000000 ' E = .
Writeeeprom A , 5
A = &B01000010 ' R = .-.
Writeeeprom A , 6
A = &B00000001 ' T = -
Writeeeprom A , 22
A = &B00100000 ' I = ..
Writeeeprom A , 23
A = &B00000000 ' E = .
Writeeeprom A , 24
A = &B01100100 ' F = ..-.
Writeeeprom A , 25
A = &B00000000 ' E = .
Writeeeprom A , 26
A = &B10011000 ' 3 = ...--
Writeeeprom A , 27
A = &B00100011 ' M = --
Writeeeprom A , 28
 
Oben