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.

Share on FacebookShare on Google+Tweet about this on TwitterPin on PinterestShare on LinkedInShare on RedditEmail this to someoneShare on StumbleUpon

11 Comments

  1. Als Hinweis für größere Projekte – bei denen dann C verwendet wird – sei erwähnt, dass es für die AVRs spezielle C-Librarys gibt, die den Umgang mit den Ports und vielen anderen alltäglichen Problemen erheblich vereinfachen. Solltest du dir vlt. mal anschauen, denn ich denke, dass C beim µC nahezu unumgänglich ist.

  2. Ich danke dir für den Tipp. Größere Projekte könnte ich mir mit Bascom eh nicht vorstellen 😉

  3. Hallo Daniel,

    ich habe zwar etwas Erfahrung mit Basteleien, aber wenig mit der hardwarenahen programmierung. Kann ich das „Kochbuch“ von Reaktivlicht.de benutzen um eine Verbindung zum PC herzustellen und deinen Code so auf den µC übertragen? Kleine Anpassungen bekomme ich glaube ich hin, aber die Übertragung des Codes auf den Controller gibt mir zu denken.
    Danke vorab für eine Antwort und Lob an den super Artikel.
    LG,
    Florian

  4. Hallo Florian,

    das sollte mit dem Kochbuch funktionieren. Als Programmieradapter habe ich jedoch keinen, von den dort vorgestellten (seriell, parallel) verwendet, sondern auf einen Adapter mit USB-Schnittstelle zurückgegriffen. Das funktionierte prima mit Bascom und man muss auch nicht erst den Adapter bauen.
    Hier ein Link zu einem ähnlichen ebay-Angebot: [url]http://da-fi.de/s/avr[/url]

    viele Grüße

  5. Hallo Daniel,

    ich bin gerade dabei die Teileliste zusammen zu stellen und bin dabei über „K2X03“ gestolpert. Kannst du mir sagen was das noch ist? Sind das nur die Anschluss klemmen? Pin2 = Masse, Pin4 = + und der geht auch noch mal an Pin9 des IC? Oder ist + an P3 und 4 der Klemme? Und was ist mit K1, K3, K5 und K6?
    Sorry für die vielen Fragen, aber ich will nichts falsch machen später. Evtl. kannst du ja noch mal ein Foto der Unterseite der Schaltung rein stellen.
    Vielen Dank und viele Grüße,
    Florian

  6. Hallo Florian,
    „K2X03“ ist die Verbindungsbuchse zum Programmieradapter. Das wird nur benötigt, wenn du den µC direkt in der Schaltung programmieren willst. Bei mir ist der µC nicht auf der Plantine verlötet, sondern steckt in einem Sockel, damit man ihn zum Programmieren herausnehmen kann. Das finde ich sinnvoller, als auf der kleinen Platine des Reaktivlichts auch noch den Connector mit unter zu bringen.
    „K2X03“ und alle Verbindungen die davon Abgehen, können also wegfallen, wenn du den µC nicht direkt im Reaktivlicht programmierst. GND und VCC enden dann also nicht am Connector (Pins 2, 3) sondern werden direkt an die Stromversorgung geführt.

  7. Super!
    Vielen Dank für die schnelle Antwort! Wenn mit der Software dann alles klappt, dann bekomme ich das hin.
    Viele Grüße,
    Florian

  8. Eine kurze Frage hab ich noch:
    Als Spannungsquelle habe ich bei Reichelt diesen Akku hier gefunden:
    http://www.reichelt.de/Industriezellen/LIMG-GDIHR18650Z/index.html?;ACTION=3;LA=444;GROUP=P5A;GROUPID=4084;ARTICLE=86881;START=0;SORT=artnr;OFFSET=100;SID=10Typjen8AAAIAACgMnlUd5a208ac7b72eb96c1b7c239b5a0e280
    Allerdings kostet der 10€. Könnte ich nicht auch 2-3 Batterien in Reihe in so ein Batteriefach bauen und es damit betreiben? Dann passt es nicht mehr in einen PETling aber ok. Welche Versorgungsspannung brauche ich mindestens / höchstens?
    Danke 🙂

  9. Hallo Daniel würde mir gerne auch so einen Petling bauen.
    Allerdings würde mich auch mal die Rückseite der Platine intressieren. Damit ich auch vergleichen kann mit Schaltplänen lesen hab ich es nicht gerade so. Zu dem würde ich gerne einen Reed Schalter einbauen. Könne ich den dann auch anstatt des Fotowiderstand einbauen ?

  10. Hallo,
    natürlich ist es möglich da einen Reed-Kontakt zu verbauen. Das ist dann aber etwas anderes, als die eigentliche Idee eines Reaktivlichts. Der Quellcode für den µC von oben würde dir dann nicht wirklich helfen, da der komplette Teil der Helligkeitsmessung wegfallen würde. Auch die ganze Schaltung kann/muss dann anders realisiert werden.
    Das wäre einfach ein anderes Projekt 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.