Drucken

Steuerung einer Funksteckdose (434 MHz) mit Arduino

 

Empfänger bauen

Für die Steuerung einer Funksteckdose muss zunächst das 434MHz-Signal ermittelt werden, welches die Fernbedienung an die Steckdose sendet. Dazu muss ein Empfänger gebaut werden.
Bauteile:


RF Link
Empfänger - 434MHz

Arduino

Kabel Cinch - Klinke

  

Zusammengebaut kann das dann so aussehen

Anschluss des Empfängers (von links)

Roter Cinch Stecker auf +5V.
Den Klingenstecker jetzt in den Line-In-Eingang der Soundkarte des PC stecken. Auf dem PC wird ein Soundprogramm benötigt, dass aufzeichnen und den Ton in Wellenform darstellen kann. Zum Aufzeichnen eines Signals der Fernbedienung zuerst Aufnahme drücken, dann eine Taste auf der Fernbedienung und dann die Aufnahme wieder stoppen. Das Ergebnis könnte dann so aussehen.

 

Dekodieren

Dieses Signal muss nun dekodiert werden.

6 gleiche Signale

reinzoomen

nochmal reinzoomen

eines der Signale in groß

 

Das Signal besteht aus drei Typen von Bits.

0 (oben lang, unten kurz)
High 0,001s = 1ms
Low 0,0005s = 0,5ms
1 (oben kurz, unten lang)
High 0,0005s = 0,5ms
Low 0,001s = 1ms
X (Endesignal)
High 0,003s = 3ms
Low 0,007s = 7ms

Daraus ergeben sich folgende Daten:

Gesamtlänge 46ms
Einzelschritt 1,5ms
Pause 10ms
Codierung 24 bit

Das Signal wird 6-mal wiederholt.

Bitmuster im Beispiel: 010001001010101011100011

Diese Ermittlung muss für jede Taste auf der Fernbedienung, die später auch wieder gesendet werden soll, erfolgen.

 

Signal senden

Zum Senden der ermittelten Signale wird Folgendes benötigt:

Arduino

RF Link Sender - 434MH

Zusammengebaut

 

short rc_pin=2; // der Pin auf dem der Datenpin des Senders angeschlossen ist.

void setup() {

 pinMode(rc_pin, OUTPUT);  // definiere rc_Pin als Ausgang (schliesslich wollen wir senden)
}

void loop() {

 sendCode("010001001010101011100011"); // sende den Beispiel Code[An] Master
 delay(1000);
 sendCode("000100001000110101110011"); // sende den Beispiel Code[Aus] Master
 delay(1000);
}

void sendCode(char code[]){ // empfange den Code in Form eines Char[]

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

void sendByte(char i) { //Diese Funktion soll 0,1 oder x senden koennen. Wir speichern die gewuenschte Ausgabe in der Variabel i

 switch(i){ //nun gucken wir was i ist
 case '0':
   { // Der Code fuer '0'
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(1000);
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(500);
     return;
   }
 case '1':
   { // Der Code fuer '1'
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(500);
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(1000);
     return;
   }
 case 'x':
   { // Der Code fuer x(sync)
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(3000);
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(7000);
   }
 }
}

 

Dekodierte Funksteckdosen

PowerFix Aussen-

Funksteckdosen

Tevion

Funksteckdosenset 2010

Tevion

Funksteckdosenset 2012

 

Codes für PowerFix Aussen-Funksteckdosen

 
Funktion Code
AON 000111011111011010100011
AOFF 000100001000110101110011
BON 000110001011110011001010
BOFF 000110010101011110111010
CON 000110010101011110111010
COFF 000100011100001011100001
DON 000110111010101100101000
DOFF 000101100010000000001000
MASTERON 000110101101100111011101
MASTEROFF 000100011100001011101101

 

boolean sendCode(char code[]){ //empfange den Code in Form eines Char[]

 for(short z = 0; z<6; z++){ //wiederhole den Code 6x
   for(short i = 0; i<24; i++){ //ein Code besteht aus 24bits
     sendByte(code[i]);
   }
   sendByte('x'); //da der code immer mit x/sync abschliesst, brauchen wir den nicht im code und haengen es automatisch 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){ //nun gucken wir was i ist
 case '0':
   { //Der Code fuer '0'
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(1000);
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(500);
     return;
   }
 case '1':
   { //Der Code fuer '1'
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(500);
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(1000);
     return;
   }
 case 'x':
   { //Der Code fuer x(sync)
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(3000);
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(7000);
   }
 }
}

 

Codes für Tevion Funksteckdosenset 2010

Diese Funksteckdose zeigt eine etwas andere Codierung. Hier gibt es ein Intro Bitmuster (20bit) mit einem weiteren Bitmuster (19bit), welches dreimal wiederholt wird.

Taste Code Intro Code
MASTERON 10111111111111110000 0111111111111100001
MASTEROFF 10111111111111100001 0111111111111110000
1ON 10111111111100010001 0111111111100010001
1OFF 10111111111100000000 0111111111100000000
2ON 10111111111110010011 0111111111110010011
2OFF 10111111111110000010 0111111111110000010
3ON 10111111111111010010 0111111111111010010
3OFF 10111111111111000011 0111111111111000011
4ON 10111111111101010000 0111111111101010000
4OFF 10111111111101000001 0111111111101000001

 

boolean sendCode(char intro[], char code[]){ //empfange den Code in Form von zwei Char[]

 sendByte('x');
 for(short i = 0; i<20; i++){ //ein Code besteht aus 20bits
   sendByte(intro[i]);
 }
 sendByte('x');
 for(short z = 0; z<3; z++){ //wiederhole den Code 3x
   for(short i = 0; i<19; i++){ //ein Code besteht aus 19bits
     sendByte(code[i]);
   }
   sendByte('x');
   }
 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){ //nun gucken wir was i ist
 case '0':
   { //Der Code fuer '0'
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(650);
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(1500);
     return;
   }
 case '1':
   { //Der Code fuer '1'
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(1300);
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(800);
     return;
   }
 case 'x':
   { //Der Code fuer t(sync)
     digitalWrite(rc_pin,LOW);
     delay(40);
     digitalWrite(rc_pin,HIGH);
     delay(42);
     return;
   }
 }
}

 

Codes für Tevion Funksteckdosenset 2012

Funktion Code
AON 000111011111011010100011
AOFF 000100001000110101110011
BON 000110001011110011001010
BOFF 000110010101011110111010
CON 000110010101011110111010
COFF 000100011100001011100001
DON 000110111010101100101000
DOFF 000101100010000000001000
MASTERON 000110101101100111011101
MASTEROFF

000100011100001011101101

 

boolean sendCode(char code[]){ //empfange den Code in Form eines Char[]

 for(short z = 0; z<6; z++){ //wiederhole den Code 6x
   for(short i = 0; i<24; i++){ //ein Code besteht aus 24bits
     sendByte(code[i]);
   }
   sendByte('x'); //da der code immer mit x/sync abschliesst, brauchen wir den nicht im code und haengen es automatisch 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){ //nun gucken wir was i ist
 case '0':
   { //Der Code fuer '0'
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(1000);
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(500);
     return;
   }
 case '1':
   { //Der Code fuer '1'
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(500);
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(1000);
     return;
   }
 case 'x':
   { //Der Code fuer x(sync)
     digitalWrite(rc_pin,HIGH);
     delayMicroseconds(3000);
     digitalWrite(rc_pin,LOW);
     delayMicroseconds(7000);
   }
 }
}