Funksteckdosen mit Microcontroller steuern

Wenn Sie sich auch mit dem Thema Microcontroller beschäftigen, lässt sich mit wenigen Bauteilen eine Steuerung für die Steckdosen entwickeln. Da es mittlerweile auch für z.B. Z-Wave oder ZigBee Funkmodule gibt, ist das Projekt übertragbar. Für den Einsteiger sind die 433 MHz Funksteckdosen sicherlich ein guter Anfang.

Wenn Sie sich lediglich für konkrete Produkte interessieren, empfehlen wir die Produkt-Übersicht.

Für die Steuerung mit einem Arduino oder Raspberry eignen sich wie erwähnt die einfachen Funksteckdosen auf Basis 433 MHz. Sie sind günstig, überall erhältlich und die notwendige Beschaltung beschränkt sich auf ein Minimum. Nachfolgend einmal exemplarisch am Beispiel des Arduino Uno und einem Steckdosenset aus dem Baumarkt. Das Projekt gestaltet sich einfacher, wenn Sie bei den Steckdose eine Variante mit DIP-Schaltern wählen.

Einkaufsliste:

Einen 434 MHz Sender. Diese sind z.B. bei Watterott oder EXP-Tech erhältlich für etwa 4 EUR erhältlich. Dies ist das linke Bauteil auf dem Foto. Das Rechte ist ein Empfängermodul älterer Bauart.

434 MHz Sendemodul, daneben Empfängermodul

434 MHz Sendemodul, daneben Empfängermodul

Dann benötigen wir mindestens eine Funksteckdose. Ich empfehle Steckdosen zu wählen, bei denen die gewünschte Zieladresse mit Dipschaltern einzustellen ist. Ich gehe später genauer auf das Addressschema ein. Die Dose sollte über 433 MHz ansprechbar sein. Mit einem 3er Set für 20 Euro seid ihr dabei. Der Vorteil ist hier, dass die Steckdosen nicht besonders angelernt werden müssen und ihre "Funkadresse" direkt ersichtlich ist.

Dann noch einen Arduino. Hier kann wahlweise ein Raspberry oder anderes Controllerboard verwendet werden. Der Code muss dann ggf. noch angepasst werden aber das Funktionsprinzip sollte klar werden.

Eine Antenne (wenn Reichweite ein Thema ist). Hierfür reicht etwas Draht (20 cm).

Ggf. noch Gehäuse, Leitenplatten etc. Kleinkram zum „Schönmachen“ des Projektes.

Funktionsweise

Ein Großteil der verfügbaren einfacheren Funksteckdosen basiert auf dem gleichen Prinzip und auch das verwendete Nachrichten-Protokol ist i.d.R. identisch. Das macht es aus Sicht des Bastlers einfach, Funksteckdosen verschiedener Hersteller einzubinden und zu kombinieren..

Das einzelne Schaltsignal besteht aus 12 Bits sowie einem Sync-Signal und muss in kurzer Folge mehrfach übertragen werden. Dabei bezeichnen die ersten 5 Bits die Gerätegruppe. Einige Hersteller sprechen hier auch vom Hauscode, Gruppencode oder Verschlüsselung. Die Werte reichen von 00000 bis 11111 und entsprechen der Stellung der ersten 5 Dip-Schalter an den Steckdosen. Die zweiten 5 Bits beschreiben die Adresse der einzelnen Steckdose und entsprechen der Stellung der letzten 5 Dip-Schalter in den Funksteckdosen.

An der Fernbedienung sind i.d.R. nur 5 Dip-Schalter vorhanden um die Gerätegruppe einzustellen. Die jeweiligen Tasten sprechen dann jeweils unterschiedliche Adressen in der Gruppe an. Bei Buchstaben ist das Mapping i.d.R. A:10000, B:01000, C:00100 etc.

Dann folgen noch zwei Bits für den Schaltzustand, entweder 01 (AUS) oder 10 (EIN). Sowie ein Abschlusssignal, damit die Übertragung als abgeschlossen gilt.

Um die erste Steckdose, der ersten Gruppe einzuschalten, müssten wir also folgende Bitfolge senden: 00001-00001-10 (bzw. 000010000110).

Um auch den Zustand 0 sicher übertragen zu können, reicht es nicht per Microcontroller einfach den entsprechenden Ausgang mit den Zuständen HIGH und LOW wechselnd zu schalten (also die Bitfolge direkt zu "morsen"). Bei führenden Nullen wird dies deutlich. Am Anfang wäre eine Pause unbekannter Länge. Daher wird diese Adressform als Inhalt von dem Funkprotokoll erneut in 8 Bit unterteilt, die jeweils 350µs lang sind. Ansonsten wäre ein 01010 von einem 101 nicht zu unterscheiden. Um es kurz zu fassen:

Eine 0 setzt sich wie folgt zusammen:
HIGH 350µs – LOW 1050µs – HIGH 1050µs – LOW 350µs

Eine 1 setzt sich wie folgt zusammen:
HIGH 350µs – LOW 1050µs – HIGH 350µs – LOW 1050µs

Das Sync-Signal setzt sich wie folgt zusamen:
HIGH 350µs – LOW 10.85ms

Hier gibt es einen ausgezeichneten Artikel, der näher auf das Thema eingeht und auch ein paar Lösungen für abweichende Codes hat: http://www.dserv01.de/howtos/funksteckdose-fernsteuern-mit-arduino/

Wenn die Steckdosen keine Dip-Schalter aufweisen kann man systematisch die Adressen ausprobieren. Dazu empfiehlt es sich eine kleine Schleife zu bauen und alle paar Sekunden die nächste Adresskombination auszuprobieren. Auf der Seriellen Schnittstelle könnte man sich dann ausgeben lassen, welcher Code gerade gesendet wurde. Das ist zwar nicht elegant aber dafür schnell umgesetzt.

Um eine Steckdose zu schalten sollte der Code mehrfach hintereinander übertragen werden. Es ist für die Steckdosen i.d.R. vorgesehen die Nachricht mehrfach zu empfangen, um sicherzustellen, dass es kein zufälliges Funksignal ist.

Anschluss des Senders

Anschluss RF-Link Transmitter

Anschluss RF-Link Transmitter

Wenn man nur Dinge in der näheren Umgebung schalten möchte, reichen die 5V des Arduino als Stromversorgung. Die Module können mit bis zu 12V betrieben werden und erreichen damit deutlich größere Reichweiten (zusammen mit einer Antenne).

Wer Reichweiten bis 100m oder gar darüber hinaus erreichen will kann auf komplexere Module oder zusätzliche Verstärker (Booster) wechseln.

Es sollte die IR Schnittstelle des Boards verwendet werden. Beim Arduino UNO ist dies Pin3 beim Arduino Mega ist dies Pin9. Als Antenne reicht ein 17,5cm langer Draht.

 

Code zum Schalten

//
// SEND CODE VIA 434 MHz Transmitter
//

boolean sendCode(char code[]){
    for(short z = 0; z<7; z++){ //wiederhole den Code 7x
      for(short i = 0; i<12; i++){ //ein Code besteht aus 12bits
        sendByte(code[i]);
      }
    sendByte('x'); //da der code immer mit x/sync abschliesst, brauchen wir den nicht im code und haengen es autisch immer hinten ran.
    }  
  return true;
}

void sendByte(char i) { //Diese Funktion soll 0,1 oder x senden koennen. Wir speichern die gewuenschte Ausgabe in der Variabel i
    switch(i){
      case '0':{
        digitalWrite(tx434,HIGH);
        wait(1); //da die Pausen x*350us lang sind, machen wir daraus eine Funktion
        digitalWrite(tx434,LOW);
        wait(3);
        digitalWrite(tx434,HIGH);
        wait(3);
        digitalWrite(tx434,LOW);
        wait(1);
        return;
      }
      case '1':{ //Der Code fuer '1'
        digitalWrite(tx434,HIGH);
        wait(1);
        digitalWrite(tx434,LOW);
        wait(3);
        digitalWrite(tx434,HIGH);
        wait(1);
        digitalWrite(tx434,LOW);
        wait(3);
        return;
      }
      case 'x':{ //Der Code fuer x(sync)
        digitalWrite(tx434,HIGH);
        wait(1);
        digitalWrite(tx434,LOW);
        wait(31);
      }
    }
}
 
void wait(int x) {
  delayMicroseconds(x*350); //warte x*350us
}

Einfach diese Zeilen in euren Sketch werfen. Und die Funktion z.B. so aufrufen:

sendCode("111110010001");

Das ganze kann man dann natürlich noch etwas eleganter aufbauen und z.B. mit Sensoren kombinieren (Licht an/aus je nach Helligkeit, oder Ventilator bei einer Schwelltemperatur einschalten).