Funksteckdose mit Lernfunktion

Mahlzeit,

ich bin dabei mit einem Leonardo meine Funksteckdosen zu programmieren.

Ich habe bisher das Signal der Fernbedienung ausgelesen und dabei ist folgendes raus gekommen:

[u]Schalter D ein[/u]

Als Decimal Zahl wir deine 86037 ( 24 Bit) gesendet. Die Puls Länge beträgt 331µs.

Daraus resultiert eine Abfolge von: 000000010101010000010101

Nun müsste ich ja genau diese Abfolge bzw Zahl senden können und damit die Steckdose anlernen/schalten.

Nun kann ich doch nicht einfach eine "long" Zahl als 86037 senden. Die Pulslänge muss ja auch noch übereinstimmen. Und da meine Frage : Die Pulslänge ist auf das ganze Signal bezogen ?! & wie deklariere ich im Sketch eine Pulslänge ?

Vielen Dank und lieben Gruß

Crazy Rider

CrazyRider: Daraus resultiert eine Abfolge von: 000000010101010000010101

Nun müsste ich ja genau diese Abfolge bzw Zahl senden können und damit die Steckdose anlernen/schalten.

Ja.

Am besten nimmst Du zum Senden des Codes dieselbe Library, die jemand anderes geschrieben und die Du aus dem Internet kopiert hast, wie Du zum Auslesen eine Library verwendet hast, die jemand anderes geschrieben und die Du aus dem Internet kopiert hast.

Dann dürfte die Folge von Nullen und Einsen soweit kompatibel sein, dass es funktioniert.

Eine Folge von Nullen und Einsen nützt Dir nämlich nichts, wenn Du die Bedeutung der Nullen und Einsen innerhalb des Sendeprotokolls nicht kennst.

jurs: Eine Folge von Nullen und Einsen nützt Dir nämlich nichts, wenn Du die Bedeutung der Nullen und Einsen innerhalb des Sendeprotokolls nicht kennst.

bzw nicht weißt, wie diese beim Senden codiert werden. Grüße Uwe

Gut das habe ich bisher schon mehrfach Probiert, leider ohne Erfolg.

Ich habe eine Standart Fernbedienung die wie folgt aufgebaut ist :

S A S
S B S
S C S
S D S

on off

Wo bei S den Schalter ( Taster darstellen soll).

Ich benutze die Library RCswitch.h

Ich habe auch dort ein Beispiel gefunden welches zumindest annähernd zutreffen könnte. Die Puls Länge lässt sich auch deklarieren.

/*
  Example for REV outlets (e.g. 8342L)
  
  http://code.google.com/p/rc-switch/
  
  Need help? http://forum.ardumote.com
*/

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  // Transmitter is connected to Arduino Pin #10  
  mySwitch.enableTransmit(10);
  
  // set pulse length.
  mySwitch.setPulseLength(331);
  
}

void loop() {

  // Switch on:
  // The first parameter represents the channel (a, b, c, d)
  // The second parameter represents the device number
  // 
  // In this example it's family 'd', device #2 
  mySwitch.switchOn('d', 2);

  // Wait a second
  delay(1000);
  
  // Switch off
  mySwitch.switchOff('d', 2);
  
  // Wait another second
  delay(1000);
  
}

So nun soll ja hier im Beispiel von der Familie D der Schalter 2 eingeschaltet werden und danach wieder aus. Also so als wäre ich mit meinem Finger 1sek. auf dem Taster und würde dann wieder für 1sek. loslassen?

Denn sonst würde ja reichen wenn er schreibt: mySwitch.switchOn (‘d’)
und zum ausschalten mySiwtch.switchOff (‘d’)

Wozu die 2 dahinter?

Ich habe schon daran gedacht, dass ich vielleicht eine Steckdose mit einer anderen Codierung wie wahrscheinlich üblich habe und dadurch keine Kommunikation zustande kommt. Aber mit der selben Library habe ich ja auch die Fernbedienung ausgelesen.

Ansonsten bleibt mir wohl nix über als mit einem Logik-Analysator bzw ähnlichem den Code auszulesen.

Mfg und vielen Dank

Um euch nicht zu langweilen, Ich wieder :wink:

Habe jetzt einen Sketch gefunden und nach meinem Anliegen umgeschrieben womit es eigentlich passen sollte. Sicherhaltshalber nochmal Puls Länge und Protokoll deklariert und ab damit.

Nur leider ohne Erfolg. Woran liegts?

/*
  Example for different sending methods
  
  http://code.google.com/p/rc-switch/
  
*/

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  Serial.begin(9600);
  
  // Transmitter is connected to Arduino Pin #10  
  mySwitch.enableTransmit(10);
  mySwitch.setPulseLength (331); 
  mySwitch.setProtocol(1);  
  mySwitch.setRepeatTransmit (15); 
  

  // Optional set pulse length.
  // mySwitch.setPulseLength(320);
  
  // Optional set protocol (default is 1, will work for most outlets)
  // mySwitch.setProtocol(2);
  
  // Optional set number of transmission repetitions.
  // mySwitch.setRepeatTransmit(15);
  
}

void loop() {


  /* Same switch as above, but using binary code */
  mySwitch.send("000000010101000100010101");
  delay(50);  
  mySwitch.send("000000010101000100010101");
  delay(50);

}

Ich benutze auch RCSwitch für meine Funksteckdosen. Ich habe nämlich auch welche die auf A,B,C oder D eingestellt werden können.

Bei mir funktionieren diese einwandfrei wenn ich einfach dies

RCsender.switchOn (01010, 1);

im Code aufrufe.
Hierbei stehen die ersten 5 Zahlen in der Klammer für den Sendecode (wie der in der Fernbedienung) und die 2. Zahl (von 1 bis 4) für den Stecker. Dabei ist 1 = A, 2 = B, 3 = C und 4 = D.

Hier ein Beispiel Code

#include <RCSwitch.h>

RCSwitch RCsender = RCSwitch();

void setup() {
RCsender.enableTransmit(40);          //Arduino Pin #40
RCsender.setRepeatTransmit(15);
}

void loop() {
RCsender.switchOn (00000, 1);
delay(1000);
RCsender.switchOff (00000, 1);
}

CrazyRider: Ich habe eine Standart Fernbedienung die wie folgt aufgebaut ist :

S A S S B S S C S S D S

on off

Wo bei S den Schalter ( Taster darstellen soll).

So, allmählich fängst Du damit an rüberzukommen, was Du da eigentlich hast.

Steht vielleicht auch irgendeine Marken- und/oder Typenbezeichnung an der Fernbedienung dran?

Hat die Fernbedienung eine kleine Klappe (ggf. im Batteriefach), hinter der irgendwas an einem DIP- oder Dreh-Schalter als Codierung einstellbar ist?

CrazyRider: Ich benutze die Library RCswitch.h

Aha. Zu der Library gehören mindestens zwei Receive-Sketches: ReceiveDemo_Simple und ReceiveDemo_Advanced.

Wenn Du die Schalter betätigst, mit denen Du eine Funksteckdose schalten kannst: - Welche Ausgabe bekommst Du von ReceiveDemo_Simple? - Welche Ausgabe bekommst Du von ReceiveDemo_Advanced?

Wenn das Sendeprotokoll erkannt wird, sollte das klar vom Empfangs-Sketch gemeldet werden.

Und dann hast Du normalerweise alle notwendigen Angaben, um damit einen der Sende-Sketches zu füttern. Wobei dann üblicherweise ein geeigneter Sender angeschlossen werden muss, üblicherweise ein 433 MHz ASK/OOK Sender. Um "Reichweite" zu machen, muß am Sendemodul eine geeignete Antenne am "Ant" Anschluß angeschlossen werden. Zum Testen ohne Antenne am Sender sollte die Funksteckdose nur ca. 0,5 bis 2 m entfernt vom Sender betrieben werden.

CrazyRider: Ich habe schon daran gedacht, dass ich vielleicht eine Steckdose mit einer anderen Codierung wie wahrscheinlich üblich habe und dadurch keine Kommunikation zustande kommt. Aber mit der selben Library habe ich ja auch die Fernbedienung ausgelesen.

Im wesentlichen gibt es bei 433MHz-Steckdosen zwei verschiedene Systeme. Wenn Du mit der RCSwitch-Library das Protokoll und die Bits auslesen kannst, solltest Du eine geeignete Library auch zum Senden haben, und falls es nicht funktioniert, liegt es am falschen Handling der Arduino- oder Sender-Hardware oder des Sende-Sketches.

Es ist auch gar nicht notwendig die Dezimale- Codierung ins Binäre aufzuschlüsseln. Die RCSwitch.h- Lib bringt dir doch gleich eine Funktion mit, mittels derer du auch die ermittelte Dezimal-Zahl senden kannst. Mit Angabe der Bits natürlich. Wenn du die Advanced_Receive_Demo ausführst, brauchst du einfach nur die ermittelten Daten, also die Codierung der Dose, die Bit, und das entsprechende Sendeprotokoll zu nehmen und in die einfache Send-Demo einsetzen. Dann dürfte bei dir das Licht ausgehen, so zumindestens funktioniert es bei mir.

lg Patrick