Tuinverlichtingsautomaat


 


Deze schakeling stelt een apparaat voor om de tuinverlichting automatisch aan te schakelen wanneer het donker wordt. Met behulp van een 12-positie schakelaar kan je kiezen om het licht manueel uit, manueel aan of automatisch te schakelen. Je kunt eveneens kiezen om de tijd te beperken gedurende dewelke het licht aanblijft, van 1 tot 9 uur, of om het aan te laten tot zonsopgang.

Deze schakeling is gebaseerd op de PIC 16C84 (of PIC 16F84) microcontroller. Deze chip is eigenlijk een kleine computer die in één enkele chip bevat is, inclusief RAM geheugen, EEPROM, I/O poorten, centrale verwerkingseenheid enz. Als je deze chip koopt, is hij uiteraard leeg en bevat geen enkel programma. Je moet de broncode (zie link onderaan) compileren en de resulterende machinecode naar de chip downloaden. Hierbij kun je gebruik maken van een kleine "programmer" die verbonden wordt tussen de parallelle poort van de PC en de chip. Voor meer in detail uitleg van dit soort dingen, kun je best eens naar volgende plaats surfen: Getting started with microcontrollers.

De schakeling zelf staat in de source. Hieraan moet echter nog een klein 5V gelijkstroom voedinkje toegevoegd worden (niet getoond in het schema), bijvoorbeeld opgebouwd rond een 78L05 spanningsregelaar, een bruggelijkrichter en een kleine 6V transformator. Verbind een tweede transformator, bijvoorbeeld een zware ringkern transfo van 12VAC bij 300 VA met het relais. Op deze manier kun je een heleboel 12V lampjes verbinden en in de tuin plaatsen.

;;



;; 
;;    Tuinverlichtingsautomaat.asm, a PIC 16F84 program to control garden lights.
;;    
;;    Copyright (C) 2000  Geert Van Espen (geert.van.espen@bigfoot.com)
;;
;;
        
        processor 16c84
        include "p16c84.inc"

;
;
; Schematic diagram used for connecting the input switches, LDR, and relay output to the PIC 16F84
;
;             12-position switch
;
;                        .__1________________________x___________________________________x_____________ RB1
;                       / .__2_______________________|_____x_____________________________|_x___________ RB2
;                      /   .__3______________________|_____|_____x_______________________|_|_x_________ RB3
;            1K       /     .__4_____________________|_____|_____|_____x_________________|_|_|_x_______ RB4
;     _____/\/\/\___./       .__5____________________|_____|_____|_____|_____x___________|_|_|_|_x_____ RB5
;    |                       .__6____________________|_____|_____|_____|_____|_____x_____|_|_|_|_|_x___ RB6
;   +5V                      .__7_________________   |     |     |     |     |     |     | | | | | | 
;                            .__8_______________  |  |     |     |     |     |     |     | | | | | |
;                           .__9______________  | |  |     |     |     |     |     |     / / / / / /
;                          .__10____________  | | |  |     |     |     |     |     |     \ \ \ \ \ \
;                         .__11____________ | | | |  |     |     |     |     |     |     / / / / / /
;                        .__12__________  | | | | |  |     |     |     |     |     |     \ \ \ \ \ \
;                                       | | | | | |  |     |     |     |     |     |     | | | | | |
;                                       | | | | | |  |     |     |     |     |     |     | | | | | |
;   switch positions                    | | | | | |  |     |     |     |     |     |     | | | | | |
;   ****************                    | | | | | |  |     |     |     |     |     |     | | | | | |
;   1  = manual off                     | | | | | |  |     |     |     |     |     |     | | | | | |
;   2  = manual on                      | | | | | |  |     |     |     |     |     |     | | | | | |
;   3  = dusk till dawn                 | | | | | |  |     |     |     |     |     |     |_|_|_|_|_|_
;   4  = +1h                            | | | | | | _|_   _|_   _|_   _|_   _|_   _|_                |
;   5  = +2h                            | | | | | | / \   / \   / \   / \   / \   / \               _|_
;   6  = +3h                            | | | | | | ---   ---   ---   ---   ---   ---
;   7  = +4h                            | | | | | |  |     |     |     |     |     |         7 x 4K7
;   8  = +5h                            | | | | | |__x     |     |     |     |     |
;   9  = +6h                            | | | | |____|_____x     |     |     |     |            ____
;   10 = +7h                            | | | |______|_____|_____x     |     |     |            |   |
;   11 = +8h                            | | |________|_____|_____|_____x     |     |            |   |
;   12 = +9h                            | |__________|_____|_____|_____|_____x     |            |  _|_
;                                       |____________|_____|_____|_____|_____|_____x            |
;                                                    |     |     |     |     |     |            /
;                                                    |     |     |     |     |     |            \
;                                                    |     |     |     |     |     |            /
;                                                   _|_   _|_   _|_   _|_   _|_   _|_           \
;                                                   \ /   \ /   \ /   \ /   \ /   \ /           |
;                                                   ---   ---   ---   ---   ---   ---           |
;                                                    |     |     |     |     |     |            |
;                                                    |_____|_____|_____|_____|_____|____________|________ RB0
;
;
;
;                                                    _______________ +5V
;                                                    |
;                                                    |
;                                                    \
;                                                    / 22K
;                                                    \
;                                                    /
;                                                    |
;                                                    \
;                                                    / 100K POTmeter
;                                                    \
;                                                    /
;                                                    |
;                                                    x___________________________________________________ RB7
;                                                    |
;                                                    |
;                                                    \
;                                                    /
;                                                    \
;                                                    / LDR
;                                                    \
;                                                    /
;                                                    |
;                                                    |______________
;                                                                   |
;                                                                  _|_
;
;
;
;
;
;
;
;
;                                                 | +5V
;                                                 |
;                                        _________x
;                                       |       __|___
;                                      _|_     | relay|
;                                      / \     |______|
;                                      ---        |
;                                       |         |
;                                       |_________x
;                                                 |
;                                                 \
;                                                  \
;                                                   \|____________/\/\/\____________________________ RA0
;                                                   /|              1K
;                                                 |/_
;                                                 /   BC547
;                                                 |
;                                                 |
;                                                 |
;                                                _|_
;
; all diodes 1N4148 or similar
;
;     commando om dit project naar de pic te sturen:
;       TOPIC -RWG TUIN.HEX




                                ; general purpose register allocation


werk    equ     0x0c            ; werkregister
ddd     equ     0x14            ; debug only
t1      equ     0x0d            ; telwerk 1
t2      equ     0x0e            ; telwerk 2
        
TIJDl   equ     0x10            ; to keep track of time
TIJDh   equ     0x11

KLAPPERTIJD equ 0x15            ; hysteresis

LDR_STAND   equ 0x16            ; 0=donker 1=licht

tempvar equ     0x18            ;

Wl      equ     0x20            ;
Wh      equ     0x21            ;

; tijdconstanten
EENuurL equ     0x10            ;
EENuurH equ     0x0e            ; 3600
TWEEuurL equ    0x20            ;
TWEEuurH equ    0x1c            ; 7200
DRIEuurL equ    0x30            ;
DRIEuurH equ    0x2a            ; 10800
VIERuurL equ    0x40            ;
VIERuurH equ    0x38            ; 14400
VIJFuurL equ    0x50            ;
VIJFuurH equ    0x46            ; 18000
ZESuurL equ     0x60            ;
ZESuurH equ     0x54            ; 21600
ZEVENuurL equ   0x70            ;
ZEVENuurH equ   0x62            ; 25200
ACHTuurL equ    0x80            ;
ACHTuurH equ    0x70            ; 28800
NEGENuurL equ   0x90            ;
NEGENuurH equ   0x7e            ; 32400
TIENuurL equ    0x91            ;
TIENuurH equ    0x7e            ; 324101
;;;;;;;;;;;;;;;;

m_input_a equ   b'00000000'     ; input mask, which bits are input
m_input_b equ   b'11111111'     ;

        ;org     0x00            ; reset vector
        goto    main

        dt      "2000-06-04 geert.van.espen@bigfoot.com Tuinverlichting"

initialise:                     ; set up ports

        MOVLW    0
        TRIS     5
        MOVLW    0xFF
        TRIS     6
        MOVLW    0x80
        OPTION


        clrf    TIJDl           ; initialisaties
        clrf    TIJDh           ;
        clrf    KLAPPERTIJD     ;
        clrf    LDR_STAND       ;

        clrf    PORTA           ; UIT laag
        clrf    PORTB


; uitgang even aan en uit laten knipperen om te laten zien dat het
; apparaat werkt
        movlw   1               ;
        movwf   PORTA           ;

        movlw   6               ; knipper 3 keer
        movwf   t1              ;
functiontest:
        movlw   0x19            ; wacht halve seconde
        call    wachtlus        ;
        movlw   1               ;
        btfsc   PORTA,0         ;
        movlw   0               ;
        movwf   PORTA           ;
        decfsz  t1,f            ;
        goto    functiontest    ;
        
        clrf    PORTA           ; UIT laag

        retlw   0

wachtlus:
; wacht x keer 18 milliseconden, met x in w

        movwf   werk            ; zet w in werk
; debug only
; movlw 1
; movwf werk

slapertje:
        sleep                   ;
        decfsz  werk,f          ;
        goto    slapertje       ;
        retlw   0

main:
        ;btfsc   STATUS,NOT_TO   ; if this is a reset or power-up ...
        call    initialise      ; set port drivers and WDT prescaler


start:


test_manual_off:
        btfss   PORTB,1         ; test if manual off input high
        goto    test_manual_off_af; (but RB0 must be low)
        btfsc   PORTB,0         ;
        goto    test_manual_off_af;
        clrf    PORTA           ; UIT laag
        clrf    TIJDl           ;
        clrf    TIJDh           ; TIJD = 0
        movlw   0x5             ; wacht fraktie van seconde
        call    wachtlus        ;
        goto    start           ;
test_manual_off_af:


test_manual_on:
        btfss   PORTB,2         ; test if manual on input high
        goto    test_manual_on_af; (but RB0 must be low)
        btfsc   PORTB,0         ;
        goto    test_manual_on_af;
        movlw   1               ;
        movwf   PORTA           ; UIT hoog
        clrf    TIJDl           ;
        clrf    TIJDh           ; TIJD = 0
        movlw   0x5             ; wacht fraktie van seconde
        call    wachtlus        ;
        goto    start           ;
test_manual_on_af:


test_ldr_stand:
        btfsc   LDR_STAND,0     ;
        goto    test_ldr_stand_af;
        clrf    PORTA           ; UIT laag
        clrf    TIJDl           ; TIJD = 0
        clrf    TIJDh           ;
test_ldr_stand_af:



hysteresis:
        movf    PORTB,w         ;
        movwf   tempvar         ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        movf    tempvar,w       ;
        andlw   1               ;
        subwf   LDR_STAND,w     ;
        btfss   STATUS,Z        ; LDR input = LDR_STAND?
        goto    hyst1           ;
        movlw   0               ;
        movwf   KLAPPERTIJD     ; ja: KLAPPERTIJD = 0
        goto    hyst2           ;
hyst1:  incf    KLAPPERTIJD,f   ; neen: verhoog KLAPPERTIJD
        goto    hyst2           ;
hyst2:
        btfss   KLAPPERTIJD,4   ; KLAPPERTIJD hoog?
        goto    hyst3           ;
        movf    PORTB,w         ;
        movwf   tempvar         ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        rrf     tempvar,f       ;
        movf    tempvar,w       ;
        andlw   1               ;
        movwf   LDR_STAND       ; LDR_STAND = LDR input
        movlw   0               ;
        movwf   KLAPPERTIJD     ; KLAPPERTIJD = 0
hyst3:
        ;SLEEP                  ; main loop sleep
        movlw   0x36            ; 54 = 1 seconde
        call    wachtlus        ;
       
        incf    TIJDl,f         ;
        btfsc   STATUS,Z        ;
        incf    TIJDh,f         ;


test_dusktilldawn:
        btfss   PORTB,3         ; test if dusktilldawn input high
        goto    test_dusktilldawn_af; (but RB0 must be low)
        btfsc   PORTB,0         ;
        goto    test_dusktilldawn_af;
        btfss   LDR_STAND,0     ; LDR_STAND = 1?
        goto    start           ;
        movlw   1               ;
        movwf   PORTA           ; UIT hoog
        clrf    TIJDl           ; TIJD = 0
        clrf    TIJDh           ;
        goto    start           ;
test_dusktilldawn_af:
        btfsc   LDR_STAND,0     ;
        goto    ldrtest_af      ;
        clrf    TIJDl           ; TIJD = 0
        clrf    TIJDh           ;
ldrtest_af:


        movf    TIJDl,w         ; W = TIJD
        movwf   Wl              ;
        movf    TIJDh,w         ;
        movwf   Wh              ;

test_1h:
        btfss   PORTB,4         ; test if 1h input high
        goto    test_1h_af      ; (but RB0 must be low)
        btfsc   PORTB,0         ;
        goto    test_1h_af      ;
        movf    Wl,w            ;
        sublw   EENuurL         ;
        movwf   Wl              ;
        movf    Wh,w            ;
        btfss   STATUS,C        ;
        incf    Wh,w            ;
        sublw   EENuurH         ;
        movwf   Wh              ;
test_1h_af:

test_2h:
        btfss   PORTB,5         ; test if 2h input high
        goto    test_2h_af      ; (but RB0 must be low)
        btfsc   PORTB,0         ;
        goto    test_2h_af      ;
        movf    Wl,w            ;
        sublw   TWEEuurL        ;
        movwf   Wl              ;
        movf    Wh,w            ;
        btfss   STATUS,C        ;
        incf    Wh,w            ;
        sublw   TWEEuurH        ;
        movwf   Wh              ;
test_2h_af:

test_3h:
        btfss   PORTB,6         ; test if 3h input high
        goto    test_3h_af      ; (but RB0 must be low)
        btfsc   PORTB,0         ;
        goto    test_3h_af      ;
        movf    Wl,w            ;
        sublw   DRIEuurL        ;
        movwf   Wl              ;
        movf    Wh,w            ;
        btfss   STATUS,C        ;
        incf    Wh,w            ;
        sublw   DRIEuurH        ;
        movwf   Wh              ;
test_3h_af:

test_4h:
        btfss   PORTB,1         ; test if 4h input high
        goto    test_4h_af      ; (but RB0 must be high)
        btfss   PORTB,0         ;
        goto    test_4h_af      ;
        movf    Wl,w            ;
        sublw   VIERuurL        ;
        movwf   Wl              ;
        movf    Wh,w            ;
        btfss   STATUS,C        ;
        incf    Wh,w            ;
        sublw   VIERuurH        ;
        movwf   Wh              ;
test_4h_af:

test_5h:
        btfss   PORTB,2         ; test if 5h input high
        goto    test_5h_af      ; (but RB0 must be high)
        btfss   PORTB,0         ;
        goto    test_5h_af      ;
        movf    Wl,w            ;
        sublw   VIJFuurL        ;
        movwf   Wl              ;
        movf    Wh,w            ;
        btfss   STATUS,C        ;
        incf    Wh,w            ;
        sublw   VIJFuurH        ;
        movwf   Wh              ;
test_5h_af:

test_6h:
        btfss   PORTB,3         ; test if 6h input high
        goto    test_6h_af      ; (but RB0 must be high)
        btfss   PORTB,0         ;
        goto    test_6h_af      ;
        movf    Wl,w            ;
        sublw   ZESuurL         ;
        movwf   Wl              ;
        movf    Wh,w            ;
        btfss   STATUS,C        ;
        incf    Wh,w            ;
        sublw   ZESuurH         ;
        movwf   Wh              ;
test_6h_af:

test_7h:
        btfss   PORTB,4         ; test if 7h input high
        goto    test_7h_af      ; (but RB0 must be high)
        btfss   PORTB,0         ;
        goto    test_7h_af      ;
        movf    Wl,w            ;
        sublw   ZEVENuurL       ;
        movwf   Wl              ;
        movf    Wh,w            ;
        btfss   STATUS,C        ;
        incf    Wh,w            ;
        sublw   ZEVENuurH       ;
        movwf   Wh              ;
test_7h_af:

test_8h:
        btfss   PORTB,5         ; test if 8h input high
        goto    test_8h_af      ; (but RB0 must be high)
        btfss   PORTB,0         ;
        goto    test_8h_af      ;
        movf    Wl,w            ;
        sublw   ACHTuurL        ;
        movwf   Wl              ;
        movf    Wh,w            ;
        btfss   STATUS,C        ;
        incf    Wh,w            ;
        sublw   ACHTuurH        ;
        movwf   Wh              ;
test_8h_af:

test_9h:
        btfss   PORTB,6         ; test if 9h input high
        goto    test_9h_af      ; (but RB0 must be high)
        btfss   PORTB,0         ;
        goto    test_9h_af      ;
        movf    Wl,w            ;
        sublw   NEGENuurL       ;
        movwf   Wl              ;
        movf    Wh,w            ;
        btfss   STATUS,C        ;
        incf    Wh,w            ;
        sublw   NEGENuurH       ;
        movwf   Wh              ;
test_9h_af:

test_10h:
        movf    Wl,w            ;
        sublw   TIENuurL        ;
        movwf   Wl              ;
        movf    Wh,w            ;
        btfss   STATUS,C        ;
        incf    Wh,w            ;
        sublw   TIENuurH        ;
        movwf   Wh              ;
test_10h_af:


test_overtime:
        btfss   STATUS,C        ; W < 0 ?
        goto    overtime        ;
no_overtime:
        btfss   LDR_STAND,0     ; LDR_STAND = 1?
        goto    test_overtime_af;
        movlw   1               ;
        movwf   PORTA           ; UIT hoog
        goto    test_overtime_af;
overtime:
        clrf    PORTA           ; UIT laag
        movlw   0xf8            ;
        movwf   TIJDl           ;
        movlw   0x7f            ;
        movwf   TIJDh           ; TIJD = 32760
        goto    test_overtime_af;
test_overtime_af:




        goto    start           ;

        ;; 
        ;;
        
        end



Voorbeeld van een klevertje voor de 12-positie schakelaar:

Stroomschema (Word 97 document) Stroomschema (PDF formaat)

Foto van het afgewerkte apparaat

  Home         Terug naar Electronica projecten