AdSense

Montag, 12. August 2013

"Home Automation" mit dem Arduino und 433 MHz - Die Funksteckdose

(English version) Wie in meinem letzten Beitrag beschrieben, möchte ich mit den 433MHz-Funkmodulen Funksteckdosen ansteuern. Bei Pollin gibt es ein Set mit drei Steckdosen und einer Fernbedienung (die wir natürlich nicht brauchen werden ;) ) für unter 10 Euro: Klick mich! Zusätzliche Steckdosen können für 4,50€ zugekauft werden.

Für die Ansteuerung dieser Steckdosen gibt es (wie so oft) eine fertige Library für Arduino mit Namen rc-switch. Die Library kann sowohl Sender als auch Empfänger ansprechen. Mitgeliefert werden einige Beispiele, die das demonstrieren.

Übertragungsprotokoll

Bevor ich aber auf die Verwendung näher eingehe, möchte ich noch die Grundlagen des verwendeten Übertragungsprotokolls erläutern. Der Sender sendet im Prinzip nur eine Bitfolge in Form von HIGH- und LOW-Pegeln. Diese Bitfolge wird jedoch nicht als binäre Bitfolge (also nur 0 und 1), sondern als sogenannte Tri-State-Bitfolge ausgewertet. Wie der Name schon erahnen lässt, gibt es DREI ZUSTÄNDE (statt zwei bei rein binärer Übertragung). Die Zustände heißen 0, 1 und F, wobei F für "floating" steht. Dargestellt werden diese Zustände mit einer Folge HIGH-LOW-HIGH-LOW des Pegels. Die Abfolge von HIGH und LOW ist immer gleich, die Information wird über das Längenverhältnis von HIGH- und LOW-Phase übertragen.
Klingt vielleicht ein bisschen abstrakt, ist aber im Prinzip ganz einfach, wenn man es sich bildlich veranschaulicht:
ein Tri-State-Bit kann man sich wie zwei 4/4-Takte vorstellen. Jeweils eine HIGH-LOW-Folge entspricht einem Takt. Jeder Takt hat eine bestimmte Länge t. Der Takt wird in vier Teile mit der Länge t/4 geteilt. Nun gibt es zwei Möglichkeiten: entweder ist die HIGH-Phase länger als die LOW-Phase (3/4 der Zeit t HIGH und 1/4 LOW) oder umgekehrt.
Bildlich dargestellt:
 _ _ _                       _
|         | _  oder aber |   | _ _ _

Die drei Zustände werden dann folgendermaßen dargestellt:
 _            _
|   | _ _ _ |  | _ _ _ entspricht einer 0
 _ _ _       _ _ _                 
|         | _ |        | _ entspricht einer 1
 _            _ _ _
|   | _ _ _ |        | _ entspricht F

Drückt der Benutzer nun einen Knopf auf der Fernbedienung der Steckdosen, sendet diese zuerst die Adresse der gewünschten Steckdose sowie dem Befehl ("Ein" oder "Aus") im Tri-State-Format. Zum Schluss folgt ein Sync-Bit.

rc-switch und die Funksteckdosen

Mit dem Ganzen müssen wir uns aber eigentlich gar nicht auseinander setzen, denn wir haben ja rc-switch, unsere Library. Sie unterstützt alle möglichen Arten von Funksteckdosen von Haus aus.
Die Adressierung der Steckdosen erfolgt über DIP-Schalter:

Würde man die mitgelieferte Fernbedienung benutzen, müsste man hier mit den ersten fünf Schaltern den "System-Code" einstellen und mit den restlichen fünf, ob sich um Steckdose A, B, C, D oder E. handelt. In unserem Fall ist das aber egal, wir stellen einfach irgendeinen Code ein (in diesem Fall 11011'10000).

Nun bestromt man das Funkmodul, verbindet den DATA-Pin mit einem Pin des Arduinos und spielt folgendes Programm auf den Arduino:

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  //Sender ist mit Pin 10 verbunden  
  mySwitch.enableTransmit(10);
  
}

void loop() {

  //Einschalten
  //der erste Parameter ist die Stellung der ersten fünf DIP-Schalter, 
  //der zweite Parameter die Stellung der restlichen fünf
  mySwitch.switchOn("11011", "10000");

  //Warte...
  delay(1000);
  
  //Ausschalten
  mySwitch.switchOff("11011", "10000");
  
  //Warte...
  delay(1000);
  
}

Im setup() teilen wir dem Programm mit, an welchem Pin unser Sender hängt. Im loop() schalten wir die Steckdose dann zuerst an, warten eine Sekunde, schalten sie wieder aus, warten wieder eine Sekunde usw.
Der Befehl switchOn bzw. switchOff mit den Parametern wird von der Library intern in eine Tri-State-Bitfolge bestehend aus der Adresse und dem Ein- bzw. Aus-Befehl umgewandelt. Bei der Umwandlung wird es ein bisschen verwirrend, eine 1 im Parameter der obigen Befehle wird nämlich zu einer 0 im Tri-State-Befehl. Eine 0 wird zum F. Umgewandelt in Tri-State wäre die Adresse der verwendeten Steckdose nun also 00F00'0FFFF. Der Befehl zum Einschalten der Steckdose lautet 0F, der zum Ausschalten F0.

Man könnte also statt dem "fertigen" switchOn()-Befehl auch den sendTriState()-Befehl der Library verwenden, um den Code zum Schalten der Steckdose "von Hand" zu senden:

void loop() {

  //Einschalten
  mySwitch.sendTriState("00F000FFFF0F");

  //Warte...
  delay(1000);
  
  //Ausschalten
  mySwitch.sendTriState("00F000FFFFF0");
  
  //Warte...
  delay(1000);
  
}  

Wer diese ganze Tri-State-Geschichte nicht mag und lieber mit "echten" Bits arbeitet, kann das Tri-State-Format dann auch noch ins "normale" Bit-Format umrechnen:
00F00'0FFFF'0F entspräche dann 0000010000'0001010101'0001 und 00F00'0FFFF'0F wäre entsprechend 0000010000'0001010101'0100. Diese Bitfolgen könnten dann mit dem Befehl
mySwitch.send("000001000000010101010001");
übertragen werden. Da hier jedoch die Übersicht flöten geht, lasse ich das bleiben ;)

Die Funksteckdosen können wir nun also ansprechen, als nächstes ist nun der Rolladen dran. Das wird ein bisschen spannender ;) Mehr dazu im nächsten Beitrag.

1 Kommentar:

  1. Hallo! Super Anleitung! Hat sofort mit arduino nano + Pollin PFS-3
    gefunkt!!!
    Danke!!!

    AntwortenLöschen