Funksteckdosen auslesen und Signale selber senden

Hallo Forum,
ich hätte nicht gedacht das ich Probleme mit der Programmierung bekomme, aber weil meine frau jetzt langsam mit dem Abendbrot drängelt wende ich mich vertrauensvoll an euch:

Wie bereits in anderen Topics beschrieben, wollte ich gerne 220Volt Geräte mit Hilfe von Arduino schalten, weil mir aber Relais einfach zu unsicher sind (bin halt eher mit Holzspielzeug aufgewachsen) habe ich mich für die Variante mit den Funksteckdosen entschieden.
Ich habe mir bei COnrad http://www.conrad.de/ce/de/product/130428/SENDE-EMPFAeNGERMODULSET-433MHZ/SHOP_AREA_17364&promotionareaSearchDetail=005 ein Set bestehend aus Empfänger und Sender für 433Mhz Geräte gekauft. Und passend dazu ein Set aus 3 Funksteckdosen-die auch alle 3 wunderbar funktionieren.
Das Auslesen der Fernbedienung scheint zu funktionieren, dazu verwende ich den Code:

/*
* Demo for RF remote switch receiver.
* For details, see RemoteReceiver.h!
*
* This sketch shows the received signals on the serial port.
* Connect the receiver to digital pin 2.
*/

#include <RemoteReceiver.h>

void setup() {
  Serial.begin(115200);
  
  // Initialize receiver on interrupt 0 (= digital pin 2), calls the callback "showCode"
  // after 3 identical codes have been received in a row. (thus, keep the button pressed
  // for a moment)
  //
  // See the interrupt-parameter of attachInterrupt for possible values (and pins)
  // to connect the receiver.
  RemoteReceiver::init(0, 3, showCode);
}

void loop() {
}

// Callback function is called only when a valid code is received.
void showCode(unsigned long receivedCode, unsigned int period) {
  // Note: interrupts are disabled. You can re-enable them if needed.
  
  // Print the received code.
  Serial.print("Code: ");
  Serial.print(receivedCode);
  Serial.print(", period duration: ");
  Serial.print(period);
  Serial.println("us.");
}

Als Ergebnis erhalte ich folgenden Code:

Code: 722, period duration: 321us. (= ON)
Code: 726, period duration: 280us. (=OFF)

So schön so gut, leider habe ich jetzt aber keine Ahnung und leider auch nichts entsprechendes gefunden (mit dem ich was anfangen kann)

Nutze ich den RCSwitch-Code passiert gar nichts, dabei weiß ich aber nicht einmal wo ich da den Pin einstellen soll.

/*
  Example for receiving
  
  http://code.google.com/p/rc-switch/
  
  If you want to visualize a telegram copy the raw data and 
  paste it into http://test.sui.li/oszi/
*/

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  Serial.begin(9600);
  mySwitch.enableReceive(0, output);

}

void loop() {

}

void output(unsigned long decimal, unsigned int length, unsigned int delay, unsigned int* raw) {

  if (decimal == 0) {
    Serial.print("Unknown encoding.");
  } else {
    char* b = dec2binWzerofill(decimal, length);
    Serial.print("Decimal: ");
    Serial.print(decimal);
    Serial.print(" (");
    Serial.print( length );
    Serial.print("Bit) Binary: ");
    Serial.print( b );
    Serial.print(" Tri-State: ");
    Serial.print( bin2tristate( b) );
    Serial.print(" PulseLength: ");
    Serial.print(delay);
    Serial.println(" microseconds");
  }
  
  Serial.print("Raw data: ");
  for (int i=0; i<= length*2; i++) {
    Serial.print(raw[i]);
    Serial.print(",");
  }
  Serial.println();
  Serial.println();
}


static char* bin2tristate(char* bin) {
  char returnValue[50];
  int pos = 0;
  int pos2 = 0;
  while (bin[pos]!='\0' && bin[pos+1]!='\0') {
    if (bin[pos]=='0' && bin[pos+1]=='0') {
      returnValue[pos2] = '0';
    } else if (bin[pos]=='1' && bin[pos+1]=='1') {
      returnValue[pos2] = '1';
    } else if (bin[pos]=='0' && bin[pos+1]=='1') {
      returnValue[pos2] = 'F';
    } else {
      return "not applicable";
    }
    pos = pos+2;
    pos2++;
  }
  returnValue[pos2] = '\0';
  return returnValue;
}



static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength){
  static char bin[64]; 
  unsigned int i=0;

  while (Dec > 0) {
    bin[32+i++] = (Dec & 1 > 0) ? '1' : '0';
    Dec = Dec >> 1;
  }

  for (unsigned int j = 0; j< bitLength; j++) {
    if (j >= bitLength - i) {
      bin[j] = bin[ 31 + i - (j - (bitLength - i)) ];
    }else {
      bin[j] = '0';
    }
  }
  bin[bitLength] = '\0';
  
  return bin;
}

Ich bitte um Hilfe bzw. auch gerne um ein Tutorial in dem das erklärt ist, wenn ich das alles hinbekommen haben sollte bin ich auch gerne bereit selber eines zu schreiben.
mfg und einen schönen Sonntag Abend
Balli

Okay, nun funktioniert auch der RCSwitch-Code, ein Kabel war einfach zu locker....

Wenn ich den RCSwitch, die Demo nutze bekomme ich folgende Ausgabe:

Decimal: 1361 (24Bit) Binary: 000000000000010101010001 Tri-State: 000000FFFF0F PulseLength: 321 microseconds Raw data: 9960,276,1008,276,1000,280,1008,276,1004,276,1004,280,1004,276,1008,276,1004,276,1008,276,1004,280,1004,276,1008,276,1004,920,368,276,1004,924,368,272,1012,916,372,272,1008,920,372,272,1012,268,1008,276,1008,920,368

Wenn ich nun die Sendvariante nutze:

Verwende ich sicherlich

  mySwitch.send(5393, 24);
  Serial.print("ist ON");
  delay(10000);  
  mySwitch.send(5396, 24);
   Serial.print("is OFF");
  delay(10000);

Wobei die 5393 gegen die Werte für ON (5393) und OFF(5396) stehen und 24, weil es eine 24 Bit-Codierung ist. Soweit sogut, nur leider passiert bei mir gar nichts. Am liebsten würde ich jetzt fragen-Wieso? Doch ich weiß das eine Ferndiagnose da wahrscheinlich nicht funktioniert. Kann mir eventuell jemand Tipps geben woran es liegen könnte? Was ich noch überprüfen sollte (kabel sind dieses mal wirklich fest*G*)!?! mfg Balli p.s. Abendbrot fällt heute eventuell flach

Guten Morgen Forum,
Nach einer langen nacht ist mir aufgefallen, das beim betätigen der Fernbedienung neben den decimal und binary Codes noch undefinierte RAW Codes gesendet werden. Kann es sein, das noch eine Art der Verschlüsselung stattfindet bzw. noch weitere Werte mit übergeben werden müssen?
Mfg und eine schöne Woche wünschend
Balli

Da steht Decimal 1361, wie kommst du dann auf 5393? Was sind das fuer Steckdosen? Evt. kannst Du die wie hier beschrieben mit switchon() und switchoff() steuern... http://code.google.com/p/rc-switch/wiki/HowTo_OperateLowCostOutlets

Die undefinierten rawcodes sind am wahrscheinlichsten durch stoersignale o.a. Bedingt.

Das 1361 kommt von einer anderen Steckdose. Den Link schaue ich mir sofort an. Mfg balli

Also nachdem ich jetzt festgestellt habe das ich im Besitz der Type A Steckdosen bin habe ich dementsprechend mein Versuch umgebaut.
Leider ohne Erfolg, daraufhin habe ich einfach mal die gesendeten Informationen ausgewertet. Dieses führt zu falschen gesendeten Daten obwohl ich mich da (meines erachtens) an den Code gehalten habe.

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  // Transmitter is connected to Arduino Pin #10  
  mySwitch.enableTransmit(10);
  mySwitch.enableReceive(0, output);
  
}

void loop() {

  mySwitch.switchOn("11111", 4);

  // Wait a second
  delay(10000);
  
  // Switch off
  mySwitch.switchOff("11111", 4);
  
  // Wait another second
  delay(10000);
  
   mySwitch.send(5393, 24);
  delay(1000);  
  mySwitch.send(5396, 24);
  delay(1000); 
  
}


void output(unsigned long decimal, unsigned int length, unsigned int delay, unsigned int* raw) {

  if (decimal == 0) {
    Serial.print("Unknown encoding.");
  } else {
    char* b = dec2binWzerofill(decimal, length);
    Serial.print("Decimal: ");
    Serial.print(decimal);
    Serial.print(" (");
    Serial.print( length );
    Serial.print("Bit) Binary: ");
    Serial.print( b );
    Serial.print(" Tri-State: ");
    Serial.print( bin2tristate( b) );
    Serial.print(" PulseLength: ");
    Serial.print(delay);
    Serial.println(" microseconds");
  }
  
  Serial.print("Raw data: ");
  for (int i=0; i<= length*2; i++) {
    Serial.print(raw[i]);
    Serial.print(",");
  }
  Serial.println();
  Serial.println();
}


static char* bin2tristate(char* bin) {
  char returnValue[50];
  int pos = 0;
  int pos2 = 0;
  while (bin[pos]!='\0' && bin[pos+1]!='\0') {
    if (bin[pos]=='0' && bin[pos+1]=='0') {
      returnValue[pos2] = '0';
    } else if (bin[pos]=='1' && bin[pos+1]=='1') {
      returnValue[pos2] = '1';
    } else if (bin[pos]=='0' && bin[pos+1]=='1') {
      returnValue[pos2] = 'F';
    } else {
      return "not applicable";
    }
    pos = pos+2;
    pos2++;
  }
  returnValue[pos2] = '\0';
  return returnValue;
}



static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength){
  static char bin[64]; 
  unsigned int i=0;

  while (Dec > 0) {
    bin[32+i++] = (Dec & 1 > 0) ? '1' : '0';
    Dec = Dec >> 1;
  }

  for (unsigned int j = 0; j< bitLength; j++) {
    if (j >= bitLength - i) {
      bin[j] = bin[ 31 + i - (j - (bitLength - i)) ];
    }else {
      bin[j] = '0';
    }
  }
  bin[bitLength] = '\0';
  
  return bin;
}

Das Terminal gibt mir dann folgene Raws aus:

Unknown encoding.Raw data: 11308,1452,1452,1448,1452,1448,1448,1452,1448,1452,1448,1448,1452,1448,1452,1448,1452,1448,1448,1456,1444,1456,1444,1448,1452,

Unknown encoding.Raw data: 11308,1456,1448,1452,1448,1456,1444,1448,1452,1448,1452,1448,1448,1456,1444,1456,1444,1456,1444,1448,1456,1448,1452,1448,1444,

Unknown encoding.Raw data: 11308,1452,1452,1452,1452,1448,1444,1456,1444,1456,1448,1452,1448,1448,1452,1448,1452,1448,1448,1452,1448,1452,1448,1456,1444,

Unknown encoding.Raw data: 11312,1452,1448,1456,1444,1456,1444,1448,1452,1452,1452,1448,1452,1448,1444,1456,1448,1452,1448,1448,1452,1448,1452,1448,1452,

Ich bin jetzt langsam am Ende, denn ich gehe davon aus, das der Anschluss von Empfänger und Sender funktioniert.
Danke für eure Geduld mit mir.

Okay , es scheint jetzt mal zu funktionieren und mal nicht zu funktionieren, in Abhängigkeit wie dicht ich mit meinem Handy am Arduino bin....okay, das schien nur Glück gewesen zu sein. Es ist jetzt zweimal an und wieder aus gegangen, völlig zufällig, nachdem das ganze jetzt 5 Minuten läuft. Jetzt passiert gar nichts mehr, nachdem ich Handy, WLan und Co ausgestöpselt habe....Es ist doch echt schrecklich....

Hallo Forum, ich möchte noch einmal versuchen mein Problem zusammen zufassen: Ich habe mir Funksteckdosen gekauft und ein passendes Sender/Empfänger-Set von Conrad (433MHz). Der Empfänger arbeitet auch wie er soll und wie es in den Tutorials beschrieben ist. Nur leider haut das Senden nicht hin. Es hat jetzt 4-5 mal innerhalb einer kurzen Zeitspanne geklappt, jedoch nicht dauerhaft. Wenn ich Sender und Empfänger an ein Arduino schließe und mir Dinge zusende, gibt der Empfänger nur "Murks" aus. Jedoch ist es so das der Empfänger so oder so Dinge empfängt wenn Empfang und Sende-Code auf dem Arduino aufgespielt ist. Auch wenn WLan, Handy und sonstige Funkgeräte in der Wohnung aus sind. Letztendlich suche ich nach einer Fehlerquelle oder die Ursache die dazuführt das meine Geschichte nicht arbeitet. mfg Balli Eventuell habe ich selber einen Fehler gefunden, in der beschreibung zum Sendermodul steht: Anschluss 3....12Volt. Nun betreibe ich den Sender an einer Spannungsquelle von 5 V, sollte cih hier noch etwas dazwischen schalten?