Reaktivlicht mit 7-Segmentanzeige im Selbstbau

Das Erste, was mir nach der Anmeldung im Geoclub-Forum ins Auge stach (und nein, es hat nicht weh getan ūüėČ war der „Elektronik-Bereich“. Da noch nicht alle Kenntnisse aus den 4 Semestern Elektrotechnik und dem Versuchspraktikum verloren sind und mein letztes Projekt (der Beitrag folgt noch) schon etwas zur√ľck liegt, musste ein neues Vorhaben geplant werden ūüôā Die Spielerei mit Microcontrollern wollte ich schon lange ausprobieren, da sich an dieser Stelle Informatik und E-Technik wunderbar vereinen lassen. Und nicht zu vergessen, nat√ľrlich das Geocaching. Nach einiger Lekt√ľre im Forum, wusste ich, was es werden sollte:

ein Reaktivlicht mit Siebensegmentanzeige.

F√ľr den Bauplan und den Code des ¬ĶC orientierte ich mich an der Variante von

Als ¬ĶController wurde der ATtiny24 gew√§hlt. Nachdem ich das zugeh√∂rige Datenblatt gelesen habe, war ich von den M√∂glichkeiten, die das kleine Teil f√ľr unter 2‚ā¨ bietet, so begeistert, dass ich dar√ľber auch noch nen ganzen Artikel schreiben k√∂nnte ūüôā F√ľr die Messung des Umgebungslichtskommt ein Fotowiderstand (LDR) zum Einsatz und keine LED, wie bei einigen Reaktivlichtern ohne Siebensegmentanzeige. Beim Anschluss der Anzeige an den ¬ĶC musste ich das Datenblatt bem√ľhen, da die Pins von Modell zu Modell unterschiedlich sind. Die Stiftleiste zum Anschluss der Spannungsquelle und des Programmieradapters habe ich weggelassen, da ich den ¬ĶC auf einem IC-Sockel verbaut Eryaman habe und ihn dadurch nicht in der Schaltung programmieren muss. Diese Realisierung finde ich vorteilhaft, da man den ¬ĶC nun austauschen kann und eine Erweiterung der Funktionen Arrontes einfacher ist. Der Aufbau erfolgte auf einer Lochrasterplatine, da ich mich mit dem √Ątzen von Platinen nicht besch√§ftigen wollte. Nun zur Software:

II. Das Programm

F√ľr die Programmierung des ¬ĶC w√§hlte ich Bascom-AVR, da man dort spezielle Befehle und Register der Atmel-¬ĶC einfacher ansprechen kann, als unter C oder Assembler. Die Sprache Website in Bascom ist ein Mix aus Basic und Assemblerbefehlen. Beim Programm selbst, habe ich auch gro√üe Teile der Version von

Der Code:


$hwstack = 20¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† 'hardwarestack herabsetzen damit gen√ľgend variablen zur verf√ľgung stehen
$regfile = "ATtiny24.DAT"
$crystal = 128000                                           'Frequenz des internen OszillatorsConfig Adc = Single , Prescaler = Auto
Config Portb = &B00000111                                   'Pinb.0-2 auf 'Ausgang', Rest auf 'Eingang' schalten
Config Porta = &B10001011                                   'Pinq.0+1+3+7 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 = 60                                         'je größer der Schwellwert, desto unempfindlicher
Const Tagschwelle = 800¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† 'Schwellwert f√ľr Schlafmodus
Const Zwangsimpuls = 15¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† '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 Zaehler 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                                                     wholesale NBA jerseys  '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 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  cheap NBA jerseys  Schlafmodus durchlaufen wurde
If Schlafzaehler = Zwangsimpuls Then¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† 'als Funktionskontrolle tags√ľber LED ausl√∂sen
Porta.1 = 1
Reset Watchdog
Powerdown
Porta.1 = 0
Schlafzaehler = 0
End If
Return

Morsen:
Restore Daten                                               'Am Beginn der Daten anfangen
Alt = 1023                                                  'Doppelauslösung verhindern
Do
Read Zeichen
Wdtcr = &B11110000                                          'Watchdog auf 4s stellen
If Zeichen = "0" Then Gosub K0
If Zeichen = "1" Then Gosub K1
If Zeichen = "2" Then Gosub K2
If Zeichen = "3" Then Gosub K3
If Zeichen = "4" Then Gosub K4
If Zeichen = "5" Then Gosub K5
If Zeichen = "6" Then Gosub K6
If Zeichen = "7" Then Gosub K7
If Zeichen = "8" Then Gosub K8
If Zeichen = "9" Then Gosub K9
If Zeichen = "n" Then Gosub Pn
If Zeichen = "e" Then Gosub Pe
Wdtcr = &B11010110                                          'Watchdog auf 1s stellen
If Zeichen = "B" Then Gosub Pb
Wdtcr = &B11010010                                          'Watchdog auf 0,064s stellen
If Zeichen = "Z" Then Gosub Pz
Wdtcr = &B11010011                                          'Watchdog wieder auf 125ms stellen
If Zeichen = "X" Then Return
Loop

Pb:
Reset Watchdog                                              'loescht Anzeige fuer Watchdogperiode
Powerdown
Portb = 0
Porta = 0
Return

P0:
Portb = &B00000111
Porta = &B10000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P1:
Portb = &B00000110
Reset Watchdog
Powerdown
Portb = 0
Return

P2:
Portb = &B00000011
Porta = &B10001010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P3:
Portb = &B00000111
Porta = &B00001010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P4:
Portb = &B00000110
Porta = &B00001001
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P5:
Portb =  2013.  &B00000101
Porta = &B00001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P6:
Portb = &B00000100
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P7:
Portb = &B00000111
Reset Watchdog
Powerdown
Portb = 0
Return

P8:
Portb = &B00000111
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P9:
Portb = &B00000111
Porta = &B00001001
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Pn:
Portb = &B00000100
Porta = &B10001000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Pe:
Portb = &B00000001
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Pz:
Zaehler = 0
Do
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0

Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0

Porta = &B00001000
Reset Watchdog
Powerdown
Porta = 0

Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0

Porta = &B00000010
Reset Watchdog
Powerdown
Porta = 0

Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0

Porta = &B00001000
Reset Watchdog
Powerdown
Porta = 0

Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0

Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0

Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0

Porta = &B00001000
Reset Watchdog
Powerdown
Porta = 0

Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0

Porta = &B00000010
Reset Watchdog
Powerdown
Porta = 0

Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0

Porta = &B00001000
Reset Watchdog
Powerdown
Porta = 0

Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0

Zaehler = Zaehler + 1
If Zaehler = 2 Then Return
Loop
Return

Leer:
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Return

'b immer aus
'f immer an

K0:
Portb = &B00000101
Porta = &B10000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

K1:
Portb = &B00000100
Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0
Portb = 0
Return

K2:
Portb = &B00000001
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

K3:
Portb = &B00000101
Porta = &B00001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

K4:
Portb = &B00000100
Porta = &B00001001
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

K5:
Portb = &B00000101
Porta = &B00001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

K6:
Portb = &B00000100
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

K7:
Portb = &B00000101
Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0
Portb = 0
Return

K8:
Portb  Renewal  = &B00000101
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

K9:
Portb = &B00000101
Porta = &B00001001
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

End

Daten:
Data "Z" , "B"
Data "n" , "1" , "2" , "3" , "4" , "5"
Data "e" , "6" , "7" , "8" , "9" , "0"
Data "B" , "Z"
Data "X"

Wer den Code so auf den ¬ĶC √ľbertr√§gt, wird entweder denken, dass seine 7-Segmentanzeige kaputt ist oder das die Verdrahtung nicht stimmt ūüôā Aber seid beruhigt, es ist bestimmt alles in Ordnung.

Da mir die „normale“ Anzeige der Koordinaten zu einfach erschien, wholesale NBA jerseys √ľberlegte ich, wie man da ein kleines R√§tsel einbauen konnte. Da kam mir die Idee, dass ja einzelne Segmente „kaputt gegangen“ sein k√∂nnten und so erweiterte ich den Code um die Bereiche K0 – K9, die nicht die normalen Zahlen anzeigen, sonder eine kaputte 7-Segmentanzeige simulieren, bei der das Segment f dauerhaft leuchtet und das Segment b immer aus ist.

Den Schwierigkeitsgrad k√∂nnte man nat√ľrlich noch erh√∂hen, indem man z.B. noch mehr Segmente „ausfallen“ l√§sst. Wer die normalen Zahlen m√∂chte, muss in der Sub „Morsen“ die gosub-Befehle auf die Label P0 – P9 verweisen. Das Label „Z“ zeigt ein selbstgebasteltes Lauflicht, das man beispielsweise zur Signalisierung der Ausl√∂sung verwenden kann.

Die ganze Bastelei wurde so konzipiert, dass sie in einen PETling passt und somit dann wasserdicht platziert werden kann. Oh, fast h√§tte ich ja die Spannungsversorgung vergessen ūüôā Die l√§uft bei mir √ľber eine 3,6V Lithium-Zelle, auch bekannt als die „10-jahres Batterie f√ľr niedrige Str√∂me“ ūüėČ

Sollte ich nochmal Zeit finden, ein Video davon zu erstellen, wird es nat√ľrlich hier ver√∂ffentlicht.