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:
|
Arduino |
Kabel Cinch - Klinke |
Zusammengebaut kann das dann so aussehen
Anschluss des Empfängers (von links)
- GND
- leer
- weißer Cinch Stecker
- +5V
- +5V
- GND
- GND
- leer
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);
}
}
}














