Funkmorsen an die Steckdose

Vorbemerkungen

Die Funksteckdosen haben einen eigenen „Morsecode“ - den man erst mal rauskriegen muss. Das kann man z.B. mit der Soudkarte und einem Aufnahmeprogramm machen.

http://www.dserv01.de/howtos/funksteckdose-fernsteuern-mit-arduino/

Der Sender

Der Code, um eine Steckdose anzusteuern, besteht aus 12 „Zeichen“ – 0 und 1 – die jeweils mit 8 Bit (HIGH/LOW) codiert sind. Das Ende eines Codes wird durch ein „Sync-Signal“ markiert (x). Dieses Sync-Signal besteht aus 32bit, wie in der Tabelle zu sehen ist. Die einzelnen „Zeichen“ sind ca 2.8ms lang, ein Bit dauert etwa 350us:

Code-Zeichen	Bitfolge	Erklärung
0	10001110	8bits zu 350us insgesamt 2.8ms
1	10001000	8bits zu 350us insgesamt 2.8ms
x	100000000000000000000000000000000	32bits zu 350us insgesamt 11.2ms

Jetzt kann man für jede Taste einen Code bilden, die 0 und 1 in der folgenden Tabelle stehen für die Code-Zeichen (nicht für die einzelnen Bits).

On	Off
A	000111000010x	000111000001x
B	000110100010x	000110100001x
C	000110010010x	000110010001x
D	000110001010x	000110001001x

Man sieht, dass die ersten 10 Zeichen die Steckdose codieren, die letzten beiden Zeichen übermitteln die Information, ob die Steckdose an oder aus sein soll:

0001110000 10 x
Steckdosencode AN/AUS sync

Rohform erster Sketch: funksteckdose.ino.zip

// Funksteckdose Brennenstuhl RCS 1000N // mit einem Arduino Uno und einem 433 MHZ Modul // schalten. // // Original Ideen und Sketche: // CC-BY-NC Dominik Krupke // http://creativecommons.org/licenses/by-nc-sa/3.0/deed.de // http://www.dserv01.de/howtos/funksteckdose-fernsteuern-mit-arduino/ // // Modifiziert, verschandelt und angepasst: // Frank Schiebel 06/2016 // // Der Pin auf dem der Datenpin des 433MHz // Senders angeschlossen ist. short rc_pin=7; void setup() { // Datenpin fungiert als Ausgabepin pinMode(rc_pin, OUTPUT); } void loop() { sendCode("100011000001"); //sende den Beispiel Code[Aus] delay(2000); sendCode("100011000010"); //sende den Beispiel Code[An] delay(2000); } // ----------------- // Eigene Funktionen // ----------------- // // Sendet einen Steckdosencode // Eingabe: 12-stelliger Code, 10 Stellen Steckdose, zwei Stellen an/aus // Rueckgabe: true/false // boolean sendCode(const char code[]) { // Der Code wird 7 mal gesendet for(short z = 0; z<7; z++) { // Jeder Code besteht aus den übergebenen 12 Bit, die // einzeln gesendet werden. for(short i = 0; i<12; i++) { // Jedes Bit wird von der Funktion sendByte einzeln // über den 433 MHz Sender gesendet sendByte(code[i]); } // Jeder Code schließt mit x/sync ab. // Immer anhaengen! sendByte('x'); } return true; } // Diese Funktion soll 0,1 oder x senden koennen. // Die gewuenschte Ausgabe wird als Argument an die // Funktion uebergeben: // // sendByte(0); // sendet 0 // sendByte(1); // sendet 1 // sendByte(x); // sendet x als "Trennsignal" // // Die Funktion hat einen leeren (void) Rueckgabewert // In der Funktion wird die "Unterfunktion" wait // aufgerufen, die jeweils die uebergebene Anzahl // an 350 Mikrosekunden Intervallen wartet. void sendByte(char i) { switch(i){ // Wenn i=0 ist, wird der Code fuer '0' gesendet case '0':{ digitalWrite(rc_pin,HIGH); wait(1); //da die Pausen x*350us lang sind, machen wir daraus eine Funktion digitalWrite(rc_pin,LOW); wait(3); digitalWrite(rc_pin,HIGH); wait(3); digitalWrite(rc_pin,LOW); wait(1); return; } // Wenn i=1 ist, wird der Code fuer '1' gesendet case '1':{ //Der Code fuer '1' digitalWrite(rc_pin,HIGH); wait(1); digitalWrite(rc_pin,LOW); wait(3); digitalWrite(rc_pin,HIGH); wait(1); digitalWrite(rc_pin,LOW); wait(3); return; } // Wenn i=x ist, wird der Code fuer '1' gesendet case 'x':{ //Der Code fuer x(sync) digitalWrite(rc_pin,HIGH); wait(1); digitalWrite(rc_pin,LOW); wait(31); } } } // Wartet fuer x 350Mikrosekunden-Intervalle void wait(int x) { //warte x*350 Mikrosekunden delayMicroseconds(x*350); }