Jag var hos Kjell i dag och såg att de hade sålde sådana här fjärrströmbrytare för 99:-

Det var så billigt så jag kunde inte låta bli att köpa två set. Inte för att jag direkt hade användning för dem, men kanske man kunde modda fjärrkontrollen eller lista ut vad det var för kommunikation och protokoll. I så fall skulle man kunna ha lite mer nytta av dem.
Det visade sig vara lättare än jag trodde. Fjärrkontrollen var lätt att skruva isär och det var uppenbarligen en 433MHz sändare i den. På med oscilloskopet i närheten av sändargrunkan så visade det sig att när man trycket en knapp så skickades några 25-bitars paket, där varje bit var 0.6ms, etta hög 0.45 ms och låg 0.15 ms, nolla hög 0.15 ms och låg 0.45 ms. Dessa paket upprepades med 4.4 ms mellanrum så länge knappen var nedtryckt, men typ åtta gånger för ett kort tryck.
Ett så enkelt protokoll behövde bara en snabb Arduino-sketch för att analyseras (lite besvärligt att läsa av 25 ettor/nollor på oscilloskopet).
bild3.jpg
(22 dioder i fjärrkontrollen!)
Kod: Markera allt
/*
Simple analyzer for Kjell:s cheap remote switch,
http://www.kjell.com/sortiment/el/el-produkter/starkstrom/fjarrstrombrytare/manuell/fjarrstrombrytare-p50219
The signal is 25 bits with a bit period of 0.6 ms
a zero is high 0.15 ms and low 0.45 ms
a one is high 0.45 ms and low 0.15 ms.
Each 25 bit packet is repeated (at least) 8 times with
about 4.4 ms delay between packets, but only first packet is
analyzed.
Type a key in a serial terminal and the key is echoed
as "#define (upper(ch))_ON" or OFF. Then the program waits for
PD7 is to go high and it is then sampled with 0.3+0.3 ms
intervalls and the final code is written in hex.
Only the 25 first bits is significant.
*/
volatile uint16_t capt_time;
volatile uint8_t capt_state, overflow_cnt;
// Called on falling and rising edge on ICP1(PB0)
// capt_state is 1 when w got a rising edge, zero on a falling
// last meassurement is stored in time
ISR(TIMER1_CAPT_vect)
{
static uint16_t save_time;
// Read and change edge
uint8_t state = (TCCR1B ^= (1<<ICES1));
if (bit_is_clear(state, ICES1)) {
// It was a rising edge, remember start time
save_time = ICR1;
capt_state = 1;
} else {
// Time elapsed since last falling edge.
capt_time = ICR1 - save_time;
capt_state = 0;
}
}
// Count number of overflows. Not used right now.
ISR(TIMER1_OVF_vect)
{
overflow_cnt++;
}
// Start an input caputre on ICP1.
// count in 25 pulses and determine if they are long or short.
uint32_t capture(void)
{
uint32_t n = 0;
uint8_t i = 0;
TIFR1 = (1<<ICF1); // Clear pending interrupts
capt_state = 0;
// Wait for first rising edge
while (capt_state == 0)
;
while (i < 25) {
// Wait for fall
while (capt_state == 1)
;
// *2 for 16MHz
if (capt_time > 300*2)
n |= 1;
n <<= 1;
while(capt_state == 0)
;
i++;
}
n <<= 6;
return n;
}
void setup()
{
Serial.begin(9600);
TIMSK1 = (1<<ICIE1)|(1<<TOIE1); // Enable input capture and overflow
// interrupt
TCCR1A = 0;
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS11); // presc 1:8
}
void loop()
{
uint32_t n;
uint8_t i;
if (Serial.available())
{
char ch = Serial.read();
Serial.print("#define ");
Serial.print((char)toupper(ch));
Serial.print("_");
if (isupper(ch))
Serial.print("ON ");
else
Serial.print("OFF");
Serial.print(" 0x");
Serial.println(capture(), HEX);
}
}
Koden innehåller en "hemkod" och en kanal A-E samt på eller av. För hemkod 11111 (alla hemkod-switchar på on) fick jag följande koder från programmet
Kod: Markera allt
#define A_ON 0xFFC55400
#define A_OFF 0xFFC55100
#define B_ON 0xFFD15400
#define B_OFF 0xFFD15100
#define C_ON 0xFFD45400
#define C_OFF 0xFFD45100
#define D_ON 0xFFD51400
#define D_OFF 0xFFD51100
#define E_ON 0xFFD54400
#define E_OFF 0xFFD54100
En mikrokontroller, en sändarmodul och ett trivialt program senare så kunde jag tända och släcka lampor, utplacerade i hela lägenheten, trådlöst från datorn.
bild4.jpg
(snygg antenn, ungefär en kvarts våglängd...)
Skulle kunna bli ett riktigt projekt. Redan nu går det ju att styra med t.ex. några cron-jobb (slå på och av vissa tidpunkter från *nix-miljö). Web... Telefon...
Edit: Det var lite naivt med delay i analysprogrammet. Bytte till ett baserat på input capture. Därför används D8/PB0/ICP1 (i stället för D7 som på bilden).
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.