DS3231 RTC – Time is running slow

With my Nixie clock I had a problem while using the DS3231 module as RTC. The more often I query the RTC, the slower the time runs. In worst case you cold see a drift of some seconds just after one minute.

I tried tons of libraries and different coding solutions, but in the end it was the prepared module which I had to fix in hardware.
On the module there is a circuit for charging the battery – but mine was not chargable, also I don’t need to charge it so I removed this resistor.
Also there is a resistor-array as pull-up for the data lines SDA & SCL. I already heave external pull-up’s, so I removed this array too.
In the internet you find many pictures of people removing these resistors.

Picture of the module – found here.

 

 

RGB Temperatur Anzeige (für FHEM)

Um morgens entscheiden zu können, wie dick ich mich für die Fahrradfahrt zur Arbeit anziehen muss, werfe ich einen flüchtigen Blick auf ein Thermometer. Das Problem ist, dass die meisten Thermometer ein Display ohne Beleuchtung haben. Man muss schon genau hingucken und in der Nähe des Thermometers sein um die Zahlen erkennen zu können. Vor allem wenn man die Brille noch nicht auf hat 🙂

Zudem habe ich zwei Funkthermometer – eines zum Messen der Raumtemperatur, das andere zum Messen der Außentemperatur. Diese Thermometer funken auf 868 Mhz zu einem Raspberry Pi mit FHEM. Vorteil bei den Funkthermometern: Ich habe nicht nur eine History in FHEM sondern kann die Thermometer auch sinnvoller platzieren als Kabelgebundene.
Leider ist es noch umständlicher eine App zu öffnen, als auf ein dunkles Thermometer-Display zu gucken 😉 Auch der Versuch ein par FHEM Daten auf einem kleinen Display auszugeben waren nicht zufriedenstellend, da mir die Zahlen noch zu klein waren.

Irgendwann habe ich mich entschieden das Problem mit 7-Segment-Anzeigen zu lösen. Da leuchten die Zahlen aktiv, sie sind groß genug um sie auch aus der Ferne zu erkennen und ich habe die Anzeige nicht mit weiteren Informationen überfrachtet.

Hardware

Die Anzeige besteht aus zwei Zeilen und sechs Spalten.

2014-12-14 19.39.33

Zusätzlich wollte ich ausprobieren, ob man über RGB-LEDs ein zusätzliches visuelles Feedback zur Temperatur abgeben kann, sodass man anhand der Farbe schon auf die ungefähre Temperatur schließen kann – ob sich das bewährt, wird sich zeigen – ansonsten ist es halt nur Kunst 😀

2014-12-14 19.39.21

Die Alufolie war zunächst meine Lösung um die LEDs des darunter liegenden Arduinos zu verbergen, hat sich aber auch als Reflektor bewährt.

Die Platine mit den Anzeigen besteht tatsächlich nur aus den Anzeigen, den LEDs und Stiftleisten. Zum Multiplexen der Anzeige habe ich die gemeinsame Anode der 7-Segment-Anzeigen pro Spalte zusammengefasst, sodass bei der Spaltenauswahl sowohl das Element aus der ersten als auch das aus der zweiten Zeile gleichzeitig angesteuert wird.
Die Auswahl der entsprechenden Segmente erfolgt über Schieberegister. Die jeweils gleichen Segmente der ersten Zeile sind miteinander verbunden und die der zweiten auch. So kann ich über die Anode eine Spalte auswählen und über zwei Schieberegister (pro Zeile eins) die entsprechenden Segmente pro Zeile aufleuchten lassen.
Der Arduino geht spaltenweise durch. Es kann zwar immer nur eine Spalte leuchten, da das Auge aber träger ist, als der Arduino die Spalten durchgeht, sieht es aus als würden alle gleichzeitig leuchten.

 

Eine zweite Platine im gleichen Format beherbergt dann die restliche Elektronik und die Buchsenleisten zum Aufstecken des Display-Boards.

2014-12-14 19.40.26

In der Mitte ein Arduino Nano Nachbau – Vorteil daran ist die fertige Schaltung inklusive USB-Anschluss. Und das zu einem unschlagbaren Preis – wenn man etwas längere Versandzeiten aus China in Kauf nimmt.

Rechts die zwei Schieberegister – diese sind in Reihe geschaltet. Links oben die Transistoren zum Schalten der Spalten und unten die Anschlüsse für die RGB-LEDs.

Hier der professionelle Schaltplan zum Logik-Board 😀

2014-12-14 19.42.17

2014-12-14 19.40.19

2014-12-14 19.40.38

Hier erkennt man das Stacking der zwei Boards aufeinander mit dem Arduino in der Mitte.

2014-12-14 19.39.43

Als Gehäuse habe ich einen Ikea-Bilderrahmen genommen. Die sind schön dick und können etwas Elektronik aufnehmen.

2014-12-14 19.41.20

2014-12-14 19.39.05

2014-12-14 19.38.48

So sieht das ganze dann in Aktion aus.

2014-12-14 19.38.29

Software

Den Arduino-Quelltext habe ich auf github hochgeladen: siehe hier

Übergabeformat
Zum Anzeigen der Werte gibt es ein simples Format, was über die serielle Schnittstelle zum Arduino übertragen wird.

1:23,4\n

Mit 1 (oder 2) gibt man die Zeile an, für die man den Wert setzen will. Gefolgt von einem Doppelpunkt und dem Wert der Anzeige. Ob Komma oder Punkt zum Trennen der Dezimalstellen ist egal. Für negative Werte einfach das Minus mit angeben. Ein Zeilenumbruch schließt den Input ab und sagt dem Arduino, dass er den Wert parsen und anzeigen soll.
Das hat den Vorteil, dass die Werte der zwei Zeilen unabhängig voneinander gesetzt werden können. Die trudeln nicht gleichzeitig bei FHEM ein, daher setze ich die Werte unabhängig voneinander.

Timeout
Sollten mal die Updates der Anzeige fehlschlagen (Übertragung zum Arduino, FHEM läuft nicht, Thermometer senden nicht mehr, ..) stellt der Arduino den Wert auf „-0,0“ um zu demonstrieren, dass ihm Werte fehlen. Dies passiert über einen konfigurierbaren Timeout (derzeit 30 Minuten). Damit beuge ich dem Problem vor, dass ich tagelang eine eingefrorene Anzeige habe und nicht mitbekomme, dass die Werte veraltet sind.

FHEM
In FHEM habe ich das ganze dann stumpf umgesetzt, indem ich die Werte direkt auf das serielle Device schreibe, ohne dieses vorher zu konfigurieren. Dafür gibt es garantiert hübschere und sauberere Wege, aber dieser funktioniert einwandfrei – warum dann mehr Arbeit reinstecken?! 😀

define Outdoor_Temp_Board notify Indoor:T:.* {\
open(FILE,“>/dev/ttyUSB0″);;\
print FILE „1:“;; print FILE %EVTPART1;; print FILE „\n“;;\
close(FILE);;\
}

IV-18 Tube

Ich wollte schon immer mal eine Nixie Uhr bauen. Der ebay-Händler bei dem ich mir die Nixies besorgt habe, hatte auch sehr günstig ein Doppelpack IV-18 Röhren im Angebot. Also muss ich halt 2-3 Uhren bauen 😀

Die IV-18 Röhre wird waagerecht eingebaut und zeigt acht 7-Segment-Anzeigen + Vorzeichen. Grundsätzlich hat die IV-18 nichts mit den glühenden Nixie-Röhren zu tun, da die Nixies Glühdrähte haben und die IV-18 eine Fluoreszenzanzeige ist.

Ich habe mich an der Ice-Tube-Clock von Adafruit orientiert. Aus dem Schaltplan habe ich mir die Spannungsversorgung rausgesucht. Den Microcontroller-Teil habe ich dann aber angepasst. Ich will keine Taster zum Einstellen der Uhrzeit sondern einen DCF77 Empfänger, der das für mich macht. Die Software für die Uhr will ich auch selbst schreiben. Zudem stellt Adafruit den Microcontroller auf eine andere Frequenz ein und lässt diesen die Uhrzeit weiter zählen. Aus meiner Erfahrung ist das eher ungenau und ich finde es auch unnötig kompliziert. In meiner Schaltung habe ich für die Aufgabe eine RTC verbaut.

Die Röhre braucht eine relativ hohe Spannung für den Betrieb (~60 V). Als Eingangsspannung für die ganze Schaltung sind aber nur 12 V verfügbar. Das Boost Power Supply von LadyAda sorgt mit Hilfe von Induktion für eine Erhöhung der Spannung. Dazu wird eine Spule (der Induktor) mit einer gewissen Frequenz geladen und entladen. Durch die Induktion wird eine hohe Spannung erzeugt. Diese wird durch Kondensatoren geglättet, sodass man eine halbwegs konstante Spannung erreicht, die höher ist als die Eingangsspannung.
Die Frequenz bestimmt die Ausgangsspannung. Zum Erzeugen der Frequenz wird ein PWM-Ausgang am Microcontroller benutzt. So kann man über den Quelltext die Spannung regeln.
Mit der originalen PWM-Frequenz des Arduino habe ich leider eine Resonanzfrequenz des Induktors getroffen – die Spule fing an zu singen. Wie man die PWM-Frequenz ändern kann steht hier.

Das Ansteuern der Anzeige erfolgt über ein Multiplexen der einzelnen 7-Segment-Anzeigen. Über den MAX6921 Treiber werden pro Spalte die gewünschten Segmente eingeschaltet. Beim Multiplexen leuchtet immer nur eine Anzeige zur gleichen Zeit. Das Auge ist aber träge und bekommt den schnellen Wechsel der Spalten nicht mit – dadurch sieht es so aus als würden alle gleichzeitig leuchten.

Aktuell habe ich die RTC angebunden und das Multiplexen programmiert. Was noch fehlt ist eine zuverlässige Anbindung des DCF77-Empfängers und ein Gehäuse. Die aktuelle DCF77-Implementierung will noch nicht so richtig. Quelltext siehe unten.

 

 

Quelltext

 

433 Mhz / IR Board

Arduino 433Mhz / IR Board

 433_ir_board_1 433_ir_board_2
Das 433Mhz / IR Board habe ich mir zusammengebaut, um für die Versuche mit den Funksteckdosen und IR-Fernbedienungen nicht ständig alles auf dem Steckbrett zusammenstecken zu müssen. Das Modul ist komplett fertig mit 433Mhz Empfänger und Sender, sowie IR-Sender und -Empfänger. Der passende Quelltext dazu ermöglicht das Auslesen oder Senden bestimmter Codes.

Lochraster Layout

433_ir_board_lr
R1 = 33 Ohm
R2 = 1 kOhm
T1 = 2N2222

Quelltext