|
[Jan. 2017] Zeitgesteuerte Funkschalter
Ein günstiges Funksteckdosenset mit drei Funkschaltern ist das Ausgangsmaterial für die folgende Bastelei. Die weitere Motivation war eine praktische Möglichkeit zu schaffen Lampen zeitgesteuert zu schalten und dabei nicht mit einzelnen Schaltuhren hantieren zu müssen. So entstand eine Steuereinheit, die die Funkschalter unabhängig voneinander schalten kann.
Funktionen
Kern ist wieder ein PIC16F1827 Mikrocontroller, welcher schon ins der Zeitschaltuhr "Extra" zum Einsatz kam. So konnte ein großer Teil des Quellcode im neuen Projekt verwendet werden und ein paar Verbesserungen haben den Weg zurück in das Ursprungsprojekt gefunden.
Die Anzeige ist ein LC-Display mit zwei Zeilen (je 8 Zeichen). Über dies
lassen sich alle Zustände und Einstellungen aufrufen. Die Hauptanzeige
wird nach einiger Zeit ohne Tasteneingabe eingeblendet. Da die Schaltung batteriegespeist
ist (2x Typ AA / Mignon), wird nach 30 Sekunden das Display abgeschaltet (der
komplette DC-DC Wandler) – um die Stromaufnahme gering zu halten.
Die Uhrzeit, der Status der Funkkanäle und Zustand der Batterie lässt
sich auf der Hauptanzeige ablesen.
Aktuelle Uhrzeit |
DCF77 Empfang (?) |
||
Batteriezustand (! = schlecht)
|
|||
Status der Funkkanäle
(A, B, nächste Zeile: C) |
Funkuhr
Die Uhrzeit wird automatisch über das DCF77 Funksignal gestellt. Wurde
das Funksignal zweimal in Folge erfolgreich empfangen, so erscheint ^
im Display. Nach dem ersten Einschalten oder wenn der Funkempfang für mehr
als 4 Stunden nicht möglich war, erscheint ? in der Hauptanzeige.
In diesem Fall wechseln alle Funkschalter auf Aus.
Zeitschaltuhr mit Zufallsfunktion
Die Funktion der Zeitschaltuhr ermöglicht es einen, oder auch
alle Funkschalter zu einem bestimmten Zeitpunkt ein- oder auszuschalten. Für
jede Schaltzeit kann eine Zufallsfunktion aktiviert werden, welche die eingestellte
Schaltzeit verzögert. Jeder der 30 Speicherplätze kann frei den Funkschaltern
zugeordnet werden.
Zufallszeit
Die maximale Zufallszeit ist von 0 bis 30 Minuten konfigurierbar. Es wird für
jede programmierte Schaltzeit eine Zufallszahl in diesem Bereich erzeugt und,
falls aktiviert, zu der Ein- oder Ausschaltzeit addiert. Wenn die Zufallszeit
auf 0 eingestellt wird, erfolgt keine Verzögerung der Schaltzeiten.
Batteriezustand
Die Batteriespannung wird mit Hilfe einer, im Prozessor verfügbaren, Spannungsreferenz
gemessen. Ist der Zustand der Batterien in Ordnung, wird Batt:ok
im Display angezeigt. Wenn die Batteriespannung abnimmt, wechselt die Anzeige
auf Batt:ko. In diesem Zustand wird diese Meldung angezeigt,
sobald das Display eingeschaltet wird. Zusätzlich erscheint ein !
in der Hauptanzeige.
Um den Handsender der Funkschalter nachzubilden und das gleiche Signal über das Sendemodul schicken musste zunächst das Signal analysiert werden. Wie lange dauert eine Telegramm (Frame), wie ist der Kodiert? Dazu wurde der Ausgang des Handsenders angezapft (Übergang des Logik-ICs HS2260A, Ausgang zum Sendemodul Eingang), über einer Schutzschaltung mit einer PC Soundkarte (Line In) verbunden und der Signal mit "Audacity" aufgezeichnet. Die Schaltung ist hier beschrieben.
Nachdem jeder der Sendetaster betätigt wurde sind alle Sechs Signalverläufe als Audiodatei gespeichert. Das Folgende Bild stellt den Verlauf dar. Anhand der Zeitmarkierung in "Audacity" lässt sich die Dauer eines Telegramms bestimmen. Hier sind es 37 ms inklusive einer Pause bevor das nächste Telegramm gesendet werden darf.
Dank fleißiger
Bastler im Netz, die sich mit der gleichen Aufgabe befasst haben,
lässt sich auf eine Kodierung mit drei logischen Zuständen schließen.
"0", "1" und "F". Ein vollständiger Befehl sieht wie folgt aus: |
|||
Jedes logische Datenelement besteht aus 8 Takten,
zu je 289µs = 2,312ms um eins der drei Datenelemente zu Senden. Mit 12 Datenelementen und 4 "Pausenelementen" ergeben sich bei 128 Takten je 289µs eine Länge von 36,99ms für das gesamtes Telegramm. |
Nach der Auswertung aller Sechs Signalverläufe ergibt sich ein Muster,
welches eine Unterteilung der Datenelemente erlaubt. Die ersten 4 in Gruppen-/Hauscode,
die nächsten 4 für den jeweiligen Funkschalter und die letzten 4 Datenelemente
für den Befehl "An" oder "Aus". Mit dieser Gruppierung
lassen sich später im Programm die einzelnen Elemente des Telegramms wieder
zusammensetzen und der benötigte Speicherplatz ist relativ klein (28 Byte
für 3 Funkkanäle, 32 für 4).
Damit es zu keiner Fehlfunktion der Funkschalter kommt, müssen mehrere
Telegramme des selben Befehls in Folge gesendet werden.
Die Elektronik basiert, wie erwähnt, auf einem einfachen Funksteckdosenset welche in Baumärkten oder Elektronikgeschäften erhältlich ist. Bei der Auswahl sollte man darauf achten, das der Sender mit einer geringen Spannung arbeitet – also mit einer Lithium Batterie oder zwei 1,5V Batterien betrieben wird. Nicht mit 9V oder 12V! (Mein Model ist leider mit 12V Batterie, läuft aber mit 5V, dafür mit geringerer Reichweite.)
Der erste Testaufbau um den Sender mit verschiedenen Spannungen und die ersten Zeilen Programmcode auf seine Funktion zu prüfen. Das Sendemodul im Handsender war auf einer separaten Platine untergebracht und ließ sich somit hervorragend ausbauen. Die LED am Sender wurde später noch ausgelötet. Die LED am Mikrocontroller diente meist dazu sekündlich zu Blinken (Debugging). Es hat einige Zeit in Anspruch genommen, bis sich der Funkschalter zum einschalten bewegen ließ, was auch daran lag, dass mir die 9ms Pause zwischen den einzelnen Telegrammen erst später aufgefallen sind. |
||||
Die teil- und komplett bestückte Platine. |
||||
Das Gehäuse entstand aus 4mm Fichtensperrholz – sieht gut aus und lässt Funkwellen passieren. Die Taster aus 5mm Kunststoffresten und das Batteriefach wurde aus einem Spielzeug wiederverwendet. Ein wenig Nacharbeit mit Schlüsselfeilen war noch nötig um das Batteriefach passgenau in das Gehäuse zu integrieren. | ||||
Vor dem LC-Display befindet sich eine 1mm Dicke Schutzscheibe. Die Tasten sind mit dünnen Kunststoffstreifen verbunden, so fallen sie nicht so schnell heraus und kompensieren den zu großen Abstand zu den Tastern. | Die ganze Konstruktion, mit verbundenem
"Pickit 3" Programmer. |
|||
Platzhalter für finales Foto. |
Programmablauf
Der PIC16F1827 läuft meist mit 4MHz, da in dieser Chip Revision ein paar Bugs steckten und bei Taktraten über 8MHz der ADC nicht mehr richtig funktioniert. (Das Löschen des GO_nDONE Flags erfolgt nicht mehr zuverlässig.) Bei niedriger Taktfrequenz ist die Stromaufnahme geringer und 4MHz reicht für alle Funktionen vollkommen aus, wenn aber ein Funksignal gesendet werden muss, wird auf 16MHz gewechselt.
Der Programmspeicher von 4K "Words" ist mit den benötigen Funktionen,
u.a. für das LCD und dem Menü wieder eine Herausforderung. Daher ist
ein Teil des Programmcodes per Direktiven "abschaltet":
#define LCD_REDUCED_CODE_SIZE
#define REDUCED_CODE_SIZE
Der Code für die DCF77 Signalauswertung (Messung der Bitlänge, BCD
Umwandlung, etc.) stammt, in etwas abgeänderter Form, aus dem Lauer-Sommerabend-Detektor
von Fingers elektrische
Welt. Der ursprüngliche Code zur Zufallserzeugung stammt von Zabex
"Looping Louie", hier meine Version.
Um die Batteriespannung zu messen, wird das "Fixed Voltage Reference (FVR)
module" des Prozessors genutzt und auf 2,048 Volt eingestellt. Diese Referenzspannung
wird als positive Spannung dem Analog/Digital (ADC) Wandler zugeführt.
Das LCD Menü wurde von der Zeitschaltuhr
"Extra" übernommen und angepasst. Dabei sind eine paar Verbesserung,
wie z.B. das auslesen aller nötigen EEPROM Werte beim Aufruf des Menüpunkts
zur Zeitprogrammierung, in den ursprünglichen Quellcode zurück geflossen.
Funkschalter aus dem Baumark, weitere Teile von Pollin, Reichelt und gesammelte Bauteile...
Der Schaltplan als PDF Datei |
||
Programmcode (MPLAB-X Projekt + hex) |
||
loetmeister ©2017