Zur Druckansicht wechseln Visit the English version of this page

www.jb-electronics.de » Elektronik » Digitaltechnik » LED-Wecker

LED-Wecker

Einleitung

Auch dieses kleine Projekt war gar nicht für mich gedacht, sondern für meinen Vater, dem es von Zeit zu Zeit nachweislich schwer fällt, seinem Wecker in den frühen Morgenstunden die gebührende Aufmerksamkeit zu schenken.

Da dachte ich mir, dass ein selbstgebauter Wecker mit genügend Durchschlagskraft bestimmt Abhilfe schaffen würde. Aber was sollte er denn können, der Wecker?

Den kompletten Schaltplan des Weckers finden Sie weiter unten, im Folgenden werden die einzelnen Komponenten etwas näher beleuchtet.

Das Display

Ich entschied mich für blaue Siebensegment-Anzeigen mit einer Ziffernhöhe von 38.1mm (1.5"). Für den Doppelpunkt zwischen den Stunden und Minuten verwendete ich zwei blaue Wald-und-Wiesen-LEDs. Die Vorwiderstände sind so bemessen, dass durch die Siebensegment-Anzeigen nicht mehr als 25mA pro Segment fließt, und durch die Doppelpunkt-LEDs maximal 20mA.

Angesteuert werden die Siebensegment-Anzeigen mit ULN2803A-Darlington-Arrays, die jeweils acht Kanäle besitzen. Wichtig ist, dass der ULN2803A verwendet wird, dessen Eingänge sind für 5V TTL-Pegel konzipiert. Das anzuzeigende Bitmuster erhalten die vier ULN2803A jeweils von einem altbewährten CD4094-Schieberegister. Die Doppelpunkt-LEDs werden von einem BC547 npn-Transistor angesteuert.

Geschaltet werden die Siebensegment-LEDs (mit gemeinsamer Anode) gegen +12V. Alles in allem bei der Ansteuerung also nichts Besonderes.

Der Mikrocontroller

Nein, dieses Mal verwendete ich keinen PIC16F627A, sondern den PIC16F716. Warum? Nun ja, der Mensch sollte sich ja ab und an mal an etwas Neues gewöhnen, daher schadet es sicherlich nicht, einmal einen etwas anderen PIC zu verwenden, zudem bot es sich hier wirklich an.

Denn obwohl PIC16F627A viele nützliche Funktionen bietet, hat er den Nachteil, keinen eingebauten ADC zu haben. Da die Helligkeit der LEDs aber über einen Drehpoti dimmbar sein sollte, lag es nahe, endlich mal auf einen PIC mit eingebautem ADC umzusteigen.

Und genau das liefert der PIC16F716 (genau genommen hat er sogar vier ADC-Eingänge, Auflösung 8 Bit), der sogar preisgünstiger ist als der PIC16F627A. Ebenfalls hat er eine 10Bit-Hardware-PWM-Stufe eingebaut (wie auch der PIC16F627A).

Für das Programmieren und Kompilieren musste ich mir die neueste Version des PICC-Lite-Compilers herunterladen, da meine alte Version den PIC16F716 nicht unterstützte, aber danach funktionierte alles einwandfrei.

Die Rundumleuchte

Der Wecker sollte ja optisch etwas hermachen, daher entschloss ich mich, eine batteriebetriebene Rundumleuchte dafür zweckzuentfremden:

Die Rundumleuchte

Nach Entfernen des Gehäuses sieht sie nun so aus:

Die Rundumleuchte

Und ohne das 4.5V-Batteriefach haben wir endlich, was wir wollen:

Die Rundumleuchte

Die Rundumleuchte wird im Folgenden mit 5V statt 4.5V betrieben, aber das macht keinen großen Unterschied.

Der MP3-Player

Es gibt Mikrocontroller, mit denen MP3-Dateien abgespielt werden können. Unserer hier kann das nicht so ohne Weiteres, und das war auch gar nicht mein Ziel. Denn es sollte ja nur eine einzelne MP3-Datei als Weckton abgespielt werden.

Meine Lösung: Einfach einen preiswerten MP3-Player (ca. 8 €) kaufen, und dann schauen, wie er so tickt:

Der MP3-Player

Der MP3-Player

Wir sehen, er arbeitet mit 1.5V, aber so kritisch ist das nicht, da SD-Karten mit 3.3V arbeiten, und somit auf der Platine die 1.5V Eingangsspannung auf 3.3V heraufgewandelt werden müssen. Eine Ansteuerung mit 2.5V ist also unproblematisch, da Step-Up-Wandler meistens auch mit ein bisschen mehr Eingangsspannung zurechtkommen.

Hier sieht man die ganze Hardware, die wir dank MP3-Player nicht selber aufbauen müssen:

Der MP3-Player

Dieser MP3-Player wird durch einen Multifunktionsknopf gesteuert, der nach rechts und links bewegt werden kann (TItel vor / zurück) oder als Taster gedrückt werden kann (Titel spielen, pausieren, ein- oder ausschalten).

Der MP3-Player

Da wir nur einen Titel abspielen wollen, ist der Drucktaster im Multifunktionsknopf entscheidend. Durch vorsichtiges Spannungsmessen fand ich heraus, dass einer der Pins beim Drücken des Multifunktionsknopfs von +3.3V auf GND gezogen wird. Zudem griff ich noch den Eingangspin für unsere 2.5V Versorgungsspannung sowie GND ab:

Der MP3-Player

Aber wie steuern wir das nun elektronisch an? Das ist sehr einfach: Wir benötigen nur einen npn-Transistor, der uns das Steuerungskabel auf GND zieht. Selbst auf einen Pullup können wir verzichten, da dieser auf der MP3-Platine oder direkt im MP3-Controller zugeschaltet sein muss.

Das heißt: mit einem Signal können wir nun eine MP3-Datei abspielen. Das finde ich eine erstaunliche Vereinfachung; hier lässt sich der aktuellen Wegwerfelektronik-Philosophie wirklich einmal etwas abgewinnen.

Da der Kopfhörer-Ausgang des MP3-Players klarerweise nicht viel Leistung liefert, wurde noch ein fertiges Verstärkermodul nachgeschaltet. Ich hatte noch ein 3.5W-Verstärkermodul von KEMO herumliegen, daher fiel die Wahl auf dieses. Mittels eines Potis, das als Spannungsteiler fungiert, kann die Eingangsspannung des Verstärkers und somit die effektive Lautstärke des Wecktons eingestellt werden.

Dazu wird die folgende Schaltung einfach vor den Verstärkereingang geschaltet:

Die Lautstaerkeeinstellung mittels Poti

Das Gehäuse

Als Gehäuse wählte ich ein schrecklich orangefarbenes Tischgehäuse von Conrad, das genau die richtigen Maße hatte. Es wurde natürlich umgehend silbern angesprüht. Als Frontplatte wählte ich klarblaues Acrylglas, das optisch sehr schön zu der blauen Rumdumleuchte passt.

Software

Der Programmcode sollte eigentlich ausreichend kommentiert sein; hier trotzdem noch einige Erläuterungen, da es sich schon um ein recht umfangreiches Programm handelt:

Die Pins RA0:3 sind alle als ADC-Eingänge definiert, obwohl nur der Pin RA0 als ADC ausgewertet wird. Bei den anderen Pins wird einfach abgefragt, ob der ADC-Wert größer als 127 ist (die Hälfte von 255), und dann wird der Pin als HIGH behandelt, sonst als LOW. Dieser Wert von 127 ist eigentlich willkürlich. Warum das ganze? Weil es nicht möglich ist, nur Pin RA0 als rein analogen Eingang zu verwenden, und Pins RA1:3 als rein digitale. Daher diese Aushilfsmaßnahme.

Die Helligkeit der LEDs kann in 16 Stufen eingestellt werden; dazu wird der 8-Bit Eingangswert des ADC vierfach gesampled und dann durch 16 geteilt, wodurch er fast nicht mehr rauscht (was klar ist, er hat ja nun auch eine viel schlechtere Auflösung). Die Position des Drehknopfs des Potis wird also auf eine Zahl zwischen 0..15 abgebildet. Der PIC16F716 besitzt ja eine 10-Bit-PWM, der Duty-Cycle-Wert kann also von 0 (ganz aus) bis 1023 (ganz an) gewählt werden. Da die menschliche Helligkeitswahrnehmung aber nicht linear ist, und in den oberen Bereichen der Duty-Cycle (also von ca. 800 aufwärts, das sind ca. 80% Tastverhältnis) kaum noch Unterschiede wahrgenommen werden, bietet sich ein Array der Länge 16 an, in dem dann die entsprechenden Duty-Cycle-Werte eingespeichert werden. Sie können so in der Software frei gewählt werden und müssen nicht kompliziert errechnet werden. Ich entschied mich für diese Wertefolge:

static int pwm_table[16]= {0, 1, 3, 5, 10, 20, 50, 80, 100, 150, 200, 300, 400, 600, 800, 1023};

Wenn die Helligkeit einen gewissen Grenzwert überschreitet, wird ein Lüfter eingeschaltet, der am Kühlkörper des 7805-Spannungsreglers sitzt. Streng genommen ist der Lüfter hier fehl am Platze, da die LEDs ja direkt von den 12V versorgt werden, aber dennoch ist ein bisschen zirkulierende Luft im Gehäuse eine sehr gute Sache. Den Hauptzweck erfüllt der Lüfter jedoch beim Wecken: Die Rundumleuchte zieht satte 450mA, da fallen also ca 3W Verlustleistung am 7805 ab, der daher unbedingt gekühlt werden und mit einem Kühlkörper versehen werden muss.

Das Siebensegment-Bitmuster für die LEDs wird ebenfalls in einem Array gespeichert; da ich die Anzeigeplatine (wie auch eigentlich alles Andere) von Hand verdrahte, achtete ich darauf, die Leitungen vom Schieberegister zu den ULN2803A und von dort aus zu den Siebensegment-Anzeigen möglichst kurz werden zu lassen. Daher sind die Verbindungen nicht so wie im Schaltplan weiter unten ersichtlich, wo ich sie aus Übersichtlichkeitsgründen geradlinig eingezeichnet habe. Aber das ist auch egal; das Array namens get7 kann einfach abgeändert werden, bei mir sieht es so aus:

static unsigned char get7[10] = {0b01110111, 0b00010001, 0b10110110, 0b10110011, 0b11010001, 0b11100011, 0b11100111, 0b00110001, 0b11110111, 0b11110011};

Durch Herumprobieren (genau so habe ich es auch gemacht!) findet mensch schnell die entsprechenden Muster heraus. Nur sollte beim Nachbau darauf geachtet werden, die Verdrahtung bei allen Registern gleich durchzuführen.

Ansonsten sei noch gesagt, dass die Variable Modus festlegt, in welchem Zustand der Wecker sich befindet; 0 bedeutet den normale Uhrenmodus (mit aktiviertem oder deaktiviertem Alarm, das speichert das Bit namens ARMED), 1 bedeutet, der Alarm ist im Gange, und 2 bedeutet Schlummermodus. Denn nach dem Ertönen des Weckers kann der Benutzer auf irgendeine Taste seiner Wahl drücken, und die nächste Weckung erfolgt dann in weiteren fünf Minuten. Die Schlummerzeit lässt sich in der Software mittels der Variablen SleepMinutes einstellen, der fest einprogrammierte Standardwert ist - wie gesagt - 5.

Wenn der Weckmodus (also Modus == 1) mehr als vier Minuten aktiv ist, schaltet der Wecker automatisch in den Sleep-Modus. Diese Sicherheitsabschaltung gewährleistet, dass der Wecker nicht unnütz Energie verschwendet, wenn zum Beispiel vergessen wird, die Weckfunktion vor dem Verlassen des Hauses oder vor dem Duschen auszuschalten. Dieses Zeitintervall kann in der Software über die Variable ALARM_ON_TIME_MAX in Sekunden eingestellt werden, der hier fest einprogrammierte Wert ist 240.

Auch das ist nochmals abgesichert: die vollkommene Sicherheitsabschaltung, also das Zurücksetzen in Modus 0 und Deaktivieren der Weckfunktion, tritt auf, wenn die automatische Sicherheitsabschaltung, wie sie im obigen Absatz beschrieben wurde, drei mal unmittelbar hintereinander ausgelöst wurde. Dieser Wert ist in der Variablen AUTOMATIC_SLEEP_COUNT_MAX gespeichert und standardmäßig auf 3 gesetzt.

Für alle Interessierten gibt es hier den C-Quellcode und das fertig kompilierte HEX-File: Wecker.zip (8 KB)

Bedienung

Die Bedienung sollte recht einfach gehalten werden und orientierte sich an einem bereits vorhandenen Wecker. Dieser Wecker besitzt drei Taster namens STD, MIN und SLP.

  1. Uhrzeit einstellen (nur im Modus 0 möglich): Die Uhrzeit wird durch einfaches Drücken der Taster STD und MIN eingestellt. Gedrückthalten der Taster ist ebenfalls möglich.
  2. Weckzeit einstellen (nur im Modus 0 möglich): Drücken Sie SLP, dann sehen Sie die aktuell eingestellte Weckzeit. Stellen Sie nun wie unter 1. beschrieben die Weckzeit ein, am Ende einfach SLP loslassen. Drücken Sie SLP nicht allzu lange ohne Betätigung der Tasten SLP oder MIN, dann landen Sie bei Schritt Nr. 3.
  3. Weckmodus aktivieren: Drücken Sie hierzu SLP und halten Sie die Taste etwa drei Sekunden gedrückt. Den aktiven Wecker erkennen Sie daran, dass in der Anzeige der Minuten-Einer (also in der Anzeige ganz rechts) der Dezimalpunkt aufleuchtet.
  4. Weckmodus deaktivieren: Halten Sie erneut SLP für etwa drei Sekunden gedrückt, bis der Dezimalpunkt in der rechten Anzeige erlischt.
  5. Der Alarm klingelt, was nun? Drücken Sie einfach irgendeine Taste. Ja, irgendeine, sie können nichts verstellen. Danach landen Sie im Modus 2, das ist der Sleep-Modus. Innerhalb des Sleep-Modus können Sie die Uhr- und Weckzeit ja nicht verstellen, das geht nur im Modus 0.
  6. Wann ist die nächste Sleep-Weckzeit? Wenn Sie im Modus 2 sind, können Sie die Taste SLP drücken, um sich nicht wie in Modus 0 die Weckzeit sondern die aktuelle Schlummer-Weckzeit anzeigen zu lassen. Diese lässt sich verständlicherweise nicht ändern. Wenn sie SLP allerdings zu lange gedrückt halten (etwa drei Sekunden, siehe oben), schalten Sie den Sleep-Modus aus und landen wieder im Modus 0.

Der Schaltplan

Nachdem dies gesagt wurde, hier nun der Schaltplan des Weckers:

Der Schaltplan des Weckers

Hier ist der Schaltplan in höherer Auflösung zu finden.

Dieser Schaltplan ist der zweite Anlauf des Projektes; die Rundumleuchte hat starke Probleme verursacht, da deren Motor die Schaltung erheblich störte. Wichtig beim Nachbau ist, dass die Zuleitung zur Rundumleuchte weit weg vom Controller angebracht wird. Zudem sollten ebenso die Pufferkondensatoren nicht weggelassen werden. Die Freilaufdioden bei induktiven Lasten wie dem Lüfter und der Rundumleuchte sind ebenfalls Pflicht. Mensch hätte noch dem Motor einen eigenen 7805-Regler verpassen können, um die Controller-Versorgungsspannung von der des Motors zu enkoppeln, aber im obigen Setup läuft die Schaltung bei mir schon stabil. Es ist jedoch immer eine gute Idee, Steuer- und Lastkreise zu trennen bzw. mittels Dioden etwas zu entkoppeln, für die nächsten Projekte werde ich mir das merken.

Die vorgesehene Eingangsspannung liegt bei 12V; sollten die LEDs zu hell sein, kann auch ein 9V-Steckernetzteil verwendet werden.

Dem aufmerksamen Schaltplanleser wird aufgefallen sein, dass RB4 im Nichts endet. Ja, das stimmt, RB4 sollte ursprünglich den Doppelpunkt ansteuern, aber dann wäre der Doppelpunkt nicht pulsweitenmoduliert gewesen und somit fast immer deutlich heller gewesen als der Rest des Displays. Klar, mittels eines weiteren Transistors hätten RB4 und das PWM-Signal von RB3 verUNDet werden können, aber da der Doppelpunkt sowieso permanent eingeschaltet sein sollte, wurde dessen Steuerleitung vom Mikrocontroller aufgetrennt und mit der ENABLE-Leitung der Schieberegister verbunden, an der - siehe Schaltplan - wiederum das PWM-Signal anliegt.

Ein unkonventioneller Schritt ist die Zuschaltung des Lautsprechers über ein Relais. Das erschien mir notwendig, weil die PWM-Frequenz selbst bei ausgeschaltetem Verstärker über den Lautsprecher hörbar war. Wenn nun der Weckton abgespielt würde, wäre sie das immer noch (weil das Relais ja dann geschlossen wird), somit wird als Ausweg aus der Misere beim Wecken die Helligkeit der Anzeige voll hochgeregelt, sodass das PWM-Signal permanent auf HIGH-Pegel ist. Es kann dann klarerweise keine Störungen mehr einstreuen, weil es sich bei dem Signal nur noch um eine konstante Spannung von 5V handelt. Das trägt zum optischen Effekt des Weckens bei und soll hier nur der Vollständigkeit halber erwähnt werden.

Bilder

Nach so viel Text sollen ein paar Bilder des fertigen Weckers sowie des Innenlebens natürlich nicht fehlen.

Hier ist die Hauptplatine des Weckers zu sehen:

Die Hauptplatine

Die Hauptplatine von der Rückseite

Gut zu erkennen sind die Stiftleisten, an denen die Peripherie angeschlossen wird.

Die Display-Platine ist allerdings optisch ansprechender gestaltet:

Die Displayplatine

Die Displayplatine von der Rückseite

Sie wird über dieses Kabel mit der Hauptplatine verbunden:

Das Verbindungskabel

Hier das leere Gehäuse mit montierter Hohlbuchse für die Eingangsspannung, dem montierten MP3-Player, und dem montierten Poti für die Helligkeitseinstellung:

Das leere Gehäuse

Das braune Material ist Platinenmaterial (Hartpapier), das nur aus Stabilitätsgründen eingebaut wurde. Es gibt der Hauptplatine Halt.

Mit eingebauten Platinen sieht das Gehäuse so aus:

Das gefüllte Gehäuse

Von oben sind die einzelnen Komponenten noch einmal schön zu erkennen:

Das gefüllte Gehäuse von oben

So wurde der MP3-Player mit einem kleinen Klotz Holz gekontert, damit die SD-Karte problemlos gewechselt werden kann.

Die Taster und die Rundumleuchte werden über Pfostenstecker mit der Hauptplatine verbunden, zudem wird nun die blaue Acrylglasscheibe eingesetzt:

Der Wecker mit geöffnetem Deckel

Mit blauer Acrylglasfront und geschlossenem Deckel sieht der betriebsbereite Wecker nun so aus:

Der betriebsbereite Wecker

Die Taster sind in der Reihenfolge STD MIN SLP belegt.

Hier ist der Wecker nun endlich im Betrieb zu sehen:

Der fertige Wecker im Betrieb

Und hier während eines Alarms:

Der fertige Wecker während eines Alarms

Schlussbemerkung

Diese Schaltung hat mich lange beschäftigt, sie ist ja auch schon recht komplex mit vielen separaten Komponenten. Aber schlussendlich denke ich, dass es sich gelohnt hat, diesen Wecker so aufzubauen und nicht anders, er ist ein echtes Unikat geworden.

Nach oben

show print layout Die deutsche Version der Seite besuchen

www.jb-electronics.de » Electronics » Digital Technology » LED Alarm Clock

LED Alarm Clock

My apologies...

There is no English translation of this page available yet. It will take some more time for me to translate the whole website.

If you have a particular interest in this page getting translated as fast as possible, please contact me; I will see what I can do. Please click here for the German version.

To the top