Prolog

Alles entstand nur deshalb, weil mir meine Klingel im Wohnheim viel zu schrill klang... außerdem hatte die bereits eingebaute Klingel den Nachteil, dass man damit, wenn man den Finger einfach auf dem Klingelknopf verweilen ließ, durchgehend klingeln konnte. Das mißbrauchten leider einige Leute, zum Beispiel Freunde, die auf Wohnheimsfeiern waren, wenn ich mal zufällig nicht da war und schlafen wollte.

Ich entschloß mich also zunächst für eine kleine Mikrocontrollerschaltung. Denn durch einen Mikrocontroller wäre es möglich, ein Sturmklingeln per Software zu verhindern und überdies nur Klingeln zu mir genehmen Zeiten zuzulassen. Das Projekt wurde immer umfangreicher und nun ist aus meiner kleinen Klingel ein riesen Mostrum mit allen erdenklichen Features geworden:

Features

  1. Die Klingel läßt sich per SPI (Serial Programming Interface) programmieren, ohne dass der Mikrocontroller abgesteckt werden muss. Hierfür habe ich einen 8-pin Molex (PSK) Stecker verwandt
  2. Sie läßt sich per RS232 (serielle Schnittstelle des PC) an einen PC anschließen. Dann kann über den PC die Klingeluptime abgefragt werden, die Zeit gesetzt werden oder abgefragt werden, ob "Klingeln in Abwesenheit" stattgefunden hat
  3. Ursprünglich hatte ich eine elektronische Klingel, die von einem Siemens SAE800 gesteuert wurde. Leider erwies sich das Klingelgeräusch als grausam. Deshalb habe ich eine mechanische Klingel aus dem Baumarkt eingebaut, welche elektronisch angesteuert wird.
  4. Die Klingel synchronisiert sich automatisch mit dem DCF77-Signal (Funkuhr) der PTB (Physikalisch-Technischen Bundesanstalt). Dann läßt sie nur Klingeln zu mir bequemen Zeiten zu und auch nur nach fest definierten Intervallen. Die Klingel unterscheidet zwischen Wochentagen und Wochenende und passt demnach die Zeiten an.
  5. Die Klingelkomponente ist dreigeteilt: die Hauptcontrollerplatine läßt sich bequem mit dem DCF77-Modul oder dem eigentlichen Klingelmodul (also der mechanischen Klingel) verbinden.
  6. Falls einmal bei mir geklingelt wird, während ich nicht da sein sollte, wird der Klingelversuch im EEPROM gespeichert, zusammen mit dem Datum und der Uhrzeit. Selbst nach Stromausfall kann dann also das Klingeln in Abwesenheit bequem über die RS232-Schnittstelle des PC abgefragt werden.
  7. Drei LEDs (rot, gelb, grün) zeigen jeweils den aktuellen Status der Klingel auf einen Blick an: rot bedeuted (abhängig vom selektierten Klingelmodus), dass entweder die Klingel gerade in der Totzeitphase ist (also nach einem Klingeln eine gewisse Zeit lang kein erneutes Klingeln zuläßt) oder das die Klingel sich in der Timeout-Totzeit (also z.B. Samstags, halb zehn Uhr) befindet - in jedem Fall bedeuted rot: Gebt Klingelern keine Chance. Gelb zeigt den Status der DCF77-Synchronisation an und sollte eigentlich munter im Sekundentakt blinken, wenn alles in Ordnung ist. Grün zeigt an, dass Klingeln in Abwesenheit statt gefunden haben und der Benutzer dazu angehalten ist, den Status über das RS232-Interface abzufragen um den Status zurückzusetzen.

Zur Hardware

Verwandt habe ich als Herzstück einen Atmel AT90S2313 Mikrocontroller, der (entgegen der Spezifikation, aber das Design war zunächst anders - ich hatte mit einem AT90S1200 geplant) auf 12MHz getaktet wird. Die Platine ist an ein Steckernetzteil angeschlossen, die Spannung wird gleichgerichtet, geglättet und mit einem Standard 7805 Linearregler stabilisiert. Ich war zu faul (und hatte keinen Platz mehr auf der Lochrasterplatine) einen Schaltregler zu verwenden. Das Klingelsignal ist eine relativ schmutzige 9V Wechselspannung. Das Signal kann über Anreihklemmen an die Platine angeschlossen werden und wird dann einweggleichgerichtet, durch ein RC-Glied gefiltert, durch einen weiteren Widerstand der maximale Strom in den Mikrocontroller begrent und (nur zur Sicherheit) noch durch eine Zenerdiode die maximale Spannung begrenzt. Ein Latchup ist somit so gut wie unmöglich. Das DCF77-Modul ist von Conrad und recht unspektakulär: nach einem Pullup-Widerstand wird das Signal noch durch einen 74HCT14 geschickt (Hex Inverting Schmitt Trigger), um die Signalflanken schöner zu machen. Die Klingelplatine ist wohl noch einfacher: Widerstand, Transistor. An der Klingel, die ja eine induktive Last ist, hängt noch eine Freilaufdiode (um die Spannungsspitzen zu vernichten). Weiterhin ist noch ein fetter (3300µF) Elektrolytkondensator auf der Platine, da die Klingel im Einschaltmoment einen relativ hohen Strom benötigt (ca. 1-2A) und vorher der Mikrocontroller abgestürzt ist.

Zur Software

Das Klingelsignal wird an eine Interruptleitung geschaltet, relativ unspektakulär. Viel Aufwändiger ist die Implementierung der DCF77-Synchronisation, die eigentlich ständig läuft: ein Timer löst alle 5ms, also 200 Mal in der Sekunde, einen Interrupt aus. Ein Counter zählt mit, wie oft das Schaltsignal in dieser Sekunde LOW beziehungsweise HIGH war. Je nachdem, wie oft das der Fall war, wird das Signal synchronisiert. Das UART wird auch interruptgesteuert: als Synchronisation sendet der PC zunächst einmal 7 Mal "0x00" an den Mikrocontroller. So ist sichergestellt, dass der Mikrocontroller zum Empfang eines Befehls bereit ist. Nun werden 4 Befehlsbytes übermittelt (1 Code, 3 Parameter), welche bestimmte Funktionen erfüllen: so kann der PC den Status abfragen, die Uhrzeit oder das Datum setzen, oder abfragen, wie oft und wann in Abwesenheit geklingelt wurde. Alles ist in AVR-GCC implementiert.

Das Softwarepaket

Das komplette Softwarepaket kann hier heruntergeladen werden. In dem Paket befindet sich ein Programm, um das UART per Kommandozeile zu steuern, ein Programm, das das System von DCF77 verdeutlicht und den eigentlichen Quellcode und alle benötigten Dateien, um den Controller zu steuern. Ich release hiermit den gesamten Quellcode unter der GPL, der Gnu General Public License.

Beispiel der Kommunikation mit der Klingel

Hier kann man sehen, wie es aussieht, wenn man mit "bellquery" den Klingelstatus abfragt und wie es aussieht, wenn man die Abwesenheits-Liste abruft und löscht.
acer joe [~/Eigene_Dokumente/Programmieren/AVR/tuerklingel-0.04/bellquery]: ./bellquery status
Benutze Gerät /dev/usb/tts/0
Zeit                   : 18:56:55
Wochentag              : Montag
Datum                  : 2.5
Uptime                 : 13 Tage, 18:45 Stunden/Minuten (seit 19.4.2005 00:11)
DCF77-Status           : Suche Signal, Synchronisiert
DCF77 Synchronisationen: 3
Klingel-Totzeit        : 130
Klingelmodus (Rote LED): Zeigt automatische Abschaltung an

acer joe [~/Eigene_Dokumente/Programmieren/AVR/tuerklingel-0.04/bellquery]: ./bellquery getaway
Benutze Gerät /dev/usb/tts/0
Klingeln in Abwesenheit: 8
Nummer  1:    Samstag, 23.4, 16:36 Uhr
Nummer  2:    Samstag, 23.4, 21:47 Uhr
Nummer  3:    Sonntag, 24.4, 20:02 Uhr
Nummer  4: Donnerstag, 28.4, 11:59 Uhr
Nummer  5: Donnerstag, 28.4, 13:01 Uhr
Nummer  6: Donnerstag, 28.4, 19:33 Uhr
Nummer  7: Donnerstag, 28.4, 20:23 Uhr
Nummer  8:      Heute,  2.5, 17:02 Uhr

acer joe [~/Eigene_Dokumente/Programmieren/AVR/tuerklingel-0.04/bellquery]: ./bellquery clraway
Benutze Gerät /dev/usb/tts/0
Klingeln in Abwesenheit-Liste gelöscht.

acer joe [~/Eigene_Dokumente/Programmieren/AVR/tuerklingel-0.04/bellquery]: ./bellquery getaway
Benutze Gerät /dev/usb/tts/0
Klingeln in Abwesenheit: 0

acer joe [~/Eigene_Dokumente/Programmieren/AVR/tuerklingel-0.04/bellquery]:

Was mir besonders gefällt

Nicht nur, dass sie cool aussieht und gut klingt, aber am meisten bin ich eigentlich auf die Software stolz: das Programm belegt 2046 von 2048 verfügbaren Bytes, es werden also nur lediglich 2 Bytes verschwendet! Der Flash des Mikrocontrollers ist also zu 99,9% voll! Weiterhin freut mich, dass die DCF77-Synchronisation (mit einigen Tricks) funktioniert, das war hauptsächlich ein Proof of Concept.

Bilder

Die alte Klingel, die weichen musste:
Meine alte Klingel

Die Hauptplatine der neuen Klingel: Links oben sieht man die zwei blauen Anreihklemmen, die das Klingelsignal gefiltert (Widerstand, Diode, Kondensator, Zenerdiode, Pullup-Widerstand) in die Klingel bringen. Der linke IC ist ein MAX232, der die Pegelkonvertierung des UART zu RS232 vornimmt. Unten (etwas verdeckt) sieht man den 8-pin Molex, der für das SPI (Serial Programming Interface) zuständig ist. Gut sichtbar ist der AT90S2313 Mikrocontroller der durch einen 12MHz Quarz um 20% übertaktet wird (ich war zu faul, den Quarz zu ändern und der AVR ist auch bei 12MHz anscheinend recht zuverlässig). Ganz oben in der Mitte die bunten LED, die den Status anzeigen. Rechts oben sieht man (angedeuted) den Brückengleichrichter sowie den 7805-Linearspannungsregler mit dazugehörigem Kondensatorsalat. That's it!
Hauptplatine

Das DCF77 (Funkuhr) Modul und der 74HCT14 im Hintergrund:
DCF77-Modul

Die Klingelplatine (leider ist die Klingel selbst etwas angekokelt, weil sich mein Lötkolben mal drauf ausgeruht hat):
Klingel-Modul

Und nochmal in groß, nur die Platine:
Das Klingel-Modul in groß

Ein Gesamtbild, man sieht den 9poligen Stecker, der an den MAX232 angeschlossen ist, welcher an das UART geht und das Netzteil:
Ein Gesamtbild

Download

Falls der Link im obigen Text überlesen wurde, hier kann man sich die komplette Software herunterladen.