RSS Feed

Binäruhr im Eigenbau

17. Januar 2019 von Jannes Dirks

Weil einfach lesbar zu mainstream ist…

Ich hatte schon länger die Idee mir eine Uhr mit LEDs selber zu bauen, da LEDs bekanntlich alles besser machen. Relativ zügig nach der Anreise habe ich mir schon ein kleines Inventar an Komponenten zusammengestellt. Für eine Uhr, die aus vollen Siebensegmentanzeigen besteht, reichen meine gleichfarbigen LEDs aber nicht aus. Dabei brauch ich pro Ziffer 7 LEDs:

Bildergebnis für sieben segment anzeige

Was sich bei 14 LEDs für die Stunden, 14 für die Minuten, 14 für die Sekunden und sieben für die erste Nachkommastelle zu 49 LEDs summiert. Statt dessen habe ich auf eine etwas ökonomischere Variante zurückgegriffen: statt jede Ziffer klassisch darzustellen, kann ich sie auch einfach mit wesentlich weniger Aufwand binär ausgeben. Dazu eine kleine Erläuterung:

Bildergebnis für binär

Es werden einfach 4 LEDs (Bits) als eine Ziffer gewertet. Dabei bestimmen die Positionen der leuchtenden LEDs den Zahlenwert. Die erste hat den Wert eins, dann zwei, vier und acht. Wenn alle LEDs leuchten wird 1+2+4+8 gerechnet und damit ergibt sich ein Maximalwert von 15. Ich brauche maximal 9, aber da bei bei 3 LEDs nur 1+2+4 darstellbar ist sind 4 LEDs das Minimum. Damit wurden die 49 schon zu 7*4, also 28 LEDs reduziert. vier weiter LEDs lassen sich aber auch noch einsparen: die erste Ziffer der Stundenzahl ist nie höher als 2 (da max. 24 Uhr), die erster Ziffer der Minutenzahl ist nie höher als 5 (da max. 59 Min) und gleiches gilt für die Sekunden. Damit konnte ich mir ein passendes Layout für die LEDs überlegen:

Jetzt werden nur noch 330Ω Widerstände vor die LEDs geschaltet und der einfache Part meines Projektes ist fertig.

Zur Ansteuerung der 24 einzelnen LEDs verwende ich einen Arduino Nano. Dieser hat 19 separat ansteuerbare Pins die entweder an oder aus sind. Den Mathematisch bewanderten fällt sicherlich schon ein Problem auf… Das ich 2 Pins einzig für die Kommunikation mit einem Echtzeitmodul reservieren muss hilft auch nicht. Nachdem ich länger als ich zugeben will gegrübelt habe, bin ich zu einer ziemlich einfachen Lösung gekommen:

Wenn der Transistor A aufgeschaltet wird, sind die negativen Kontakte der LEDs eins bis vier mit Gnd verbunden jetzt können die Pins eins bis vier diese steuern. Wird nun der Transistor B eingeschaltet und A wieder ab, so lassen sich mit den selben Pins die LEDs fünf, sechs sieben und acht ansteuern. Die LEDs bekommen zwar nur für die Hälfte der Zeit Strom, das reicht aber noch aus um sie stark genug zum leuchten zu bringen. Mit zwei Pins für das Echtzeitmodul + zwei für die Transistoren sind nun noch 15 Pins für die LEDs über. Durch die Transistoren lassen sich aber bis zu 30 LEDs ansteuern. Ein paar einsame Abende später ist die Hauptplatine fertig:

Des weiteren nutze ich ein ds3231 Echtzeitmodul, dass die Zeit speichert wenn mal kein Strom vorhanden ist.

Bildergebnis für ds3231

Der Code für den Arduino besteht aus 3 Blöcken: der erste ist fürs Setup und initialisiert das oben genannte Modul, benennt Variablen und ist eher langweilig. der zweite Block ruft die Zeit aus dem Modul auf und sorgt dafür das die Variablen für Stunden, Minuten und Sekunden immer den richtigen Wert haben. Der Dritte und interessanteste Block stellt die Zeit mithilfe der LEDs dar.

Hier werden die ersten zwei LED Reihen die die ersten zwei Ziffern der Stundenzahl anzeigen gesteuert. Dazu wir erst geprüft ob die Zahl größer als 10 ist und dann größer als 20. Damit wird für 23 Uhr beispielsweise die zweite LED in der ersten Reihe eingeschaltet und zeigt somit 20 Stunden an.

h0urs = time[0];
if(time[0] > 9 && time[0] < 20){ digitalWrite(2,HIGH); h0urs = time[0] – 10; } if(time[0] > 19){
digitalWrite(3,HIGH);
h0urs = time[0] – 20;
}

Danach wird die zweite Stelle dargestellt. Dazu wird die folgende Logik verwendet:

if(h0urs == 1 || h0urs == 3 || h0urs == 5 || h0urs == 7 || h0urs == 9){
digitalWrite(4,HIGH); //Ist die Zahl ungerade ist die erste LED immer an
}
if(h0urs == 2 || h0urs == 3 || h0urs == 6 || h0urs == 7){
digitalWrite(5,HIGH); //die Zweite ist bei diesen Werten an
}
if(h0urs == 4 || h0urs == 5 || h0urs == 6 || h0urs == 7){
digitalWrite(6,HIGH); //die Dritte bei diesen
}
if(h0urs == 8 || h0urs == 9){
digitalWrite(17,HIGH); //und die Letzte nur bei 8 und 9
}

Danach wird der Transistor A kurz eingeschaltet und danach alles zurückgesetzt

digitalWrite(13,HIGH);
digitalWrite(13,LOW); //Pin für Transistor
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(17,LOW); //Liste geht noch weiter, es werden einfach alle pins zurückgesetzt. Danach wiederholt sich alles für Sekunden und mit Transistor B

Nachdem alles fertig gelötet ist und der Code keine Fehler mehr auswirft wird der Echtzeitchip eingestellt und die Uhr kann endlich getestet werden:

Tadaaa, ich brauch zum lesen zwar vier mal so lang wie bei einer normalen Uhr dafür sieht meine cooler aus.


Ich entschuldige mich schon mal für die zahlreichen Rechtschreib- und Grammatikfehler.


Keine Kommentare »

No comments yet.

Schreibe einen Kommentar

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