Problem:
Det finns en ljusbrytare i köket och tre olika ljuskällor.
ljuskronan har en "Mysbelysning" och en spottbelysning på separata slingor,
Sedan har vi en större lampa mitt i köket som nu är inkopplad till ljusbrytaren.
Min sambo vill kunna tända all belysning eller bara mysbelysningen,
jag har tittat lite och de verkar inte gå att dra fler ledare upp till uttaget i taket
Så tänkte man kunde bygga något snabbt och lustigt
Lösning:
Det finns plats att sätta upp lite elektronik i den stora lampan
Så ett litet relä kort typ detta, (Hittade inget 5 volts)
http://www.electrokit.se/byggsatser-sty ... yJk.reddit
12volts väggkonverter har ja några liggandes
har en liten 12v-5v(usb) liggande som blev över från ett tidigare projekt, Detta får driva en pic.
Har skrivit lite kod så att picen känner hur länge den var igång förra gången den va igång(?)
Så att om man bara sätter på hela härket kommer picen tända på all belysning
Men om den har varit igång < 5 sekunder (Förra gången den var igång) Tänder den bara mysbelysningen
Alltså Första gången man sätter på lampan går den alltid till fullbelysning
Men om man blinkar en gång går den till mysbelysning.
Det va inte meningen att skriva en uppsats här.
Någon som ser några säkerhetsrisker med detta upplägg?
Koden en bara ett moddat HI-TECH C exempel
Jag kör en pic16f886 som ja hitta under soffan
Ej renskriven eller helt klar
Kod: Markera allt
#include <htc.h>
/*
* Example code for using timer0 on a 16F84
* Just sets up a 1 second interrupt and increments a variable
*/
/*
* Calculate preload value for one second timer
*/
#define PERIOD 1000000 // period in uS - one second here
#define XTAL 4000000 // crystal frequency - 4MHz
#define IPERIOD (4 * 1000000 / XTAL) // Period of instruction clock in uSeconds
#define SCALE 256 // Timer 0 prescaler
#define T0_TICKS 256 // Number of counts for interrupt
#define TICK_PERIOD (SCALE * IPERIOD) // Period (uSec) of one increment of timer 0
#define RELOADS ((PERIOD/T0_TICKS)/TICK_PERIOD)
unsigned char temp;
unsigned long seconds; // second count
near char reload = 0;
persistent static unsigned char Tid_sist;
bit led_toggle=0;
/* service routine for timer 0 interrupt */
void interrupt
timer0_isr(void)
{
if(reload == 0){
// effect a change on PORTB whenever our desired period is reached.
// Note this timing will contain a margin of error.
reload = RELOADS + 1;
seconds++;
// PORTC++; // effect a change on PORTB
led_toggle=!led_toggle;
RC0=led_toggle; //DEBUGG BLINKAR EN LED FÖR ATT RÄKNA SEKUNDER
Tid_sist++;
}
reload--;
T0IF = 0;
}
main()
{
// initialize timer 0;
// OPTION = 0b0111; // prescale by 256
OSCCON = 0x62;
PS0=1;
PS1=1;
PS2=1;
PSA=0;
T0CS = 0; // select internal clock
T0IE = 1; // enable timer interrupt
GIE = 1; // enable global interrupts
TRISB = 0; // output changes on LED
TRISC = 0;
RC4=1;
if(Tid_sist==0)
{
RC1=1;
RC2=1;
RC3=1;
}
if(Tid_sist>1){
RC1=1;
RC2=0;
RC3=0;
}
for(;;)
{
if(Tid_sist>5){
GIE=0;
Tid_sist=0;
RC4=0; //DEBUGG KOLLAR NÄR DETTA SKER
}
continue; // let interrupt do its job
}
}