Go Down

Topic: library 434 MHz wireless control power socket (non-dimmable only) (Read 965 times) previous topic - next topic

picoPAN

Jun 28, 2013, 11:24 am Last Edit: Jul 01, 2013, 08:09 am by picoPAN Reason: 1
Hi guy,

recently I came to play around with these power sockets, you get to buy everywhere for little money.
They communicate over 434Mhz wireless.
I followed a tutorial by Dominik Krupke http://www.dserv01.de/howtos/funksteckdose-fernsteuern-mit-arduino/
.
It just worked out fine. (The non-dimmable sockets only!!! The dimmable ones operate with another protocol!)
For wiring up the sender, follow his instructions! Its is very straight forward.
Alternatively, use this datasheet:  http://www.sparkfun.com/datasheets/Wireless/General/MO-SAWR.pdf

On the basis of his tutorial and encrypted communication protocol I wrote a library for easy application in Arduino.

I hope, it helps you as much as it helped me!

Here is the header:
Code: [Select]
// library class header to control a wireless power socket
// set the binary encoding for identifier
// build control-stream for A, B, C, D: on and off

//use sender module http://www.sparkfun.com/datasheets/Wireless/General/MO-SAWR.pdf

// object instance call generates a power-socket object, taking the arguments VCC-pin, DATA-pin and a 5-bit indentifier prefix (32 different variations possible)
// library written by Paul Naethe, modified from original code by Dominik Krupke http://www.dserv01.de/howtos/funksteckdose-fernsteuern-mit-arduino/
// V 00.140.B  June 18th, 2013

#ifndef power_socket_h
#define power_socket_h

#include "Arduino.h"


class power_socket{
 
 private:
   void wait(int time);
   void sendByte(char input); //takes bit stream as a String, created from 5-bit indentifier prefix, channel and operation's mode postfix
   boolean sendCode(String code);
   void setChannel(char Channel);
   String _suffix;
   String _prefix;
   int rc_pin;
   int _vcc;        //
   int _overload;  //switches states for overloaded operation mode(s)
 
 public:
   power_socket(int VCC, int DATA, String prefix); //VCC and DATA pins, prefix a five-bit string e.g. 01001, as set at the socket.
   power_socket(int DATA, String prefix);          // overload constructor for permanent power supply on the VCC-pin, or operates the pin 12
   void init();                                    // needs to be called in the setup routine of the Arduino to set pins and serial connection
   void switchOn(char Channel);                    // takes a channel: A, B, C, D and operates the power socket
   void switchOff(char Channel);                   // takes a channel: A, B, C, D and operates the power socket
} ;
 
#endif


the source:
Code: [Select]
// library class header to control a wireless power socket
// set the binary encoding for identifier
// build control-stream for A, B, C, D: on and off

//use sender module http://www.sparkfun.com/datasheets/Wireless/General/MO-SAWR.pdf

// object instance call generates a power-socket object, taking the arguments VCC-pin, DATA-pin and a 5-bit indentifier prefix (32 different variations possible)
// library written by Paul Naethe, modified from original code by Dominik Krupke http://www.dserv01.de/howtos/funksteckdose-fernsteuern-mit-arduino/
// V 00.140.B  June 18th, 2013


#include "Arduino.h"
#include "power_socket.h"


power_socket::power_socket(int VCC, int DATA, String prefix){ //Prefix like "10001"

 rc_pin = DATA;
 _vcc = VCC;
 _prefix = prefix;
 _overload = 0;  
}

power_socket::power_socket(int DATA, String prefix){ //Prefix like "10001"
 
 rc_pin = DATA;
 _prefix = prefix;
_overload = 1;
}

void power_socket::init(){
 Serial.begin(9600);
 pinMode(13,OUTPUT);
 Serial.print("sensor connecting... data pin: ");
 pinMode(rc_pin, OUTPUT);
 Serial.println(rc_pin);
 
 if(_overload == 0){
 Serial.print("power pin: ");
 pinMode(_vcc, OUTPUT);
 Serial.println(_vcc);
 }
}

void power_socket::switchOn(char Channel){
 setChannel(Channel);
 String output = _prefix + _suffix + "10x" ;
 Serial.println(output);   //debugging
 sendCode(output);
}

void power_socket::switchOff(char Channel){
 setChannel(Channel);
 String output = _prefix + _suffix + "01x" ;
  Serial.println(output);   //debugging
 sendCode(output);
}

boolean power_socket::sendCode(String code){ //empfange den Code in Form eines Char[]
 
 digitalWrite(13, HIGH);  
 digitalWrite(_vcc, HIGH);
 for(byte z = 0; z<7; z++){ //wiederhole den Code 7x
   for(byte i = 0; i<13; i++){ //ein Code besteht aus 12bits plus "x"
     sendByte(code[i]);
   }
 //sendByte('x'); //da der code immer mit x/sync abschliesst, brauchen wir den nicht im code und haengen es automatisch immer hinten ran.
 }
 digitalWrite(_vcc, LOW);
 digitalWrite(13, LOW);
 return true;
}

 
void power_socket::sendByte(char i) { //Diese Funktion soll 0,1 oder x senden koennen. Wir speichern die gewuenschte Ausgabe in der Variabel i

 switch(i){ //nun gucken wir was i ist
 case '0':{ //Der Code fuer '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;
 }
 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;
 }
 case 'x':{ //Der Code fuer x(sync)
   digitalWrite(rc_pin,HIGH);
   wait(1);
   digitalWrite(rc_pin,LOW);
   wait(31);
 }

}

}

void power_socket::wait(int x) {
 delayMicroseconds(x*350); //warte x*350us
}

void power_socket::setChannel(char Channel){
 switch (Channel){
   case 'A':{
     _suffix = "10000";
     break;
   }
   case 'B':{
     _suffix = "01000";
     break;
   }
   case 'C':{
     _suffix = "00100";
     break;
   }
   case 'D':{
     _suffix = "00010";
     break;
   }
   default: {
     _suffix = "00000";
     Serial.println("ERROR: no valid Channel: should be 'A', 'B', 'C' or 'D'.");
  }
 }
}


And an example:
Code: [Select]
/*Arduio skech demonstrtating the power_socket library,
switching on the socket everytime the Arduiono gets powered.

*************************************
V1.2, June 18th, 2013, by Paul Naethe
*************************************/



#include "power_socket.h"

char channel = 'C';
String identifier = "00000";

power_socket Socket(11, 12, identifier); //assigning VCC-pin(11) and DATA-pin(12)

enum State {OFF, ON} state;  //creating state-variable

void setup(){
 Socket.init();

 Socket.switchOn(channel);
 state = ON;
}

void loop(){
}



Cheers!

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy