Gepost door Jeroen Vreuls op zaterdag 17 juni 2017
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.