Skip to content
Snippets Groups Projects
Commit 521fc89a authored by s.oezguer@googlemail.com's avatar s.oezguer@googlemail.com
Browse files

initial load

parent 398894e3
No related branches found
No related tags found
No related merge requests found
/*
RCSwitch - Radio Controlled Switch Libary, operates up to 16 low cost 433MHz RC power sockets with an Arduino.
This will most likely work with any RC switch set with a SC5262S encoder chip built in the transmitter.
(c)2011 Suat Özgür
=== How to modify the transmitter ===
(You might also take a look at: http://sui77.wordpress.com/2011/04/12/low-cost-funksteckdosen-arduino/ )
Open your hand-held transmitter and solder a wire to the positive pole (+), one to the negative pole (-) of the battery holder
and another one to the DOUT Pin of the SC5262S chip.
+---- ----+ +---- ----+
O -- O O -- O
O O <---- Pin 19 / DOUT O O <---- Pin 18 / DOUT
O O O O
O SC5262 O O SC5262 O
O O O O
O 20Pin O O 18Pin O
O Package O O Package O
O O O O
O O O O
O O +----------+
+----------+
See datasheet: http://www.alldatasheet.co.kr/datasheet-pdf/pdf_kor/116104/SILAN/SC5262S-RF.html
Altough my transmitter was operated with a 12V battery, it also worked with 5V.
Connect the wires to your Arduino:
(+) ---> 5V
(-) ---> GND
DOUT ---> Any available I/O Pin (#10 for example)
*/
#include "RCSwitch.h"
/**
* Constructor
*
* @param nPin Arduino Pin to which the sender is connected to
*/
RCSwitch::RCSwitch(int nPin) {
this->nPin = nPin;
this->nDelay = 469;
pinMode(nPin, OUTPUT);
}
/**
* Constructor with different bit width
*
* @param nPin Arduino Pin to which the sender is connected to
* @param nDelay 1/8 Bit width in microseconds
*/
RCSwitch::RCSwitch(int nPin, int nDelay) {
this->nPin = nPin;
this->nDelay = nDelay;
pinMode(nPin, OUTPUT);
}
/**
* Switch a remote switch on (SC5262)
*
* @param nAddressCode Number of the switch group (1..4)
* @param nChannelCode Number of the switch itself (1..4)
*/
void RCSwitch::switchOn(int nAddressCode, int nChannelCode) {
this->send( this->getCodeWord(nAddressCode, nChannelCode, true) );
}
/**
* Switch a remote switch off (SC5262)
*
* @param nAddressCode Number of the switch group (1..4)
* @param nChannelCode Number of the switch itself (1..4)
*/
void RCSwitch::switchOff(int nAddressCode, int nChannelCode) {
this->send( this->getCodeWord(nAddressCode, nChannelCode, false) );
}
/**
* Switch a remote switch off (HX2262)
*
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
* @param nChannelCode Number of the switch itself (1..4)
*/
void RCSwitch::switchOn(String sGroup, int nChannel) {
this->send( this->getCodeWord2(sGroup, nChannel, true) );
}
/**
* Switch a remote switch off (HX2262)
*
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
* @param nChannelCode Number of the switch itself (1..4)
*/
void RCSwitch::switchOff(String sGroup, int nChannel) {
this->send( this->getCodeWord2(sGroup, nChannel, false) );
}
/**
* Returns a String[13], representing the Code Word to be send.
* A Code Word consists of 9 address bits, 3 data bits and one sync bit but in our case only the first 8 address bits and the last 2 data bits were used.
* A Code Bit can have 4 different states: "F" (floating), "0" (low), "1" (high), "S" (synchronous bit)
*
* +-------------------------------+--------------------------------+-----------------------------------------+-----------------------------------------+----------------------+------------+
* | 4 bits address (switch group) | 4 bits address (switch number) | 1 bit address (not used, so never mind) | 1 bit address (not used, so never mind) | 2 data bits (on|off) | 1 sync bit |
* | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | F | F | on=FF off=F0 | S |
* +-------------------------------+--------------------------------+-----------------------------------------+-----------------------------------------+----------------------+------------+
*
* @param nAddressCode Number of the switch group (1..4)
* @param nChannelCode Number of the switch itself (1..4)
* @param bStatus Wether to switch on (true) or off (false)
*
* @return String[13]
*/
String RCSwitch::getCodeWord(int nAddressCode, int nChannelCode, boolean bStatus) {
String code[5] = { "FFFF", "0FFF", "F0FF", "FF0F", "FFF0" };
if (nAddressCode < 1 || nAddressCode > 4 || nChannelCode < 1 || nChannelCode > 4) {
return "";
}
return code[nAddressCode] + code[nChannelCode] + "FF" + (bStatus==true?"FF":"F0") + "S";
}
/**
* Like getCodeWord (HX2262)
*/
String RCSwitch::getCodeWord2(String sGroup, int nChannelCode, boolean bStatus) {
String code[6] = { "FFFFF", "0FFFF", "F0FFF", "FF0FF", "FFF0F", "FFFF0" };
if (sGroup.length() != 5 || nChannelCode < 1 || nChannelCode > 5) {
return "";
}
String sAddressCode = "";
for (int i = 0; i<5; i++) {
if (sGroup[i] == '0') {
sAddressCode += "F";
} else {
sAddressCode += "0";
}
}
return sAddressCode + code[nChannelCode] + (bStatus==true?"0F":"F0") + "S";
}
/**
* Sends a Code Word
* @param sCodeWord /^[10FS]{13}$/ -> see getCodeWord
*/
void RCSwitch::send(String sCodeWord) {
for (int nRepeat=0; nRepeat<10; nRepeat++) {
for(int i=0; i<=12; i++) {
switch(sCodeWord[i]) {
case '0':
this->send0();
break;
case 'F':
this->sendF();
break;
case '1':
this->send1();
break;
case 'S':
this->sendSync();
break;
}
}
}
}
/**
* Sends a "0" Bit
* _ _
* Waveform: | |___| |___
*/
void RCSwitch::send0() {
digitalWrite(this->nPin, HIGH);
delayMicroseconds( this->nDelay * 1);
digitalWrite(this->nPin, LOW);
delayMicroseconds( this->nDelay * 3);
digitalWrite(this->nPin, HIGH);
delayMicroseconds( this->nDelay * 1);
digitalWrite(this->nPin, LOW);
delayMicroseconds( this->nDelay * 3);
}
/**
* Sends a "1" Bit
* ___ ___
* Waveform: | |_| |_
*/
void RCSwitch::send1() {
digitalWrite(this->nPin, HIGH);
delayMicroseconds( this->nDelay * 3);
digitalWrite(this->nPin, LOW);
delayMicroseconds( this->nDelay * 1);
digitalWrite(this->nPin, HIGH);
delayMicroseconds( this->nDelay * 3);
digitalWrite(this->nPin, LOW);
delayMicroseconds( this->nDelay * 1);
}
/**
* Sends a "F" Bit
* _ ___
* Waveform: | |___| |_
*/
void RCSwitch::sendF() {
digitalWrite(this->nPin, HIGH);
delayMicroseconds( this->nDelay * 1);
digitalWrite(this->nPin, LOW);
delayMicroseconds( this->nDelay * 3);
digitalWrite(this->nPin, HIGH);
delayMicroseconds( this->nDelay * 3);
digitalWrite(this->nPin, LOW);
delayMicroseconds( this->nDelay * 1);
}
/**
* Sends a "S" Bit
* _
* Waveform: | |_______________________________
*/
void RCSwitch::sendSync() {
digitalWrite(this->nPin, HIGH);
delayMicroseconds( this->nDelay * 1);
digitalWrite(this->nPin, LOW);
delayMicroseconds( this->nDelay * 31);
}
\ No newline at end of file
#include "WProgram.h"
class RCSwitch {
public:
RCSwitch(int nPin);
RCSwitch(int nPin, int nDelay);
void switchOn(int nGroupNumber, int nSwitchNumber);
void switchOff(int nGroupNumber, int nSwitchNumber);
void switchOn(String sGroup, int nSwitchNumber);
void switchOff(String sGroup, int nSwitchNumber);
void send(String CodeWord);
private:
String getCodeWord(int nGroupNumber, int nSwitchNumber, boolean bStatus);
String getCodeWord2(String sGroup, int nSwitchNumber, boolean bStatus);
void send0();
void send1();
void sendF();
void sendSync();
int nPin;
int nDelay;
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment