@ -0,0 +1,12 @@ | |||
[submodule "code/vendor/embedis"] | |||
path = code/vendor/embedis | |||
url = https://github.com/thingSoC/embedis.git | |||
[submodule "code/vendor/nofuss"] | |||
path = code/vendor/nofuss | |||
url = git@bitbucket.org:xoseperez/nofuss.git | |||
[submodule "code/vendor/emonliteesp"] | |||
path = code/vendor/emonliteesp | |||
url = git@bitbucket.org:xoseperez/emonliteesp.git | |||
[submodule "code/vendor/RemoteSwitch-arduino-library"] | |||
path = code/vendor/RemoteSwitch-arduino-library | |||
url = https://github.com/jccprj/RemoteSwitch-arduino-library |
@ -1 +0,0 @@ | |||
../../src/code.ino |
@ -1 +0,0 @@ | |||
../../data |
@ -0,0 +1 @@ | |||
../vendor/embedis/src |
@ -0,0 +1 @@ | |||
../vendor/emonliteesp/code/lib/EmonLiteESP |
@ -0,0 +1 @@ | |||
../vendor/nofuss/client/lib/NoFUSSClient |
@ -0,0 +1 @@ | |||
../vendor/RemoteSwitch-arduino-library |
@ -1,158 +0,0 @@ | |||
/* | |||
* RemoteSwitch library v2.0.0 made by Randy Simons http://randysimons.nl | |||
* See RemoteSwitchSender.h for details. | |||
* | |||
* License: "Free BSD license". See license.txt | |||
*/ | |||
#include "RemoteReceiver.h" | |||
/************ | |||
* RemoteReceiver | |||
************/ | |||
unsigned short RemoteReceiver::_interrupt; | |||
volatile int RemoteReceiver::_state; | |||
unsigned short RemoteReceiver::_minRepeats; | |||
RemoteReceiverCallBack RemoteReceiver::_callback; | |||
boolean RemoteReceiver::_inCallback = false; | |||
void RemoteReceiver::init(unsigned short interrupt, unsigned short minRepeats, RemoteReceiverCallBack callback) { | |||
_interrupt = interrupt; | |||
_minRepeats = minRepeats; | |||
_callback = callback; | |||
//enable(); | |||
} | |||
void RemoteReceiver::enable() { | |||
_state = -1; | |||
attachInterrupt(_interrupt, interruptHandler, CHANGE); | |||
} | |||
void RemoteReceiver::disable() { | |||
detachInterrupt(_interrupt); | |||
} | |||
void RemoteReceiver::interruptHandler() { | |||
static unsigned int period; //Calculated duration of 1 period | |||
static unsigned short receivedBit; //Contains "bit" currently receiving | |||
static unsigned long receivedCode; //Contains received code | |||
static unsigned long previousCode; //Contains previous received code | |||
static unsigned short repeats = 0; //The number of times the an identical code is received in a row. | |||
static unsigned long lastChange=0; //Timestamp of previous edge | |||
static unsigned int min1Period, max1Period, min3Period, max3Period; | |||
unsigned long currentTime=micros(); | |||
unsigned int duration=currentTime-lastChange; //Duration = Time between edges | |||
lastChange=currentTime; | |||
if (_state==-1) { //Waiting for sync-signal | |||
if (duration>3720) { //==31*120 minimal time between two edges before decoding starts. | |||
//Sync signal received.. Preparing for decoding | |||
period=duration/31; | |||
receivedCode=previousCode=repeats=0; | |||
//Allow for large error-margin. ElCheapo-hardware :( | |||
min1Period=period*4/10; //Avoid floating point math; saves memory. | |||
max1Period=period*16/10; | |||
min3Period=period*23/10; | |||
max3Period=period*37/10; | |||
} | |||
else { | |||
return; | |||
} | |||
} else if (_state<48) { //Decoding message | |||
//bit part durations can ONLY be 1 or 3 periods. | |||
if (duration>=min1Period && duration<=max1Period) { | |||
bitClear(receivedBit,_state%4); //Note: this sets the bits in reversed order! Correct order would be: 3-(_state%4), but that's overhead we don't want. | |||
} | |||
else if (duration>=min3Period && duration<=max3Period) { | |||
bitSet(receivedBit,_state%4); //Note: this sets the bits in reversed order! | |||
} | |||
else { //Otherwise the entire sequence is invalid | |||
_state=-1; | |||
return; | |||
} | |||
if ((_state%4)==3) { //Last bit part? | |||
//Shift | |||
receivedCode*=3; | |||
//Decode bit. | |||
if (receivedBit==B1010) { //short long short long == B0101, but bits are set in reversed order, so compare to B1010 | |||
//bit "0" received | |||
receivedCode+=0; //I hope the optimizer handles this ;) | |||
} | |||
else if (receivedBit==B0101) { //long short long short == B101, but bits are set in reversed order, so compare to B0101 | |||
//bit "1" received | |||
receivedCode+=1; | |||
} | |||
else if (receivedBit==B0110) { //short long long short. Reversed too, but makes no difference. | |||
//bit "f" received | |||
receivedCode+=2; | |||
} | |||
else { | |||
//Bit was rubbish. Abort. | |||
_state=-1; | |||
return; | |||
} | |||
} | |||
} else if (_state==48) { //Waiting for sync bit part 1 | |||
//Must be 1 period. | |||
if (duration<min1Period || duration>max1Period) { | |||
_state=-1; | |||
return; | |||
} | |||
} else { //Waiting for sync bit part 2 | |||
//Must be 31 periods. | |||
if (duration<period*25 || duration>period*36) { | |||
_state=-1; | |||
return; | |||
} | |||
//receivedCode is a valid code! | |||
if (receivedCode!=previousCode) { | |||
repeats=0; | |||
previousCode=receivedCode; | |||
} | |||
repeats++; | |||
if (repeats>=_minRepeats) { | |||
if (!_inCallback) { | |||
_inCallback = true; | |||
(_callback)(receivedCode, period); | |||
_inCallback = false; | |||
} | |||
//Reset after callback. | |||
_state=-1; | |||
return; | |||
} | |||
//Reset for next round | |||
receivedCode = 0; | |||
_state=0; //no need to wait for another sync-bit! | |||
return; | |||
} | |||
_state++; | |||
return; | |||
} | |||
boolean RemoteReceiver::isReceiving(int waitMillis) { | |||
unsigned long startTime=millis(); | |||
int waited; //signed int! | |||
do { | |||
if (_state!=-1) { | |||
return true; | |||
} | |||
waited = (millis()-startTime); | |||
} while(waited>=0 && waited <= waitMillis); //Yes, clock wraps every 50 days. And then you'd have to wait for a looooong time. | |||
return false; | |||
} |
@ -1,75 +0,0 @@ | |||
/* | |||
* RemoteSwitch library v2.0.0 made by Randy Simons http://randysimons.nl | |||
* | |||
* License: "Free BSD license". See license.txt | |||
*/ | |||
#ifndef RemoteReceiver_h | |||
#define RemoteReceiver_h | |||
//#include "WProgram.h" | |||
#include "Arduino.h" | |||
typedef void (*RemoteReceiverCallBack)(unsigned long, unsigned int); | |||
/** | |||
* See RemoteSwitch for introduction. | |||
* | |||
* RemoteReceiver decodes the signal received from a 433MHz-receiver, like the "KlikAanKlikUit"-system | |||
* as well as the signal sent by the RemoteSwtich class. When a correct signal is received, | |||
* a user-defined callback function is called. | |||
* | |||
* Note that in the callback function, the interrupts are still disabled. You can enabled them, if needed. | |||
* A call to the callback must b finished before RemoteReceiver will call the callback function again, thus | |||
* there is no re-entrant problem. | |||
* | |||
* When sending your own code using RemoteSwich, disable() the receiver first. | |||
* | |||
* This is a pure static class, for simplicity and to limit memory-use. | |||
*/ | |||
class RemoteReceiver { | |||
public: | |||
/** | |||
* Initializes the decoder. | |||
* | |||
* @param interrupt The interrupt as is used by Arduino's attachInterrupt function. See attachInterrupt for details. | |||
* @param minRepeats The number of times the same code must be received in a row before the callback is calles | |||
* @param callback Pointer to a callback function, with signature void (*func)(unsigned long, unsigned int). First parameter is the decoded data, the second the period of the timing. | |||
*/ | |||
static void init(unsigned short interrupt, unsigned short minRepeats, RemoteReceiverCallBack callback); | |||
/** | |||
* Enabled decoding. No need to call enable() after init(). | |||
*/ | |||
static void enable(); | |||
/** | |||
* Disable decoding. You can enable decoding by calling enable(); | |||
*/ | |||
static void disable(); | |||
/** | |||
* Tells wether a signal is being received. Since it makes no sense to transmit while another transmitter is active, | |||
* it's best to wait for isReceiving() to false. | |||
* | |||
* Note: isReceiving() depends on interrupts enabled. Thus, when disabled()'ed, or when interrupts are disabled (as is | |||
* the case in the callback), isReceiving() will not work properly. | |||
* @param waitMillis number of milliseconds to monitor for signal. | |||
* @return boolean If after waitMillis no signal was being processed, returns false. If before expiration a signal was being processed, returns true. | |||
*/ | |||
static boolean isReceiving(int waitMillis = 50); | |||
private: | |||
static void interruptHandler(); | |||
static unsigned short _interrupt; //Radio input interrupt | |||
volatile static int _state; //State of decoding process. There are 49 states, 1 for "waiting for signal" and 48 for decoding the 48 edges in a valid code. | |||
static unsigned short _minRepeats; | |||
static RemoteReceiverCallBack _callback; | |||
static boolean _inCallback; //When true, the callback function is being executed; prevents re-entrance. | |||
}; | |||
#endif |
@ -1,263 +0,0 @@ | |||
/* | |||
* RemoteSwitch library v2.0.0 made by Randy Simons http://randysimons.nl | |||
* See RemoteSwitchSender.h for details. | |||
* | |||
* License: "Free BSD license". See license.txt | |||
*/ | |||
#include "RemoteSwitch.h" | |||
/************ | |||
* RemoteSwitch | |||
************/ | |||
RemoteSwitch::RemoteSwitch(unsigned short pin, unsigned int periodusec, unsigned short repeats) { | |||
_pin=pin; | |||
_periodusec=periodusec; | |||
_repeats=repeats; | |||
pinMode(_pin, OUTPUT); | |||
} | |||
unsigned long RemoteSwitch::encodeTelegram(unsigned short trits[]) { | |||
unsigned long data = 0; | |||
//Encode data | |||
for (unsigned short i=0;i<12;i++) { | |||
data*=3; | |||
data+=trits[i]; | |||
} | |||
//Encode period duration | |||
data |= (unsigned long)_periodusec << 23; | |||
//Encode repeats | |||
data |= (unsigned long)_repeats << 20; | |||
return data; | |||
} | |||
void RemoteSwitch::sendTelegram(unsigned short trits[]) { | |||
sendTelegram(encodeTelegram(trits),_pin); | |||
} | |||
/** | |||
* Format data: | |||
* pppppppp|prrrdddd|dddddddd|dddddddd (32 bit) | |||
* p = perioud (9 bit unsigned int | |||
* r = repeats as 2log. Thus, if r = 3, then signal is sent 2^3=8 times | |||
* d = data | |||
*/ | |||
void RemoteSwitch::sendTelegram(unsigned long data, unsigned short pin) { | |||
unsigned int periodusec = (unsigned long)data >> 23; | |||
unsigned short repeats = 1 << (((unsigned long)data >> 20) & B111); | |||
data = data & 0xfffff; //truncate to 20 bit | |||
//Convert the base3-code to base4, to avoid lengthy calculations when transmitting.. Messes op timings. | |||
unsigned long dataBase4 = 0; | |||
for (unsigned short i=0; i<12; i++) { | |||
dataBase4<<=2; | |||
dataBase4|=(data%3); | |||
data/=3; | |||
} | |||
for (unsigned short int j=0;j<repeats;j++) { | |||
//Sent one telegram | |||
//Use data-var as working var | |||
data=dataBase4; | |||
for (unsigned short i=0; i<12; i++) { | |||
switch (data & B11) { | |||
case 0: | |||
digitalWrite(pin, HIGH); | |||
delayMicroseconds(periodusec); | |||
digitalWrite(pin, LOW); | |||
delayMicroseconds(periodusec*3); | |||
digitalWrite(pin, HIGH); | |||
delayMicroseconds(periodusec); | |||
digitalWrite(pin, LOW); | |||
delayMicroseconds(periodusec*3); | |||
break; | |||
case 1: | |||
digitalWrite(pin, HIGH); | |||
delayMicroseconds(periodusec*3); | |||
digitalWrite(pin, LOW); | |||
delayMicroseconds(periodusec); | |||
digitalWrite(pin, HIGH); | |||
delayMicroseconds(periodusec*3); | |||
digitalWrite(pin, LOW); | |||
delayMicroseconds(periodusec); | |||
break; | |||
case 2: //AKA: X or float | |||
digitalWrite(pin, HIGH); | |||
delayMicroseconds(periodusec); | |||
digitalWrite(pin, LOW); | |||
delayMicroseconds(periodusec*3); | |||
digitalWrite(pin, HIGH); | |||
delayMicroseconds(periodusec*3); | |||
digitalWrite(pin, LOW); | |||
delayMicroseconds(periodusec); | |||
break; | |||
} | |||
//Next trit | |||
data>>=2; | |||
} | |||
//Send termination/synchronisation-signal. Total length: 32 periods | |||
digitalWrite(pin, HIGH); | |||
delayMicroseconds(periodusec); | |||
digitalWrite(pin, LOW); | |||
delayMicroseconds(periodusec*31); | |||
} | |||
} | |||
boolean RemoteSwitch::isSameCode(unsigned long encodedTelegram, unsigned long receivedData) { | |||
return (receivedData==(encodedTelegram & 0xFFFFF)); //Compare the 20 LSB's | |||
} | |||
/************ | |||
* ActionSwitch | |||
************/ | |||
ActionSwitch::ActionSwitch(unsigned short pin, unsigned int periodusec) : RemoteSwitch(pin,periodusec,3) { | |||
//Call contructor | |||
} | |||
void ActionSwitch::sendSignal(unsigned short systemCode, char device, boolean on) { | |||
sendTelegram(getTelegram(systemCode,device,on), _pin); | |||
} | |||
unsigned long ActionSwitch::getTelegram(unsigned short systemCode, char device, boolean on) { | |||
unsigned short trits[12]; | |||
device-=65; | |||
for (unsigned short i=0; i<5; i++) { | |||
//bits 0-4 contain address (2^5=32 addresses) | |||
trits[i]=(systemCode & 1)?1:2; | |||
systemCode>>=1; | |||
//bits 5-9 contain device. Only one trit has value 0, others have 2 (float)! | |||
trits[i+5]=(i==device?0:2); | |||
} | |||
//switch on or off | |||
trits[10]=(!on?0:2); | |||
trits[11]=(on?0:2); | |||
return encodeTelegram(trits); | |||
} | |||
/************ | |||
* BlokkerSwitch | |||
************/ | |||
BlokkerSwitch::BlokkerSwitch(unsigned short pin, unsigned int periodusec) : RemoteSwitch(pin,periodusec,3) { | |||
//Call contructor | |||
} | |||
void BlokkerSwitch::sendSignal(unsigned short device, boolean on) { | |||
sendTelegram(getTelegram(device,on), _pin); | |||
} | |||
unsigned long BlokkerSwitch::getTelegram(unsigned short device, boolean on) { | |||
unsigned short trits[12]={0}; | |||
device--; | |||
for (unsigned short i=1; i<4; i++) { | |||
//Bits 1-3 contain device | |||
trits[i]=(device & 1)?0:1; | |||
device>>=1; | |||
} | |||
//switch on or off | |||
trits[8]=(on?1:0); | |||
return encodeTelegram(trits); | |||
} | |||
/************ | |||
* KaKuSwitch | |||
************/ | |||
KaKuSwitch::KaKuSwitch(unsigned short pin, unsigned int periodusec) : RemoteSwitch(pin,periodusec,3) { | |||
//Call contructor | |||
} | |||
void KaKuSwitch::sendSignal(char address, unsigned short device, boolean on) { | |||
sendTelegram(getTelegram(address, device, on), _pin); | |||
} | |||
unsigned long KaKuSwitch::getTelegram(char address, unsigned short device, boolean on) { | |||
unsigned short trits[12]; | |||
address-=65; | |||
device-=1; | |||
for (unsigned short i=0; i<4; i++) { | |||
//bits 0-3 contain address (2^4 = 16 addresses) | |||
trits[i]=(address & 1)?2:0; | |||
address>>=1; | |||
//bits 4-8 contain device (2^4 = 16 addresses) | |||
trits[i+4]=(device & 1)?2:0; | |||
device>>=1; | |||
} | |||
//bits 8-10 seem to be fixed | |||
trits[8]=0; | |||
trits[9]=2; | |||
trits[10]=2; | |||
//switch on or off | |||
trits[11]=(on?2:0); | |||
return encodeTelegram(trits); | |||
} | |||
void KaKuSwitch::sendSignal(char address, unsigned short group, unsigned short device, boolean on) { | |||
sendTelegram(getTelegram(address, group, on), _pin); | |||
} | |||
unsigned long KaKuSwitch::getTelegram(char address, unsigned short group, unsigned short device, boolean on) { | |||
unsigned short trits[12], i; | |||
address-=65; | |||
group-=1; | |||
device-=1; | |||
//address. M3E Pin A0-A3 | |||
for (i=0; i<4; i++) { | |||
//bits 0-3 contain address (2^4 = 16 addresses) | |||
trits[i]=(address & 1)?2:0; | |||
address>>=1; | |||
} | |||
//device. M3E Pin A4-A5 | |||
for (; i<6; i++) { | |||
trits[i]=(device & 1)?2:0; | |||
device>>=1; | |||
} | |||
//group. M3E Pin A6-A7 | |||
for (; i<8; i++) { | |||
trits[i]=(group & 1)?2:0; | |||
group>>=1; | |||
} | |||
//bits 8-10 are be fixed. M3E Pin A8/D0-A10/D2 | |||
trits[8]=0; | |||
trits[9]=2; | |||
trits[10]=2; | |||
//switch on or off, M3E Pin A11/D3 | |||
trits[11]=(on?2:0); | |||
return encodeTelegram(trits); | |||
} |
@ -1,197 +0,0 @@ | |||
/* | |||
* RemoteSwitch library v2.0.0 made by Randy Simons http://randysimons.nl | |||
* | |||
* License: "Free BSD license". See license.txt | |||
*/ | |||
#ifndef RemoteSwitch_h | |||
#define RemoteSwitch_h | |||
//#include "WProgram.h" | |||
#include "Arduino.h" | |||
/** | |||
* RemoteSwitch provides a generic class for simulation of common RF remote controls, like the 'Klik aan Klik uit'-system | |||
* (http://www.klikaanklikuit.nl/), used to remotely switch lights etc. | |||
* | |||
* Many of these remotes seem to use a 433MHz SAW resonator and one of these chips: LP801B, HX2262, PT2262, M3E. | |||
* Datasheet for the HX2262/PT2262 ICs: | |||
* http://www.princeton.com.tw/downloadprocess/downloadfile.asp?mydownload=PT2262_1.pdf | |||
* | |||
* Hardware required for this library: a 433MHz SAW oscillator transmitter, e.g. | |||
* http://www.sparkfun.com/commerce/product_info.php?products_id=7815 | |||
* http://www.conrad.nl/goto/?product=130428 | |||
* | |||
* Notes: | |||
* - Since these chips use (and send!) tri-state inputs (low, high and floating) I use 'trits' instead of 'bits', | |||
* when appropriate. | |||
* - I measured the period lengths with a scope. Thus: they work for my remotes, but may fail for yours... | |||
* A better way would be to calculate the 'target'-timings using the datasheets and the resistor-values on the remotes. | |||
*/ | |||
class RemoteSwitch { | |||
public: | |||
/** | |||
* Constructor. | |||
* | |||
* To obtain the correct period length, an oscilloscope is convenient, but you can also read the | |||
* datasheet of the transmitter, measure the resistor for the oscillator and calculate the freqency. | |||
* | |||
* @param pin output pin on Arduino to which the transmitter is connected | |||
* @param periodsec [0..511] Duration of one period, in microseconds. A trit is 6 periods. | |||
* @param repeats [0..7] The 2log-Number of times the signal is repeated. The actual number of repeats will be 2^repeats. 3 would be a good start. | |||
*/ | |||
RemoteSwitch(unsigned short pin, unsigned int periodusec, unsigned short repeats); | |||
/** | |||
* Encodes the data base on the current object and the given trits. The data can be reused, e.g. | |||
* for use with the static version of sendTelegram, so you won't need to instantiate costly objects! | |||
* | |||
* @return The data suited for use with RemoteSwitch::sendTelegram. | |||
*/ | |||
unsigned long encodeTelegram(unsigned short trits[]); | |||
/** | |||
* Send a telegram, including synchronisation-part. | |||
* | |||
* @param trits Array of size 12. "trits" should be either 0, 1 or 2, where 2 indicaties "float" | |||
*/ | |||
void sendTelegram(unsigned short trits[]); | |||
/** | |||
* Send a telegram, including synchronisation-part. The data-param encodes the period duration, number of repeats and the actual data. | |||
* Note: static method, which allows for use in low-mem situations. | |||
* | |||
* Format data: | |||
* pppppppp|prrrdddd|dddddddd|dddddddd (32 bit) | |||
* p = perioud (9 bit unsigned int | |||
* r = repeats as 2log. Thus, if r = 3, then signal is sent 2^3=8 times | |||
* d = data | |||
* | |||
* @param data data, period and repeats. | |||
* @param pin Pin number of the transmitter. | |||
*/ | |||
static void sendTelegram(unsigned long data, unsigned short pin); | |||
/** | |||
* Compares the data received with RemoteReceive with the data obtained by one of the getTelegram-functions. | |||
* Period duration and repetitions are ignored by this function; only the data-payload is compared. | |||
* | |||
* @return true, if the codes are identical (the 20 least significant bits match) | |||
*/ | |||
static boolean isSameCode(unsigned long encodedTelegram, unsigned long receivedData); | |||
protected: | |||
unsigned short _pin; //Radio output pin | |||
unsigned int _periodusec; //oscillator period in microseconds | |||
unsigned short _repeats; //Number over repetitions of one telegram | |||
}; | |||
/** | |||
* ActionSwitch simulatos a remote, as sold in the Dutch 'Action' stores. But there are many similar systems on the market. | |||
* If your remote has setting for 5 address bits, and can control 5 devices on or off, then you can try to use the ActionSwitch | |||
*/ | |||
class ActionSwitch: RemoteSwitch { | |||
public: | |||
/** | |||
* Constructor | |||
* | |||
* @param pin output pin on Arduino to which the transmitter is connected | |||
* @param periodsec Duration of one period, in microseconds. Default is 190usec | |||
* @see RemoteSwitch | |||
*/ | |||
ActionSwitch(unsigned short pin, unsigned int periodusec=190); | |||
/** | |||
* Send a on or off signal to a device. | |||
* | |||
* @param systemCode 5-bit addres (dip switches in remote). Range [0..31] | |||
* @param device Device to switch. Range: [A..E] (case sensitive!) | |||
* @param on True, to switch on. False to switch off, | |||
*/ | |||
void sendSignal(unsigned short systemCode, char device, boolean on); | |||
/** | |||
* Generates the telegram (data) which can be used for RemoteSwitch::sendTelegram. | |||
* See sendSignal for details on the parameters | |||
* | |||
* @return Encoded data, including repeats and period duration. | |||
*/ | |||
unsigned long getTelegram(unsigned short systemCode, char device, boolean on); | |||
}; | |||
/** | |||
* BlokkerSwitch simulatos a remote, as sold in the Dutch 'Blokker' stores. But there are many similar systems on the market. | |||
* These remotes have 4 on, 4 off buttons and a switch to switch between device 1-4 and 5-8. No futher configuration | |||
* possible. | |||
*/ | |||
class BlokkerSwitch: RemoteSwitch { | |||
public: | |||
/** | |||
* Constructor | |||
* | |||
* @param pin output pin on Arduino to which the transmitter is connected | |||
* @param periodsec Duration of one period, in microseconds. Default is 307usec | |||
* @see RemoteSwitch | |||
*/ | |||
BlokkerSwitch(unsigned short pin, unsigned int periodusec=230); | |||
/** | |||
* Send a on or off signal to a device. | |||
* | |||
* @param device Device to switch. Range: [1..8] | |||
* @param on True, to switch on. False to switch off, | |||
*/ | |||
void sendSignal(unsigned short device, boolean on); | |||
/** | |||
* @see RemoteSwitch::getTelegram | |||
*/ | |||
unsigned long getTelegram(unsigned short device, boolean on); | |||
}; | |||
/** | |||
* KaKuSwitch simulates a KlikAanKlikUit-remote, but there are many clones. | |||
* If your transmitter has a address dial with the characters A till P, you can try this class. | |||
*/ | |||
class KaKuSwitch: RemoteSwitch { | |||
public: | |||
/** | |||
* Constructor | |||
* | |||
* @param pin output pin on Arduino to which the transmitter is connected | |||
* @param periodsec Duration of one period, in microseconds. Default is 375usec | |||
* @see RemoteSwitch | |||
*/ | |||
KaKuSwitch(unsigned short pin, unsigned int periodusec=375); | |||
/** | |||
* Send a on or off signal to a device. | |||
* | |||
* @param address addres (dial switches in remote). Range [A..P] (case sensitive!) | |||
* @param group Group to switch. Range: [1..4] | |||
* @param device Device to switch. Range: [1..4] | |||
* @param on True, to switch on. False to switch off, | |||
*/ | |||
void sendSignal(char address, unsigned short group, unsigned short device, boolean on); | |||
/** | |||
* Send a on or off signal to a device. | |||
* | |||
* @param address addres (dip switches in remote). Range [A..P] (case sensitive!) | |||
* @param device device (dial switches in remote). Range [1..16] | |||
* @param on True, to switch on. False to switch off, | |||
*/ | |||
void sendSignal(char address, unsigned short device, boolean on); | |||
/** | |||
* @see RemoteSwitch::getTelegram | |||
*/ | |||
unsigned long getTelegram(char address, unsigned short group, unsigned short device, boolean on); | |||
/** | |||
* @see RemoteSwitch::getTelegram | |||
*/ | |||
unsigned long getTelegram(char address, unsigned short device, boolean on); | |||
}; | |||
#endif |
@ -1,53 +0,0 @@ | |||
#include <RemoteSwitch.h> | |||
/* | |||
* Demo for RF remote switch transmitter. | |||
* For details, see RemoteSwitch.h! | |||
* | |||
* This sketch switches some devices on and off in a loop. | |||
*/ | |||
//Intantiate a new ActionSwitch remote, use pin 11 | |||
ActionSwitch actionSwitch(11); | |||
//Intantiate a new KaKuSwitch remote, also use pin 11 (same transmitter!) | |||
KaKuSwitch kaKuSwitch(11); | |||
//Intantiate a new Blokker remote, also use pin 11 (same transmitter!) | |||
BlokkerSwitch blokkerSwitch(11); | |||
void setup() { | |||
} | |||
void loop() { | |||
//Switch off KaKu-device 10 on address M | |||
kaKuSwitch.sendSignal('M',10,false); | |||
//Switch on Action-device B on system code 1. | |||
actionSwitch.sendSignal(1,'B',true); | |||
//Switch on Blokker-device 7. | |||
blokkerSwitch.sendSignal(7,true); | |||
//wait 2 seconds | |||
delay(2000); | |||
//Switch on KaKu-device 2 of group 3 on address M (which is the same as device 10 on address M!) | |||
kaKuSwitch.sendSignal('M',3,2,true); | |||
//Switch off Action-device B on system code 1. | |||
actionSwitch.sendSignal(1,'B',false); | |||
//Switch off Blokker-device 7. | |||
blokkerSwitch.sendSignal(7,false); | |||
//wait 4 seconds | |||
delay(4000); | |||
} |
@ -1,58 +0,0 @@ | |||
#include <RemoteReceiver.h> | |||
#include <RemoteSwitch.h> | |||
/* | |||
* Demo for RF remote switch receiver. | |||
* For details, see RemoteReceiver.h! | |||
* | |||
* This sketch "translates" a Action-remote to a Blokker-remote. | |||
* When the A-On-button of the Action-remote is pressed, the Blokker-devices | |||
* 5, 6 and 7 are switched on. The A-Off-button switches the devices off again. | |||
* | |||
* Connect the transmitter to digital pin 11, and the receiver to digital pin 2. | |||
*/ | |||
ActionSwitch actionSwitch(11); | |||
BlokkerSwitch blokkerSwitch(11); | |||
//Prepare the code for switch A (system code 1) on and off, for easy comparision later. | |||
unsigned long actionAOn = actionSwitch.getTelegram(1,'A',true); | |||
unsigned long actionAOff = actionSwitch.getTelegram(1,'A',false); | |||
void setup() { | |||
//See example Show_received_code for info on this | |||
RemoteReceiver::init(0, 3, translateCode); | |||
} | |||
void loop() { | |||
} | |||
//Callback function is called only when a valid code is received. | |||
void translateCode(unsigned long receivedCode, unsigned int period) { | |||
//Enabled interrupts, so RemoteReceiver::isReceiving() can be used. | |||
interrupts(); | |||
//Compare the signals | |||
if (RemoteSwitch::isSameCode(actionAOn, receivedCode)) { | |||
//A-On-button pressed! | |||
//Wait for a free ether | |||
while(RemoteReceiver::isReceiving()); | |||
//Switch devices on | |||
blokkerSwitch.sendSignal(5,true); | |||
blokkerSwitch.sendSignal(6,true); | |||
blokkerSwitch.sendSignal(7,true); | |||
} else if (RemoteSwitch::isSameCode(actionAOff, receivedCode)) { | |||
//A-Off-button pressed! | |||
//Wait for a free ether | |||
while(RemoteReceiver::isReceiving()); | |||
//Switch devices off | |||
blokkerSwitch.sendSignal(5,false); | |||
blokkerSwitch.sendSignal(6,false); | |||
blokkerSwitch.sendSignal(7,false); | |||
} | |||
} |
@ -1,52 +0,0 @@ | |||
#include <RemoteReceiver.h> | |||
#include <RemoteSwitch.h> | |||
/* | |||
* Demo for RF remote switch receiver. | |||
* For details, see RemoteReceiver.h! | |||
* | |||
* This sketch demonstrates how to use the static version of | |||
* RemoteReceiver::sendTelegram, which can be used in low-memory | |||
* situations. | |||
* | |||
* Connect the transmitter to digital pin 11, and the receiver to digital pin 2. | |||
* | |||
* When run, this sketch waits for a valid code from the receiver, decodes it, | |||
* and retransmits it after 5 seconds. | |||
*/ | |||
void setup() { | |||
//See example Show_received_code for info on this | |||
RemoteReceiver::init(0, 3, showCode); | |||
} | |||
void loop() { | |||
} | |||
void showCode(unsigned long receivedCode, unsigned int period) { | |||
//Disable the receiver; otherwise it might pick up the retransmit as well. | |||
RemoteReceiver::disable(); | |||
//Need interrupts for delay | |||
interrupts(); | |||
unsigned long code; | |||
//Copy the received code. | |||
code = receivedCode & 0xFFFFF; //truncate to 20 bits for show; receivedCode is never more than 20 bits.. | |||
//Add the period duration to the code. Range: [0..511] (9 bit) | |||
code |= (unsigned long)period << 23; | |||
//Add the number of repeats to the code. Range: [0..7] (3 bit). The actual number of repeats will be 2^(repeats), | |||
//in this case 8 | |||
code |= 3L << 20; | |||
//Wait 5 seconds before sending. | |||
delay(5000); | |||
//Retransmit the signal on pin 11. Note: no object was created! | |||
RemoteSwitch::sendTelegram(code,11); | |||
RemoteReceiver::enable(); | |||
} |
@ -1,39 +0,0 @@ | |||
#include <RemoteReceiver.h> | |||
/* | |||
* Demo for RF remote switch receiver. | |||
* For details, see RemoteReceiver.h! | |||
* | |||
* This sketch shows the received signals on the serial port. | |||
* Connect the receiver to digital pin 2. | |||
*/ | |||
void setup() { | |||
Serial.begin(115200); | |||
//Initialize receiver on interrupt 0 (= digital pin 2), calls the callback "showCode" | |||
//after 3 identical codes have been received in a row. (thus, keep the button pressed | |||
//for a moment) | |||
// | |||
//See the interrupt-parameter of attachInterrupt for possible values (and pins) | |||
//to connect the receiver. | |||
RemoteReceiver::init(0, 3, showCode); | |||
} | |||
void loop() { | |||
} | |||
//Callback function is called only when a valid code is received. | |||
void showCode(unsigned long receivedCode, unsigned int period) { | |||
//Note: interrupts are disabled. You can re-enable them if needed. | |||
//Print the received code. | |||
Serial.print("Code: "); | |||
Serial.print(receivedCode); | |||
Serial.print(", period duration: "); | |||
Serial.print(period); | |||
Serial.println("us."); | |||
} | |||
@ -1,12 +0,0 @@ | |||
RemoteSwitch KEYWORD1 | |||
ActionSwitch KEYWORD1 | |||
BlokkerSwitch KEYWORD1 | |||
KaKuSwitch KEYWORD1 | |||
sendTelegram KEYWORD2 | |||
sendSignal KEYWORD2 | |||
isSameCode KEYWORD2 | |||
RemoteReceiver KEYWORD1 | |||
init KEYWORD2 | |||
enable KEYWORD2 | |||
disable KEYWORD2 | |||
isReceiving KEYWORD2 |
@ -1,25 +0,0 @@ | |||
Copyright 2010 Randy Simons. All rights reserved. | |||
Redistribution and use in source and binary forms, with or without modification, are | |||
permitted provided that the following conditions are met: | |||
1. Redistributions of source code must retain the above copyright notice, this list of | |||
conditions and the following disclaimer. | |||
2. Redistributions in binary form must reproduce the above copyright notice, this list | |||
of conditions and the following disclaimer in the documentation and/or other materials | |||
provided with the distribution. | |||
THIS SOFTWARE IS PROVIDED BY RANDY SIMONS ``AS IS'' AND ANY EXPRESS OR IMPLIED | |||
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | |||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RANDY SIMONS OR | |||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
The views and conclusions contained in the software and documentation are those of the | |||
authors and should not be interpreted as representing official policies, either expressed | |||
or implied, of Randy Simons. |
@ -0,0 +1 @@ | |||
#include <Arduino.h> |
@ -0,0 +1 @@ | |||
Subproject commit 6a382a72de81fc8a15dde391be174777d7ba80ca |
@ -0,0 +1 @@ | |||
Subproject commit 4f700a6a1067ef289e23d20d02902d2485952b66 |