The remote contains a sc2262 and is powered by a 12V battery.
After a look under the hood of the remote the conclusion was made that a press of a button connect two pins to ground, totally 5 pins are used giving six buttons (see schematic).
To control this from a computer a 74LS05 (hex inverter with open collector outputs) was used (any 7405 should do but if it's going to be powered by the parallel port it won't hurt using a low power one), connecting the open collector outputs directly to the control chip. The 7405 is powered using bit 5,6 and 7 of the data port, this is enough using the parallel port on my motherboard.
Schematic:
inside (the white wire is the antenna)
To control the parallel port this small (linux) program is used, ppdev module has to be loaded.
Remote.c
//Control of remote to remote controlled wall outlets using the parallel port //Written for linux //Written by Mikael Ågren 2009 // //gcc remote.c -o remote #include <stdlib.h> #include <stdio.h> #include <sys/io.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/ppdev.h> #include <fcntl.h> int fd; //map bits of pp data port #define PWR (1<<7)|(1<<6)|(1<<5) //used to power buffer #define ROD 1<<0 #define LILA 1<<1 #define GUL 1<<2 #define VIT 1<<3 #define SVART 1<<4 #define ON ROD #define OFF LILA #define ONE GUL #define TWO VIT #define THREE SVART unsigned char setParPortData(unsigned char data) { ioctl(fd, PPDATADIR, 0); if(ioctl(fd, PPWDATA, &data)) { printf("error writing to port"); exit(2); } } delay_enough() { char i; for(i=0; i<5; i++) { delay_1s(); } } delay_1s() { time_t t; time_t old_t; old_t = time(NULL); while ((t=time(NULL)) < old_t+1) { } } void printHelp(char **argv, int exitcode) { printf("usage: %s reciever on|off\nreciever = 1, 2 or 3\n", argv[0]); exit(exitcode); } int main(int argc, char **argv) { if(argc!=3) { printHelp(argv, 1); } printf("Försöker öppna /dev/parport0\n"); fd = open("/dev/parport0", O_RDONLY); if(ioctl(fd, PPCLAIM)) { perror ("PPCLAIM"); close(fd); return 1; } printf("/dev/parport0 öppnad\n"); unsigned char out=0; //which reciever if(!strcmp(argv[1], "1")) out |= ONE; else if(!strcmp(argv[1], "2")) out |= TWO; else if(!strcmp(argv[1], "3")) out |= THREE; else printHelp(argv, 1); //which state if(!strcmp(argv[2], "on")) out |= ON; else if(!strcmp(argv[2], "off")) out |= OFF; else printHelp(argv, 1); //keep buffer powered out |= PWR; printf("%x\n", PWR); setParPortData(PWR); delay_enough(); printf("%x\n", out); setParPortData(out); delay_enough(); printf("%x\n", 0); setParPortData(0); close(fd); return 0; }
Coffee...
Wrote some simple scripts so i can wake up to the smell and sound of fresh coffee in the morning
kaffeON
remote 3 on
kaffeOFF
remote 3 off
kaffe
if [ "$1" = "" ]; then echo "usage: $0 now" echo " $0 HH:MM" exit -1 fi timeoff=$(date -d "$1 30 min" +%H:%M) $(echo kaffeOFF | at $timeoff) if [ "$1" = "now" ]; then void=$(kaffeON) echo $void else timeon="$1" $(echo kaffeON | at $timeon) fi