undefinedSeit Jahren habe ich mich darüber geärgert, dass alle Wecker die ich bisher hatte immer ein oder zwei Macken hatten die mich störten. Der eine war viel zu Hell. Beim anderen musste man eine Taste drücken um das Licht überhaupt anzuschalten (zu lautes "klick"). Der andere hatte nur eine Alarm-Zeit. Der letzte brauchte tatsächlich 8 Tastendrücke, nur um einen Alarm einzuschalten und vier um ihn zu deaktivieren.

Also war es ein langer Wunsch mal einen eigenen zu bauen. Und nach jahrelangem "drüber reden" hab ich es jetzt tatsächlich geschafft!

Weiter lesen? Klicke die Headline um den ganzen Artikel zu sehen!

Die Idee

Die Idee war, einen Wecker zu bauen der extrem Einfach und Logisch zu bedienen sein soll. Weiterhin soll das Display etwas moderner sein als die typischen LED Anzeigen. Da bereits aus vorigen Experimenten ein Teensy 3.1 Controller und einm OLED-Display zur Verfügung standen, sollten diese die Basis sein.

Folgende Bauteile wurden letztlich verbaut:

Bauteile

In Summe waren das Kosten von deutlich unter 100,- EUR (ca. 67,- EUR für die Teile aus den Links, Versandkosten nicht eingerechnet).

Aufbau

Am Ende habe ich alle Bauteile auf zwei schmale Punkt-Streifenrasterplatinen gelötet. Mit einer kleinen Säge hab ich vorher Aussparungen für das OLED-Display und den Dreh-Encoder gesägt. In das Gehäuse musste ich eine Aussparung für das OLED-Display in den Seitenflansch bohren und feilen. Davor hatte ich erst großen Respekt, es hat dann aber überraschend gut geklappt. Zwei schon angekörnte Löcher hab ich dann doch nicht benötigt, weil ich das Display mit Heißkleber befestigt hab. Die Körnungen kann man halt jetzt sehen :-(

Das Display zeigt im normalen Uhr-Modus die Uhrzeit mit Sekunden, das Datum mit Wochentag sowie die beiden Alarmzeiten (falls aktiviert):

undefined

Bauprobleme

Leider habe ich den Bau-Fortschritt nicht fotografiert, so dass ich keine Zwischen-Schritte zeigen kann. Aber so spannend wäre das jetzt auch nicht gewesen ;-) Die meisten Probleme verursachte tatsächlich die Wahl des passenden Gehäuses. In den üblichen Katalogen (Reichelt, Pollin, Conrad) hab ich nichts passendes gefunden. Letztlich half nur ein China-Gehäuse von Amazon. Weiterhin machte das OLED Display (Von Adafruit mit SSD1306 Treiber-Chip) Probleme, da ich erst spät erkannt hab dass die I2C Schnittstelle fast die gesamte Rechenzeit aufgefressen hat. Als ich auf die SPI-Schnittstelle gewechselt bin haben sich die Probleme schnell erledigt.

Zu beginn wollte ich noch ein Uhrzeit-Modul mit Puffer-Batterie und i2c Schnittstelle nutzen. Das Ding lief aber am Tag mehrer Minuten zu langsam und erwies sich als Nutzlos. Hat aber auch viel Zeit gekostet.

Bedienkonzept

Die Bedienung erfolgt aussnahmslos über einen Dreh-Encoder mit Tastenfunktion. Man dreht also und bestätigt durch kurzen Druck. Durch einen ersten Klick gelangt man in das

Hauptmenü

 undefined

Hier kann man durch weiteres klicken die Alarmzeiten stellen. Man kann sehen, dass aktuell die Stunde markiert ist und durch drehen verstellt werden kann. Durch einen weiteren Klick kommt man zu den Minuten und final kann man noch AN und AUS wählen:

undefined

Die Uhrzeit und das Datum stellt man so. Im Bild sieht man den aktuell gewählten Monat:

undefined

Mit "Dimmer" kann man die Helligkeit einstellen, auf welche der Wecker bei Dunkelheit herunterdimmen soll. Durch drehen stellt man von voll (rechts) bis ganz wenig (links) ein. Untendran sieht man den Wert des Helligkeit-Sensors. Das hilft allerdings mehr beim Programmieren um den richtigen Treshold zu finden:

undefined

Schnellzugriff

Wenn man statt einem Klick einfach nur am Encoder dreht, gelangt man in das Schnellzugriff-Menü:

undefined

Je nachdem ob ein Alarm aktuell AN oder AUS steht, kann man hier das jeweilige Gegenteil auswählen. Also mit einem Dreh und Klick den Alarm 1 oder 2 AUS oder AN schalten.

Ergebnis

Hier lass ich Fotos mit kurzen Erklärungen sprechen:

undefined  

undefined

Links auf der Platine der Summer und rechts der Teensy 3.1 auf einem Sockel.

undefined

 

 undefined

Links der Helligkeits-Sensor. Ich hab den so plaziert, dass er im zusammengebauten Zustand exakt unter der Bohrung liegt. Das gilt auch für den PIR-Sensor rechts.

 

 undefined

 

 undefined

Der PIR-Sensor ist recht ungünstig auf der gelieferten Platine aufgelötet. Für meine Zwecke hab ich den von der Elektronik getrennt und separat auf der Platine aufgebracht und hinten wieder verlötet.

 undefined  

Programmier-Erkenntnisse

Dimmen

Das Dimmen des OLED-Display erfolgt über Variablen die den Soll-Wert und den Ist-Wert speichern. Weicht der Soll-Wert vom Ist-Wert ab, wird in einer Unterfunktion jeweils der Ist-Wert erhöht oder erniedrigt. Zuerst direkt über den Increment. Das ergibt weiches "faden" zwischen den Helligkeitswerten. Als ich das Display von i2c auf SPI umgestellt hatte, war das plötzlich aber viel zu schnell. Logisch, da ein fester imcrement bei jedem Aufruf stark von der Geschwindigkeit der Verarbeitung abhängt. Also habe ich die Funktion umgebaut um stupide nur alle 100ms eine Veränderung durchzuführen. So ist die Geschwindigkeit des Dimmens immer gleich schnell, egal ob ein Zyklus etwas mehr Zeit benötigt hat oder weniger (so lange er weniger als 100ms benötigt hat, was sehr viel Zeit ist). Auch wenn die Taktfrequenz des Prozessors einmal anders sein sollte, ist die Fade-Geschwindigkeit jetzt immer identisch.

Helligkeits-Sensor

Das war einfach. Alle Sekunde frage ich den Wert ab. Ich speichere den in eine Variable, wobei ich immer die folgende Formel anwende:

wNeu = (wAlt * 9 + wNeu) / 10

Das bewirkt, dass der aktuelle Wert jeweils nur zu einem Zehntel berücksichtigt wird und somit kurze Schwankungen der Helligkeit kein nervöses hin- und herdimmen auslösen können. Allerdings reagiert der Wecker dann etwas träge auf Helligkeitsänderungen (Licht im Zimmer an/aus), aber das stört mich nicht. Die Zahlen sind ja änderbar, falls das jemandem zu schnell oder langsam ist.

Encoder und Taster

Ich verwende eine Standard-Encoder-Lib um mir die Arbeit zu erleichtern. Den Taster musste ich entprellen. Dazu hat ein kurzes Delay von 30ms nach einem erkannten Signal ausgereicht.

Wecksignal

Ich habe mir ein Array angelegt in dem ich immer abwechselnd die Dauer des Signals und der Pause speichere (in Millisekunden). So kann ich beliebige Piep-Muster definieren. Ich habe eines angelegt das zuerst einmal ganz kurz piept und dann 5 Sekunden Pause macht. Danach steigert sich das Signal durch kürzeres Intervall und längeres Piepsen. So wie ich es mag :-)

Update (Mai 2018)

Ich hab den Dimmer noch erweitert, denn wenn ich Nachts per Bewegung die helle Stufe aktiviert hab, hat es mir fast die Augen weggebrannt :-) Jetzt gibt es vier verschiedene Helligkeiten (gemessen) denen ich jeweils eine gedimmte Stufe und eine "helle" Stufe zugeordnet hab. So wird es, bei sehr dunkler Umgebungshelligkeit, auch nur auf 30% hochgedimmt, wenn Bewegung erkannt wird. Viel angenehmer :-)