Telefoon alarm

Gepost door Jeroen Vreuls op zaterdag 17 juni 2017 22:28

Software

Bij het geheel hoort ook een stukje software, dat is geschreven in PIC-Basic. Het gecompileerde programma kan via de aansluiting (helemaal rechts in het schema) in de controller gezet worden.

Hieronder het programma.

'*  Name    : TELEFOONSCHAKELING MET 16F628.                                    
'*  Author  : H van Zwieten.                                   
'*  Notice  : Copyright (c) 2016 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 7-6-2016                                          
'*  Version : 1.0 
;--------------------------------------------------------------------------                                             
; ALARM MELDING VIA EEN VASTE TELEFOONLIJN. BIJ HOOG WATER 
; OF SPANNINGSUITVAL
; WORDT ER NAAR EEN 06 NUMMER GEBELD. HET BELLEN BLIJFT HERHALEN TOT 
; HET ALARM WEG IS, OOK WORDT ER EEN HOORN GEACTIVEERD DOOR HET 
; ALARM RELAIS.                                                                                                
;--------------------------------------------------------------------------

Device 16F628A                         ; Processor type 16F628A

Xtal 10                                ; Kristal 10MHz

Config HS_OSC,_                        ; Interne oscilator uit
       WDT_OFF,_                       ; WatchDog Timer uit
       PWRTE_ON,_                      ; Power-up Timer Enable aan
       MCLRE_OFF,_                     ; Externe Master Reset Enable aan
       BODEN_OFF,_                     ; Brown Out Detectie Enable uit
       LVP_OFF,_                       ; Low-Voltage Programming uit
       CP_OFF                          ; Code Protection uit
         
All_Digital true                       ; Alle poorten digitaal

Symbol VERBINDING_MAKEN = PORTB.0      ; Verbinding maken met telefoonlijn
Symbol ALARM_RELAIS = PORTB.1          ; Relais voor alarm hoorn
Symbol WACHT_LED = PORTB.2             ; Led wacht modus
Symbol NUMMER_BELLEN = PORTB.3         ; Inbellen met DTMF modulatie
Symbol IN_1 = PORTB.4                  ; Ingang_1 vlotter hogwater
Symbol IN_2 = PORTB.5                  ; Ingang_2 controle netspanning

Symbol WACHTTIJD_BELLEN = 5000         ; Wachttijd voor bellen 5 sec
Symbol WACHTTIJD_ALARM = 10000         ; Wachttijd alarm 10 sec
Symbol WACHTTIJD_NAAR_WACHT = 10000    ; Wachttijd naar wacht 10 sec
Symbol KNIPPERTIJD_LED = 500           ; Knippertijd led 0.5 sec
Symbol WACHTTIJD_MELDING_IN = 3000     ; Wachttijd naar run 3 sec
Symbol WACHT_CONTROLE_MELDING = 6000   ; Wachttijd alarm controle 6 sec 

Symbol VOLLUME = 127                   ; Vollume riedel maximaal
Symbol FREQUENTIE_1 = 1000             ; Riedel frequentie_1 is 1KHz
Symbol FREQUENTIE_2 = 3000             ; Riedel frequentie_2 is 3KHz
Symbol RIEDEL = 100                    ; Tijd tussen freq_1 en 2 is 0.1 sec 
Symbol TUSSEN_RIEDEL = 2000            ; Tijd tussen riedel is 2 sec (na 10 X)

Dim X As Byte                          ; X is aantal riedels
Dim TELLER As Byte                     ; Teller aantal herhalingen riedel
Dim TIMER_1 As Byte                    ; Timer alarm relais
Dim TIMER As Word                      ; Timer wachten opnieuw bellen

Clear                                  ; Wis geheugen

        ;76543210                      ; Hulpregel Poort poort_A
PORTA = %00000000                      ; Zet poort_A laag
TRISA = %00000000                      ; Poort_A I/O
                                            
        ;76543210                      ; Hulpregel Poort poort_B
PORTB = %00000000                      ; Zet poort_B laag
TRISB = %00110000                      ; Poort_B I/O

;--------------------------------------------------------------------------
; PROGRAMMA: INBELLEN BIJ EEN ALARMMELDING VAN DE VLOTTER OF 
; SPANNINGS  UITVAL.
;--------------------------------------------------------------------------

;--------------------------------
; VARIABELEN EN UITGANGEN OP NUL.
;--------------------------------

X = 0                                 
TIMER = 0 
TELLER = 0
TIMER_1 = 0
WACHT_LED = 0                                                         
ALARM_RELAIS = 0                      
VERBINDING_MAKEN = 0

;-------------------------------------------------------------------
; ALS ER EEN ALARM BINEN KOMT, WORDT HET ALARM EERST GECONTROLEERD.
;-------------------------------------------------------------------

MELDING_IN:

    TIMER = 0 
    TELLER = 0
    TIMER_1 = 0
    
    If IN_1 = 1 Or IN_2 = 1 Then
     GoTo CONTROLE_MELDING
    EndIf
    
    If IN_1 = 0 And IN_2 = 0 Then      
     ALARM_RELAIS = 0
      WACHT_LED = 0                  
    EndIf                           
GoTo MELDING_IN

;-------------------------------------------------------------
; ALS INGANG_1 OF 2 HOOG IS BELLEN NAAR 06 en naar alarm gaan. 
;------------------------------------------------------------- 
                 
RUN:

    If IN_1 = 0 And IN_2 = 0 Then      
     ALARM_RELAIS = 0 
      WACHT_LED = 0                 
    EndIf                             
    
    If IN_1 = 1 Or IN_2 = 1 Then                         
     CCP1CON = 0
      WACHT_LED = 0                      
       VERBINDING_MAKEN = 1             
        DelayMS WACHTTIJD_BELLEN                    
       DTMFOut NUMMER_BELLEN,250,100,[0,6,0,0,0,0,0,0,0,0]
      DelayMS WACHTTIJD_ALARM                   
     GoTo ALARM                  
    EndIf                             
GoTo RUN 

;--------------------------------------------------------------------------
; NA BELLEN, 10 MAAL RIEDEL VERSTUREN, DAARNA VERBREKEN 
; "DIT DRIEMAAL HERHALEN".
; NA DRIEMAAL HERHALEN "BELLEN PLUS RIEDEL" NAAR DE WACHT MODUS PLUS ALARM.
;--------------------------------------------------------------------------
                            
ALARM:                            

    For X = 9 To 0 Step - 1           
      CCP1CON = 1                      
      Output PORTB.3                   
      HPWM 1,VOLLUME,FREQUENTIE_1                  
      DelayMS RIEDEL                      
      HPWM 1,VOLLUME,FREQUENTIE_2                  
      DelayMS RIEDEL                      
      HPWM 1,VOLLUME,FREQUENTIE_1                  
      DelayMS RIEDEL                      
      HPWM 1,VOLLUME,FREQUENTIE_2                  
      DelayMS RIEDEL                      
      HPWM 1,VOLLUME,FREQUENTIE_1                  
      DelayMS RIEDEL                      
      HPWM 1,VOLLUME,FREQUENTIE_2                  
      DelayMS RIEDEL                     
      HPWM 1,VOLLUME,FREQUENTIE_1                 
      DelayMS RIEDEL                     
      HPWM 1,VOLLUME,FREQUENTIE_2                 
      DelayMS RIEDEL                     
      HPWM 1,VOLLUME,FREQUENTIE_1                 
      DelayMS RIEDEL                     
      HPWM 1,VOLLUME,FREQUENTIE_2                 
      DelayMS RIEDEL                     
      HPWM 1,VOLLUME,FREQUENTIE_1                 
      DelayMS RIEDEL                     
      HPWM 1,VOLLUME,FREQUENTIE_2                 
      DelayMS RIEDEL                     
      HPWM 1,0,0                       
    
      DelayMS TUSSEN_RIEDEL                    
    
      If X = 0 Then                    
       VERBINDING_MAKEN = 0            
        X = 0                         
         TELLER = TELLER + 1          
          DelayMS WACHTTIJD_NAAR_WACHT                 
         If TELLER > 2 Then GoTo WACHT
        If IN_1 = 0 And IN_2 = 0 Then GoTo MELDING_IN 
       GoTo RUN                        
      EndIf                           
    Next X                               
GoTo ALARM 

;--------------------------------------------------------------------
; NA EEN HALF UUR IN DE WACHT MODUS, OPNIEUW BELLEN NAAR 06.
; DIT WORDT NET ZOLANG HERHAALD TOT DAT HET ALARM WEG IS.
; IN DEZE LUS WORDT OOK DE ALARMHOORN GEACTIVEERD OM DE 20 - 
; SECONDEN GAAT HET ALARM VOOR 3 SECONDEN AF GEDURENDE EEN HALF UUR.
;-------------------------------------------------------------------- 
                     
WACHT:                                 

    TELLER = 0
    
    HPWM 1,0,0                         
    
    WACHT_LED = 1                      
    DelayMS KNIPPERTIJD_LED                        
    WACHT_LED = 0                      
    DelayMS KNIPPERTIJD_LED                        
    
    TIMER = TIMER + 1                  
    
    If TIMER > 1800 Then               
     TIMER = 0
      ALARM_RELAIS = 0                         
     GoTo MELDING_IN                          
    EndIf 
    
    TIMER_1 = TIMER_1 + 1  
    
    If TIMER_1 > 19 Then  
     ALARM_RELAIS = 1     
    EndIf              
    
    If TIMER_1 > 22 Then 
     ALARM_RELAIS = 0 
      TIMER_1 = 0     
    EndIf            
                 
    If IN_1 = 0 And IN_2 = 0 Then      
     VERBINDING_MAKEN = 0              
      ALARM_RELAIS = 0                 
      DelayMS WACHTTIJD_MELDING_IN                     
     GoTo MELDING_IN                          
    EndIf                              
GoTo WACHT

;---------------------------------------------------------
; HIER WORDT GEKEKEN OF DE MELDING NIET VALS IS.
; ALS DE MELDING JUIST IS WORDT ER NAAR EEN NUMMER GEBELD.
;---------------------------------------------------------

CONTROLE_MELDING:

    WACHT_LED = 1
    
    DelayMS WACHT_CONTROLE_MELDING
    
    If IN_1 = 1 Or IN_2 = 1 Then
     GoTo RUN
    EndIf
    
    If IN_1 = 0 And IN_2 = 0 Then
     GoTo MELDING_IN
    EndIf
GoTo CONTROLE_MELDING    
   
;-----------------
; EINDE PROGRAMMA.
;----------------- 
                           
End

Achter (DTMFOUT) komt het te kiezen telefoonnummer:

DTMFOut NUMMER_BELLEN,250,100,[0,6,0,0,0,0,0,0,0,0]

In dit geval heb ik even allemaal nullen neergezet achter het 06 gedeelte, er wordt hier naar een 06 nummer gebeld van de persoon waarvoor dit gemaakt is. Na het inbellen worden er zes riedels verstuurd, zodat de gebelde persoon weet dat het om een alarm gaat. Dit wordt tien keer herhaald, na de tien keer wordt er verbroken en een halfuur gewacht. Na het half uur wordt er weer gebeld, dit wordt net zo lang herhaald totdat het alarm is opgeheven.

Als het programma in de wacht modus zit, wordt na 20 seconden ook de hoorn geactiveerd. Deze blijft 2 seconden aan en gaat na 20 seconden weer voor 2seconden aan, dit blijft net zolang herhalen totdat het alarm is opgeheven of als de wacht modus verlaten wordt. De rest van het programma wijst voor zich denk ik.