Viele kennen rc-switch die Arduino Library um Funksteckdosen via 433 Mhz zu schalten.
Nun habe ich kürzlich Kerzen gesehen, die auch mit einem Handsender der auf 433 Mhz sendet an- und ausgeschalten werden können. Leider habe ich nirgendwo eine Dokumentation gefunden, wo die Übertragung nachzulesen ist. Auf dem Handsender steht lediglich Typ QL3957 mit dem ich allerdings auch nicht viel anfangen konnte.

IMG_20141223_192100.jpg IMG_20141223_192122.jpg

Also entschloss ich mich die Codes vom Handsender selber mit einem billigen 433Mhz Receiver und einem digitalen Speicheroszilloskop auszulesen und einen Arduino Sketch zu schreiben.
Für die an- und ausschalt Funktionen habe ich folgende Codesequenzen aufgezeichnet:

Kerzen-433-aus.png

Kerzen-433-ein.jpg

Es lässt sich eine Manchester Codierung vermuten und daraus ergibt sich folgende Bit Folge:
Ausschalt Sequenz: 010101010101010100110000 (24 Bit)
Einschalt Sequenz: 010101010101010100000011 (24 Bit)
Die Pulslängen betragen:
Langer Puls: 500 µS
Kurzer Puls: 200 µS
Am Anfang muss ein Low Signal, dass 4080 µS lang ist gesendet werden und am Schluss nochmals das Bit 0.
Mit folgendem Code lassen sich die Kerzen ein und ausschalten (der Code gewinnt sicher keinen Schönheitswettbewerb 🙂 )

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#define longPulse 500
#define shortPulse 200
int senderPin = 10;
char* CandleOn  = "010101010101010100000011";
char* CandleOff = "010101010101010100110000";
void send0()
{
  // Sends a 0 Bit
  //            _
  // Waveform: | |__
  digitalWrite(senderPin, HIGH);
  delayMicroseconds(shortPulse);
  digitalWrite(senderPin, LOW);
  delayMicroseconds(longPulse);
}
void send1()
{
  // Sends a 1 Bit
  //            __
  // Waveform: |  |_
  digitalWrite(senderPin, HIGH);
  delayMicroseconds(longPulse);
  digitalWrite(senderPin, LOW);
  delayMicroseconds(shortPulse);
}
void sendCandleCode(char* code)
{
  for(int i=0;i<3;i++) // send the code 3 times
  {
    delayMicroseconds(4080); //wait a minimum of 4080 uS
    for(int i=0; i< 24;i++)
    {
      if(code[i] == '0') send0();
      if(code[i] == '1') send1();
    }
    send0();
  }
}
void setup()
{
  pinMode(senderPin, OUTPUT);
}
void loop()
{
  sendCandleCode(CandleOn);
  delay(5000);
  sendCandleCode(CandleOff);
  delay(5000);
}