Fjernstyring af RF 433mhz stikkontakter


Hej igen,

I mit sommerhus havde jeg behov for, at kunne tænde for 3 el-radiatorer hjemmefra,
men jeg kunne kun finde 1000 Watts fjernbetjente stikkontakter og mine el-radiatorer var alle over 1500 Watt.
Jeg fandt så nogle 2300 Watts selvlærende stikkontaker hos JULA i Sverige (se billede).



Jeg har senere fundet ud af, at man kan købe dem i Danmark hos Komplett og Dustin under navnet PROOVE.

Jeg kunne ikke finde noget Arduino Library til at styre dem, så jeg måtte i gang med en hjemmelavet RF sniffer. Man kan finde mange eksempler på nettet på, hvordan en sniffer laves. Min var lavet med en RF433 modtager, et par modstande og et mini jack stik til lydindgangen på min PC. Jeg brugte Audacity til at sniffe en fjernbetjening (se billede).



Det lykkedes at afkode en fjernbetjening, dog uden at gennemskue protokollen, men det virkede.
Min oprindelige kode så således ud (er kun et udsnit fra min MEGA webserver):

Kode:
#define RF_DATA_PIN 30
#define SHORT_DELAY 250 
#define LONG_DELAY  (5*SHORT_DELAY)
#define START_DELAY  (10*SHORT_DELAY)
#define END_DELAY    (40*SHORT_DELAY)
#define TOTAL_DELAY (8*SHORT_DELAY)
#define SYNC_DELAY  (29*SHORT_DELAY)

void rf_send(char* sCodeWord) {

  for (int nRepeat=0; nRepeat<4; nRepeat++) {
  int i = 0;
  while (sCodeWord[i] != '\0') {
    switch(sCodeWord[i]) {
      case 'E':
        digitalWrite(RF_DATA_PIN, HIGH);
        delayMicroseconds(SHORT_DELAY);
        digitalWrite(RF_DATA_PIN, LOW);
        delayMicroseconds(END_DELAY);
        break;
      case 'S':
        digitalWrite(RF_DATA_PIN, HIGH);
        delayMicroseconds(SHORT_DELAY);
        digitalWrite(RF_DATA_PIN, LOW);
        delayMicroseconds(START_DELAY);
        break;
      case '1':
        digitalWrite(RF_DATA_PIN, HIGH);
        delayMicroseconds(SHORT_DELAY);
        digitalWrite(RF_DATA_PIN, LOW);
        delayMicroseconds(SHORT_DELAY);
        break;
        case '0':
          digitalWrite(RF_DATA_PIN, HIGH);
          delayMicroseconds(SHORT_DELAY);
          digitalWrite(RF_DATA_PIN, LOW);
          delayMicroseconds(LONG_DELAY);
        break;
      }
      i++;
    } 
    delayMicroseconds(SYNC_DELAY);
  }   
}

void socketSwicth(int id, int stat) {
  Serial.print("ID: ");
  Serial.println(id);
  Serial.print("Stat: ");
  Serial.println(stat);
   switch(id) {
     case 0:
       if (stat==1) {
         rf_send("S1001101001011010100110011001010101010101010101010110100101010101E");
       } else {
         rf_send("S1001101001011010100110011001010101010101010101010110101001010101E");
       }
       break;
     case 1:
       if (stat==1) {
         rf_send("S1001101001011010100110011001010101010101010101010110100101010110E");
       } else {
         rf_send("S1001101001011010100110011001010101010101010101010110101001010110E");
       }
       break;
     case 2:
       if (stat==1) {
         rf_send("S1001101001011010100110011001010101010101010101010110100101011001E");
       } else {
         rf_send("S1001101001011010100110011001010101010101010101010110101001011001E");
       }
       break;
/*     case 3:
       if (stat==1) {
         rf_send("S1001101001011010100110011001010101010101010101010110100101010110E");
       } else {
         rf_send("S1001101001011010100110011001010101010101010101010110101001010110E");
       }
       break; */
     case 9:
       if (stat==1) {
         rf_send("S1001101001011010100110011001010101010101010101010110010101010101E");
       } else {
         rf_send("S1001101001011010100110011001010101010101010101010110011001010101E");
       }
     break;
   }
}


Senere faldt jeg over et Svensk site, hvor protokollen var beskrevet og der var endda et eksempel på kode.

Ud fra protokolspecifikationen er det lykkedes mig, at lave et library til Arduino (kan downloades på https://github.com/mortensalomon/Socket_Switch).

Herunder kan du finde et eksempel på hvordan det virker.

Du skal bruge:

6 stk. 10K modstande
6 stk. push buttons
En RF 433 mhz sender
En håndfuld jumper kabler.

Jeg køber alt i Kina via. ebay.com

Det skal sættes sammen som på fritzing tegningen nedenfor:



Koden til at styre det hele:

Kode:
#include <Socketswitch.h>

Socketswitch mySwitch(12);

void setup() {
  // Set device base address (0x0 - 0xFFFFFF). Device is a group of 16 channels (16 RF Socket Switches)
  mySwitch.setDevice(0x34FCFF);
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH); // VCC til RF modulet
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  Serial.begin(9600);
}

void loop() {
  // Device channel 0-15
  if (digitalRead(2) == HIGH) {
    mySwitch.channelOn(0);
    Serial.println("0 on");
  } else if (digitalRead(3) == HIGH) {
    mySwitch.channelOff(0);
    Serial.println("0 off");
  } else if (digitalRead(4) == HIGH) {
    Serial.println("1 on");
    mySwitch.channelOn(1);
  } else if (digitalRead(5) == HIGH) {
    Serial.println("1 off");
    mySwitch.channelOff(1);
  } else if (digitalRead(6) == HIGH) {
    mySwitch.groupOn();
    Serial.println("G on");
  } else if (digitalRead(7) == HIGH) {
    Serial.println("G off");
    mySwitch.groupOff();
  }
}

Eksempel på, hvad det kan bruges til:

I mit sommerhus har jeg en Arduino MEGA med et ethernet shield, hvor jeg har programmeret en webserver, så jeg kan tænde/slukke stikkontakterne hjemmefra.
   
På MEGAen sidder også et 2.4ghz modul som får temperatur/luftfugtighed (DS18B20 og DHT22) fra 4 Arduino mini pro'er (RF24Network).
Udover de 4 trådløse følere har jeg 7 følere på kabel (Se billeder).




Følerne er indsat i patch kabel samlinger (billede nedenfor) og er derfor nemme at tilpasse i længden med patch kabler af forskellig længde. DS18B20'erne bruger de samme 3 ledninger (+/- /data) fra start til slut via. 1-wire.



Fremtiden:

Når jeg får tid, vil jeg tilføje mulighed for, i Arduino Library'et, at afkode (via. en RF 433mhz modtager) signalet fra en fjernbetjening.