;V-1 ;Compileren met Crownhill Proton+ PIC Basic compiler. ;230VAC(!) RC5 draadloos afstandbediende licht-dimmer met PIC12F629. ;De bedoeling van de schakeling is dat deze in bijv. een schemerlamp wordt ingebouwd en ; deze normaal wordt aan en uit gezet, zoals dat ook was voordat deze dimmer erin zat. ;Om daarna als uitzondering de lamp feller of minder fel te laten branden met de TV- ; afstandsbediening. ;Als er spanning op de schakeling wordt gezet volgt een soft-start tot de lamp op het vooraf ; ingesteld opstart niveau brand. ;Met de '0' toets in TV mode kan worden gedimd, beurtelings omhoog en omlaag. ;De afstandsbediening moet meer dan één RC5-signaal per toetsindruk uitzenden aangezien de ; eerste wordt genegeerd, dit houdt in dat als de toets van de afstandsbediening heel kort ; wordt ingedrukt, er niets gebeurt. ;Dit is gedaan om met deze '0' toets ook de TV te kunnen bedienen, zonder dat het dim niveau ; veranderd. ;Met de P+ en P- toets van een systeem naar keuze worden de maximale en minimale dim niveaus ; ingesteld en met de '1' toets de opstart instelling. ;De eerstvolgende keer dat de 230V voeding wordt ingeschakeld gaat de lamp op het ingestelde ; niveau branden. ;Uiterste dimniveaus instellen: ;(Alleen nodig als maximum-, minimum- of opstart-niveau moet worden gewijzigd) ;Stel eerst een ongebruikt systeem op de afstandsbediening in, bijvoorbeeld SAT, AMP, VCR2 ; of DCC mode. ;Instellen maximum niveau: Houdt bij het inschakelen van de netspanning de P+ toets van de ; afstandsbediening vast en wacht tot de lamp op de gewenste maximum niveau brand. ;Instellen minimum niveau: Houdt bij het inschakelen van de netspanning de P- toets van de ; afstandsbediening vast en wacht tot de lamp op de gewenste minimum niveau brand. ;Aanbevolen wordt om het minimum dim niveau niet helemaal naar 'lamp uit' te regelen, ; aangezien de schakeling dan makkelijk kan worden vergeten uit te zetten en onnodig stroom ; op blijft nemen. ;Instellen opstart niveau: Houdt bij het inschakelen van de netspanning de '0' toets van de ; afstandsbediening vast en wacht tot de lamp op het gewenste niveau brand. ;Herinstellen van de default waarden (reset): Houdt bij het inschakelen van de netspanning ; de MUTE toets van de afstandsbediening vast. ;Tijdens het instellen van de dimniveaus verloopt het dimniveau langzamer dan normaal, dit ; om het instellen te vergemakkelijken. Als de toets wordt losgelaten en de instelling goed ; is overgenomen dan knipperen de rode en groene LED's even. Met het -voor de dimmer ; gereserveerde- systeem geselecteerd op de afstandsbediening, is met de P+ (omhoog) / ; P- (omlaag), toets '0' (om en om) ook het dimniveau in te stellen. ;Toets '1' dimt naar het ingestelde opstart niveau. ;Welk systeem op de afstandsbediening ook is gekozen, de '0' werkt sowieso in TV mode. ;Onthoudt wel dat een afstandsbediening niet altijd uitzend wat je verwacht. ;De volume van TV, SAT en VCR1 en VCR2 zijn allemaal dezelfde RC5 code. ;Een andere volumegroep is TAPE, TUNER, CD, enz. ;En de '0'-'9' toetsen van systeem TAPE bijvoorbeeld zend helemaal niets uit. ;LET OP, HOGE SPANNING! ;KIJK UIT MET BOUWEN AANGEZIEN DE HELE SCHAKELING ONDER NETSPANNING STAAT!!! ;DE PIC DAAROM NIET PROGRAMMEREN IN DE SCHAKELING ZELF! ;AANGEZIEN DEZE SCHAKELING GEEN TRANSFORMATOR GEBRUIKT, STAAT ALLES ONDER 230V NETSPANNING. ;DE PIC DUS OOK! ;Extra componenten: Print 101226 (of zelf etsen natuurlijk) ; PIC12F629 met programma 'RC5 dimmer_NL' ; U2008B 8-pins IC ; 4N25 optocoupler ; TIC226 triac ; Rood en groen, 3mm LED's ; TSOP1736 IR-ontvanger ; 78L05 kleine spannings regelaar (TO-92) ; NPN transistor BC517 (= darlington, niet vervangen door "zomaar een ander type") ; Diode 1N4007 ; Weerstanden 180E + 470E + 2k2 + 4k7 + 6k8 + 8k2 + 10k + 18k + 68k + 680k ; 9 Watt weerstand 8k2 ; Condensatoren 10n + 3x 100n + (1µF + 2x 2,2µF tant) + ; (47µF/16V + 220µF/25V elco, radiaal) ;There is an English version too / Er is ook een Engelse versie. ;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie) DEVICE 12F629 CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, CP_OFF, MCLRE_OFF ;Interne RC-oscillator, geen clocksign naar buiten (= geen OSC_OUT pin) ;CONFIG XT_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, CP_OFF, MCLRE_OFF ;Kristal 4 MHz XTAL 4 ALL_DIGITAL = TRUE ;Normale aliases (constanten) SYMBOL Cycle = 2 ;Aantal cycles van PWM SYMBOL DefaultSys = 0 ;Default systeem: TV mode SYMBOL DimSlow = 20 ;Extra traag dimmen bij het inprogrammeren van een dimniveau SYMBOL DimSnelheid = 5 ;Snelheid van het veranderen van het dimniveau SYMBOL Glitch = 52 ;Byte, Onderdrukken storingstijd (glitches) SYMBOL InstSpanning= 180 ;Defaultwaarde opstart spanning SYMBOL MaxSpanning = 255 ;Defaultwaarde maximum spanning SYMBOL MinSpanning = 120 ;Defaultwaarde minimum spanning SYMBOL Ok = 50 ;Byte, Controle tijd of RC5 code goed wordt ontvangen SYMBOL Pauze = 30 ;PWM duurt 5mS * Pauze = Minimale overbruggingstijd tussen elke RC5-code (113mS) SYMBOL RC5Down = 33 ;Prg -, niet Vol +/- omdat daar maar 2 soorten van zijn (TV en versterker) SYMBOL RC5Up = 32 ;Prg + SYMBOL UpDateTijd = 5000 ;Tijd dat PWM ge-update wordt (Niet te klein, want dan werkt RC5 niet goed meer SYMBOL Voorkeur = 1 ;Geef RC5-command-code voor de opstart-instellings toets ;Logische aliases (constanten) SYMBOL AAN = 0 ;Bit, Omgekeerd ON SYMBOL FALSE = 0 SYMBOL OFF = 0 SYMBOL ON = 1 SYMBOL TRUE = 1 SYMBOL UIT = 1 ;Bit, Omgekeerd OFF ;EEPROM adres aliases (Op adresnummer) SYMBOL EE_Sys = 0 ;Adres 0: RC5 systeem code SYMBOL EE_Max = 1 ;Adres 1: Maximale spanning SYMBOL EE_Min = 2 ;Adres 2: Minimale spanning SYMBOL EE_Inst = 3 ;Adres 3: Opstart spanning ;Poort aliases ;Bij wijzigen ook TRIS veranderen SYMBOL LED_R = GPIO.0 ;Rode programmeer LED SYMBOL LED_G = GPIO.1 ;Groene signaal LED SYMBOL LED = GPIO.2 ;LED van de 4N25 optocoupler SYMBOL IR_Ontvanger= GPIO.3 ;Uitgang van TSOP1736 ontvanger SYMBOL LED3 = GPIO.4 ;Eventueel voor XTAL (LED = Ontvangst TSOP) SYMBOL Reserve = GPIO.5 ;Eventueel voor XTAL ; 76543210 TRISIO = %11001100 PORTB_PULLUPS OFF ;Word DIM TimeOut AS WORD ;Als al een tijd geen IR-sign meer komt is de toets van de A.B. losgelaten DIM UpDate AS WORD ;Bevat de update tijd voor de PWM DIM WD1 AS WORD ;Word Dummy 1 DIM WD2 AS WORD ;Word Dummy 2 ;Byte DIM Command AS BYTE ;Bevat het ontvangen commando byte DIM DimNiveau AS BYTE ;Bevat de dim-waarde voor de subroutine DimNaarNiveau DIM Spanning AS BYTE ;Bevat de dim-spanning (0=uit, 255=max) DIM Systeem AS BYTE ;Bevat het ontvangen systeem byte DIM BD1 AS BYTE ;Byte Dummy 1 ;Bit DIM Hoger AS BIT ;TRUE = lamp feller, FALSE = lamp zachter DIM IR AS BIT ;Hulp bit bij ontvangst IR signalen DIM PGM_Inst AS BIT ;TRUE als het opstart-niveau wordt ingesteld DIM PGM_Max AS BIT ;TRUE als de bovenste dim grens wordt ingesteld DIM PGM_Min AS BIT ;TRUE als de onderste dim grens wordt ingesteld DIM ProgramMode AS BIT ;TRUE als bij het inschakelen van 230V meteen RC5-code binnenkomt DIM ToggBit AS BIT ;Zit standaard in RC5 code, wordt hier verder niet gebruikt DIM Waarde AS BIT ;Bevat RC5 bit EDATA DefaultSys, MaxSpanning, MinSpanning, InstSpanning ;Default (fabrieks) instellingen GPIO = 0 ;Alle uitgangen uit CLEAR DimNiveau = EREAD EE_Inst ;Stel opstart dim-spanning vast in voor subroutine DimNaarNiveau ProgramMode = TRUE ;Als bij 230V erop meteen al RC5 binnenkomt, dan DIE RC5 systeem-code in EEPROM schrijven Spanning = EREAD EE_Min ;Stel minimale spanning in vanuit EEPROM vanwaar uit opgestart word UpDate = UpDateTijd ;Stel PWM update in GOTO Loop ;Spring over de subroutine's ;Subroutine's BitOphalen: Waarde = 0 IF IR_Ontvanger = UIT THEN Waarde = 1 IR = IR_Ontvanger BD1 = 0 WHILE IR_Ontvanger = IR AND BD1 < Ok INC BD1 WEND DELAYUS 1000 RETURN DimNaarNiveau: REPEAT ;Start lamp dimmend op van 0 naar ingestelde waarde IF Spanning < DimNiveau THEN INC Spanning ;Verhoog spanning met 1 IF Spanning > DimNiveau THEN DEC Spanning ;Verlaag spanning met 1 PWM LED, Spanning, Cycle ;Update de dimmerspanning UNTIL Spanning = DimNiveau ;Loop totdat de spanning gelijk is aan de ingestelde waarde in EEPROM RETURN ;Hoofdprogramma Loop: LED3 = OFF LED_G = OFF LED_R = OFF REPEAT IF UpDate = 0 THEN PWM LED, Spanning, Cycle;Update de dimmerspanning UpDate = UpDateTijd IF ProgramMode = TRUE THEN;Allereerste keer UpDate = 0, NA inschakelen netspanning ProgramMode = FALSE ;Als niet meteen RC5 binnen kwam, dan niet in programmeer mode GOSUB DimNaarNiveau ENDIF ENDIF DEC UpDate UNTIL IR_Ontvanger = AAN ;De RC5-code zelf duurt 24,889ms + 113,778ms pauze tussen de code's in DELAYMS 80 ;80ms, hierna val je dus precies middenin zo'n pauze LED3 = ON TimeOut = 10000 WHILE IR_Ontvanger = UIT AND TimeOut > 1 ;Wacht op start van (2e) RC5 code DEC TimeOut WEND IF TimeOut = 0 THEN Loop ;Niet binnen de tijd een 2e RC5 code ontvangen BD1 = 0 WHILE IR_Ontvanger = AAN AND BD1 < Glitch ;Controleer of het geen glitch is INC BD1 WEND IF BD1 < Glitch THEN Loop ;Error: Glitch '50 ok (AB dichtbij ontvanger) '850 ok, 900 niet meer DELAYUS 500 ;RC5 header overslaan GOSUB BitOphalen Command.6 = Waarde ^ 1 ;Extended bit GOSUB BitOphalen ToggBit = Waarde GOSUB BitOphalen Systeem.4 = Waarde GOSUB BitOphalen Systeem.3 = Waarde GOSUB BitOphalen Systeem.2 = Waarde GOSUB BitOphalen Systeem.1 = Waarde GOSUB BitOphalen Systeem.0 = Waarde GOSUB BitOphalen Command.5 = Waarde GOSUB BitOphalen Command.4 = Waarde GOSUB BitOphalen Command.3 = Waarde GOSUB BitOphalen Command.2 = Waarde GOSUB BitOphalen Command.1 = Waarde GOSUB BitOphalen Command.0 = Waarde IF ProgramMode = TRUE THEN LED_R = ON ;PGM Programmeer-mode LED IF Command = 0 THEN Command = 100 ;Toets 0 zelf is niet te programmeren, geef dummy waarde IF Command = Voorkeur THEN;Toets 'Voorkeur' Command = 0 ;Verder afhandelen in toets '0' routine Hoger = TRUE ;Van laag naar hoog PGM_Inst = TRUE ;Programmeren van het "opstart" niveau Spanning = EREAD EE_Min ;Afregelen vanaf het minimum niveau naar het gewenste niveau EWRITE EE_Sys, [Systeem];Schrijf systeem-code naar EEPROM ENDIF IF Command = 13 THEN EWRITE 1,[MaxSpanning, MinSpanning, InstSpanning] ;MUTE: Default (fabrieks) instellingen ;Toets MUTE IF Command = RC5Up THEN ; + Command = 0 ;Verder afhandelen in toets '0' routine Hoger = TRUE ;Van laag naar hoog PGM_Max = TRUE ;Programmeren van het maximum niveau Spanning = EREAD EE_Min ;Afregelen van het minimum-niveau naar het gewenste maximum niveau EWRITE EE_Sys, [Systeem];Schrijf systeem-code naar EEPROM ENDIF IF Command = RC5Down THEN ; - Command = 0 ;Verder afhandelen in toets '0' routine Hoger = FALSE ;Van hoog naar laag PGM_Min = TRUE ;Programmeren van het minimum niveau Spanning = EREAD EE_Max ;Afregelen van het maximum-niveau naar het gewenste minimum niveau EWRITE EE_Sys, [Systeem];Schrijf systeem-code naar EEPROM ENDIF ELSE IF Systeem = EREAD EE_Sys AND Command = VoorKeur THEN;Stel spanning in op toets 'Voorkeur' LED_G = ON DimNiveau = EREAD EE_Inst;Stel dim-spanning in voor de subroutine DimNaarNiveau GOSUB DimNaarNiveau ENDIF ENDIF IF Systeem = EREAD EE_Sys AND Command = RC5Up THEN ; + van ingeprogrammeerde RC5-systeem Hoger = TRUE ;Lamp feller Command = 0 ;Verder afhandelen in toets '0' routine ENDIF IF Systeem = EREAD EE_Sys AND Command = RC5Down THEN ; - van ingeprogrammeerde RC5-systeem Hoger = FALSE ;Lamp dimmen Command = 0 ;Verder afhandelen in toets '0' routine ENDIF IF Command = 0 THEN IF Systeem = EREAD EE_Sys OR Systeem = 0 THEN ;Systeem toets '0' of TV toets '0' IF ProgramMode = FALSE THEN LED_G = ON ;Groene LED niet tegelijk met rode LED REPEAT IF Hoger = TRUE THEN IF PGM_Max = TRUE THEN IF Spanning < 255 THEN INC Spanning ;In programmeer-mode ELSE IF Spanning < EREAD EE_Max THEN ;Normaal INC Spanning ELSE LED_G = OFF ;Ten teken: maximale niveau bereikt ENDIF ENDIF ELSE IF PGM_Min = TRUE THEN IF Spanning > 0 THEN DEC Spanning ;In programmeer-mode ELSE IF Spanning > EREAD EE_Min THEN ;Normaal DEC Spanning ELSE LED_G = OFF ;Ten teken: minimale niveau bereikt ENDIF ENDIF ENDIF PWM LED, Spanning, Cycle ;Update de dimmerspanning WD1 = 300 ;300 x 500us = 150ms WD2 = WD1 WHILE WD1 > 0 DEC WD1 IF IR_Ontvanger = UIT THEN DEC WD2 ELSE BREAK ENDIF DELAYUS 500 WEND DELAYMS DimSnelheid + DimSlow * ProgramMode;Langzamer van dimniveau veranderen bij programmeren UNTIL WD1 = WD2 ;Als de ontvanger langer dan 200ms uit is, dan is de knop losgelaten Hoger = Hoger ^ 1 ;Volgende keer andere kant op dimmen ENDIF ENDIF IF ProgramMode = TRUE THEN ProgramMode = FALSE ;Programmeer mode uitschakelen IF PGM_Inst= TRUE THEN EWRITE EE_Inst, [Spanning] ELSEIF PGM_Max = TRUE THEN EWRITE EE_Max, [Spanning] IF EREAD EE_Inst > EREAD EE_Max THEN EWRITE EE_Inst, [Spanning] ;Opstart-instelling aanpassen als die hoger is dan maximum-instelling ELSEIF PGM_Min = TRUE THEN EWRITE EE_Min, [Spanning] IF EREAD EE_Inst < EREAD EE_Min THEN EWRITE EE_Inst, [Spanning] ;Opstart-instelling aanpassen als die lager is dan minimum-instelling ELSE GOTO Loop ;Ongeldige programmeertoets gedrukt, dus LED's niet knipperen ENDIF BD1 = 0 REPEAT TOGGLE LED_R ;Knipper LED's ten teken: Nieuwe systeem-code opgeslagen TOGGLE LED_G DELAYMS 150 ;Knipper groene en rode LED beurtelings, zodoende is 1 weerstand voldoende voor beide LED's INC BD1 UNTIL BD1 = 15 PGM_Inst = FALSE PGM_Max = FALSE PGM_Min = FALSE ENDIF DELAYMS 100 GOTO Loop