Alarmanlage mit C-Control Mega 128

Inhalt

Projektbeschreibung

alte Alarmanlage Eine aus dem Jahr 1988 stammende Alarmanlage basierend auf einem Conrad-Bausatz sollte erneuert werden. Die Anlage hatte über 25 Jahre einwandfrei funktioniert, leider war aber der verwendete Microprozessor CTC 1189 in dieser Zeit mehrfach dem Blitzschlag zum Opfer gefallen und letztlich war dieser Typ nicht mehr am Markt verfügbar. Die vorhandenen Alarmgeber und somit das bewährte Konzept und die Funktionen der alten Anlage sollten grundsätzlich beibehalten werden:

  • drahtgebundene Alarmkontakte über Bewegungsmelder in verschiedenen Räumen
  • Abschaltung einzelner Schleifen bei Bedarf
  • Sabotage- und Panikkontakte
  • Optischer und akustischer Alarm über Dachsirene und interne Meldeeinheit
  • Netz- und Batteriebetrieb
  • Einstellung von Alarmzeit, Alarmverzögerung und Scharfschaltverzögerung
  • Aktivierung und Stoppen der Anlage von verschiedenen Standorten

Die vorliegende Aufgabe wurde durch den Einsatz eines C-Control Mega 128 gelöst. Die Ansteuerung der Eingänge über Optokoppler fand auf der Entwicklungsboard-Platine der C-Control Einheit Platz. Das Board wurde auf eine größere Basisplatine aufgesetzt, diese enthielt die Stromversorgung und die erweiterten Anschlüsse für die Ein- und Ausgänge der Anlage.

Die komplette Basisplatine sowie ein separates Bedienpanel konnten in den vorhandenen Bedienschrank eingebaut werden. Eine externe Steuerung der Anlage erfolgte je nach Standort über Taster oder vom Handy über die App eines Homematic-Systems.

Die Programmierung des Mega128 erfolgte über einen entsprechend zugeschnittenen Basic-Code.

Hardware

Die gesamte Anlage wurde auf 3 Platinen aufgebaut:

  • C-Control Entwicklungsbord mit den Ein- und Ausgängen über Optokoppler
  • Basisplatine mit Stromversorgung und Ansteuerung der Ein- und Ausgänge sowie als Trägerplatine für das Entwicklungsboard
  • Platine für das Bedienpanel im Schrank

Die Schaltung und der Aufbau der Anlage werden aus den folgenden Bildern ersichtlich:

Alarmanlage C-Control Platine

Alarmanlage Blockschaltbild

Alarmanlage Hauptplatine

Alarmanlage Gesamtansicht

Alarmanlage Bedienpanel

Eine detaillierte Beschreibung der Schaltung dürfte sich erübrigen, da die Funktion aus den vorgelegten Schaltplänen hervorgeht. Bei den externen Eingängen ist folgende Besonderheit zu beachten:

Alarmanlage Eingangsschaltung

Software

Das Basic-Programm für die C-Control Mega 128 sieht wie folgt aus:


  '---------2---------3---------4----------5----------6---------7---------8---------9
  '
  '      Programm für C-Control Mega 128 zur Steuerung der Alarmanlage
  '      =============================================================
  '
  '      Projektname:         KJS_Alarmanlage.cprj
  '      Funktionen:          - Anlagen Reset
  '                           - Anlage scharfschalten
  '                           - Eingänge auslesen und auswerten
  '                           - Anzeige aller Aktionen auf dem LCD Display
  '                           - Alarm auslösen
  '                           - Alarmdaten speichern
  '      Benötigte Libs:      IntFunc_lib.cc, LCD_Lib.cc
  '      Autor:               Karl-Josef Schneider
  '      Erstelldatum:        06.01.2015
  '      Letzte Bearbeitung:  08.12.2015
  '                           Paniktaste integriert
  '                           individuelle Alarm-Verzögerungszeiten festgelegt
  '---------2---------3---------4----------5----------6---------7---------8---------9

  '   Zuordnung der Ports für Input und Output
  '   -------------------------------------------------------------------------------
  '
  '          Port    Port    Zuordnung   Zuordnung           I / O   Portzustand
  '                  Bit     original    hier                        Passiv  Aktiv
  '          ---------------------------------------------------------------------
  '          D.0     24      I2C         Alarm akustisch     Output  High    Low
  '          D.1     25      I2C         Alarm optisch       Output  High    Low
  '          E.0     32      RS232       Input Paniktaste    Input   High    Low
  '          E.1     33      RS232       Input 1. Etage      Input   High    Low
  '          E.4     36      SW1         Anlage RESET        Input   High    Low
  '          E.6     38      SW2         Anlage SCHARF       Input   High    Low
  '          F.0     40                  Input Garten        Input   High    Low
  '          F.1     41                  Input Keller        Input   High    Low
  '          F.2     42                  Input frei unten    Input   High    Low
  '          F.3     43                  Input Sabotage      Input   High    Low
  '          F.4     44                  Input Terasse       Input   High    Low
  '          F.5     45                  Input frei oben     Input   High    Low
  '          F.6     46                  Input Hausflur      Input   High    Low
  '          F.7     47                  Input Wohnzimmer    Input   High    Low
  '          G.3     51      LED1        Alarm AUS           Output  High    Low
  '          G.4     52      LED2        Alarm EIN           Output  High    Low

  '   Variablendeklaration
  '   -------------------------------------------------------------------------------
      Dim SCHARF As Integer                        'Wert = 1 wenn Scharf, sonst = 0
      Dim Zeile1(10) As Char                       'Display variablen definieren
      Dim Zeile2(10) As Char                       'Display variablen definieren
      Dim Zeit As Word                             'Zeit in Sekunden für Countdown
      Dim Timer_Scharf As Integer                  'Verzögerungszeit für SCHARF [sec]
      Dim Timer_Alarm As Integer                   'Verzögerungszeit für ALARM [sec]
      Dim Timer_Dauer As Integer                   'Dauer des Alarmsignals in Sec
      Dim i As Integer                             'Zählvariable

  '   Hauptprogramm
  '   ===============================================================================
      Sub main()

  '   Ports als Input oder Output definieren und Pull-Up setzen
  '   Syntax: Port_DataDirBit(portbit,val);(val=0=in, val=1=out)
  '   -------------------------------------------------------------------------------
      Port_DataDirBit(24,1)                        'PortD.0 = Output  Alarm AUS
      Port_WriteBit(24,1)                          'Pull-Up für PortD.0 setzen
      Port_DataDirBit(25,1)                        'PortD.1 = Output  Alarm EIN
      Port_WriteBit(25,1)                          'Pull-Up für PortD.1 setzen
      Port_DataDirBit(32,0)                        'PortE.0 = Input Paniktaste
      Port_WriteBit(32,1)                          'Pull-Up für PortE.0 setzen
      Port_DataDirBit(33,0)                        'PortE.1 = Input 1. Etage
      Port_WriteBit(33,1)                          'Pull-Up für PortE.1 setzen
      Port_DataDirBit(36,0)                        'PortE.4 = SW1 = Eingang RESET
      Port_WriteBit(36,1)                          'Pull-Up für SW1 setzen
      Port_DataDirBit(38,0)                        'PortE.6 = SW2 = Eingang SCHARF
      Port_WriteBit(38,1)                          'Pull-Up für SW2 setzen
      Port_DataDirBit(40,0)                        'PortF.0 = Input Garten
      Port_WriteBit(40,1)                          'Pull-Up für PortF.0 setzen
      Port_DataDirBit(41,0)                        'PortF.1 = Input Keller
      Port_WriteBit(41,1)                          'Pull-Up für PortF.1 setzen
      Port_DataDirBit(42,0)                        'PortF.2 = Input frei unten
      Port_WriteBit(42,1)                          'Pull-Up für PortF.2 setzen
      Port_DataDirBit(43,0)                        'PortF.3 = Input Sabotageschalter
      Port_WriteBit(43,1)                          'Pull-Up für PortF.3 setzen
      Port_DataDirBit(44,0)                        'PortF.4 = Input Terasse
      Port_WriteBit(44,1)                          'Pull-Up für PortF.4 setzen
      Port_DataDirBit(45,0)                        'PortF.5 = Input frei oben
      Port_WriteBit(45,1)                          'Pull-Up für PortF.5 setzen
      Port_DataDirBit(46,0)                        'PortF.6 = Input Hausflur
      Port_WriteBit(46,1)                          'Pull-Up für PortF.6 setzen
      Port_DataDirBit(47,0)                        'PortF.7 = Input Wohnzimmer
      Port_WriteBit(47,1)                          'Pull-Up für PortF.7 setzen
      Port_DataDirBit(51,1)                        'PortG.3 = Output  LED Alarm AUS
      Port_DataDirBit(52,1)                        'PortG.4 = Output  LED Alarm EIN

  '   Initialisierung des LCD
  '   -------------------------------------------------------------------------------
      LCD_Init()                                   'LCD Initialisieren
      LCD_ClearLCD()                               'Display löschen
      LCD_CursorOff()                              'Display Cursor ausschalten

  '   Startwerte für Timer [sec] festlegen und Anlagen-Reset durchführen
  '   -------------------------------------------------------------------------------
      Timer_Scharf = 300                           'Verzögerungszeit Scharfstellung
      Timer_Alarm = 300                            'Verzögerungszeit für Alarmsignal
      Timer_Dauer = 60                             'Dauer des Alarmsignals
      Reset()                                      'Reset wird durchgeführt

  '   Endlosschleife
  '   -------------------------------------------------------------------------------
      Do While (1)
         If Port_ReadBit(36) = 0 Then              'SW1 erkannt
            Reset()                                'Reset der Anlage
         End If
         If Port_ReadBit(38) = 0 Then              'SW2 erkannt
            Scharf()                               'Anlage scharfstellen
         End If
         If Port_ReadBit(32) = 0 Then              'Paniktaste erkannt
            Zeile2 = " Panik  "
            Timer_Alarm = 0                        'ohne Verzögerung für Alarmsignal
            Alarm()                                'Alarm auslösen
         End If
         If SCHARF = 1 Then                        'Wenn Anlage scharf
            Abfrage()                              'Input-Ports lesen
         End If
         Anzeige()                                 'Ausgabe der Texte auf LCD-Display
      End While

      End Sub
  '   ===============================================================================

  '   Anlagen-Reset durchführen
  '   *******************************************************************************
      Sub Reset()
          LCD_CursorPos(00)                        '? LCD läuft sonst nicht sauber an
          SCHARF = 0                               'Anlage entschärfen
          Port_WriteBit(51,0)                      'LED1 "Alarm AUS" einschalten
          Port_WriteBit(52,1)                      'LED2 "Alarm EIN" ausschalten
          Port_WriteBit(24,1)                      'Alarm "akustisch" ausschalten
          Port_WriteBit(25,1)                      'Alarm "optisch" ausschalten
          Zeile1 = " Anlage "                      'Text Zeile 1
          Zeile2 = "  AUS   "                      'Text Zeile 2
          Anzeige()                                'Ausgabe der Texte auf LCD-Display
      End Sub

  '   Anlage verzögert scharfschalten
  '   *******************************************************************************
      Sub Scharf()
          Port_WriteBit(51,1)                      'LED1 "Alarm AUS" ausschalten
          Zeit = Timer_Scharf
          For i = 0 To Timer_Scharf                'Verzögerungszeit in Sekunden
          If Port_ReadBit(36)=0 Then Exit:End If   'Wenn Taste gedrückt Startabbruch
              Port_WriteBit(52,0)                  'LED2 "Alarm EIN" einschalten
              Zeit = Timer_Scharf-i
              LCD_Locate(1,1)                      'Position für Text Zeile 1
              LCD_WriteText ("Start in")           'Text Zeile 1
              LCD_Locate(2,1)                      'Position für fixen Text Zeile 2
              LCD_WriteText ("    Sec ")           'fixer Text Zeile 2
              If Zeit > 9 Then                     'Position variabler Text Zeile 2
                 LCD_Locate(2,2)
                 Else LCD_Locate(2,3)
              End If
              LCD_WriteWord(Zeit,1)                'variabler Text Zeile 2
              AbsDelay(500)                        'Pause 1/2 Sekunde
          If Port_ReadBit(36)=0 Then Exit:End If   'Wenn Taste gedrückt Startabbruch
              Port_WriteBit(52,1)                  'LED2 "Alarm EIN" ausschalten
              AbsDelay(500)                        'Pause 1/2 Sekunde
          Next
          Port_WriteBit(52,0)                      'LED2 "Alarm EIN" einschalten
          SCHARF = 1                               'Anlage scharfschalten
          Zeile1 = " Anlage "                      'Text Zeile 1
          Zeile2 = " scharf "                      'Text Zeile 2
      End Sub

  '   Abfrage der Eingangsports und festlegen der Aktionen
  '   *******************************************************************************
      Sub Abfrage()
          If Port_ReadBit(33) = 0 Then              '1. Etage
             Zeile2 = "1. Etage"
             Timer_Alarm = 45                       '45 sec Alarmverzögerung
             Alarm()
          End If
          If Port_ReadBit(40) = 0 Then              'Garten
             Zeile2 = " Garten "
             Timer_Alarm = 45                       '45 sec Alarmverzögerung
             Alarm()
          End If
          If Port_ReadBit(41) = 0 Then              'Keller
             Zeile2 = " Keller "
             Timer_Alarm = 45                       '45 sec Alarmverzögerung
             Alarm()
          End If
          If Port_ReadBit(42) = 0 Then              'frei unten
             Zeile2 = "  unten "
             Timer_Alarm = 45                       '45 sec Alarmverzögerung
             Alarm()
          End If
          If Port_ReadBit(43) = 0 Then              'Sabotageschalter
             Zeile2 = "Sabotage"
             Timer_Alarm = 15                       '15 sec Alarmverzögerung
             Alarm()
          End If
          If Port_ReadBit(44) = 0 Then              'Terasse
             Zeile2 = " Terasse"
             Timer_Alarm = 45                       '45 sec Alarmverzögerung
             Alarm()
          End If
          If Port_ReadBit(45) = 0 Then              'frei oben
             Zeile2 = "  oben  "
             Timer_Alarm = 45                       '45 sec Alarmverzögerung
             Alarm()
          End If
          If Port_ReadBit(46) = 0 Then              'Hausflur
             Zeile2 = "Hausflur"
             Timer_Alarm = 30                       '30 sec Alarmverzögerung
             Alarm()
          End If
          If Port_ReadBit(47) = 0 Then              'Wohnzimmer
             Zeile2 = "Wohnzimm"
             Timer_Alarm = 45                       '45 sec Alarmverzögerung
             Alarm()
          End If
      End Sub
  '   *******************************************************************************

  '   Alarmverzögerung
  '   *******************************************************************************
      Sub Alarm()
          Zeit = Timer_Alarm                       'Zeit = Verzögerungszeit
          For i = 0 To Timer_Alarm                 'Verzögerungszeit in Sekunden
          If Port_ReadBit(36)=0 Then Exit:End If   'Wenn Taste gedrückt Startabbruch
             Port_WriteBit(52,0)                   'LED2 "Alarm EIN" einschalten
             Zeit = Timer_Alarm-i                  'Zeit zurückzählen
             LCD_Locate(1,1)                       'Position für Text Zeile 1
             LCD_WriteText ("Alarm in")            'Text Zeile 1
             LCD_Locate(2,1)                       'Position für fixen Text Zeile 2
             LCD_WriteText ("    Sec ")            'fixer Text Zeile 2
             If Zeit > 9 Then                      'Position variabler Text Zeile 2
                LCD_Locate(2,2)
                Else LCD_Locate(2,3)
             End If
             LCD_WriteWord(Zeit,1)                 'variabler Text Zeile 2
             AbsDelay(500)                         'Pause 1/2 Sekunde
          If Port_ReadBit(36)=0 Then Exit:End If   'Wenn Taste gedrückt Startabbruch
             Port_WriteBit(52,1)                   'LED2 "Alarm EIN" ausschalten
             AbsDelay(500)                         'Pause 1/2 Sekunde
          Next
          Port_WriteBit(52,0)                      'LED2 "Alarm EIN" einschalten
          Zeile1 = "*Alarm!*"                      'Text Zeile 1
          Anzeige()                                'Textausgabe auf LCD-Display
          Alarmsignal()
      End Sub

  '   Alarmsignal auslösen
  '   *******************************************************************************
      Sub Alarmsignal()
          Port_WriteBit(24,0)                      'Alarm "akustisch" einschalten
          Port_WriteBit(25,0)                      'Alarm "optisch" einschalten
          Zeit = Timer_Dauer                       'Zeit = Alarmdauer
          For i = 0 To Timer_Dauer                 'Alarmdauer in Sekunden
          If Port_ReadBit(36)=0 Then Exit:End If   'Wenn Taste gedrückt Startabbruch
             Zeit = Timer_Dauer-i                  'Zeit zurückzählen
             AbsDelay(500)                         'Pause 1/2 Sekunde
          If Port_ReadBit(36)=0 Then Exit:End If   'Wenn Taste gedrückt Startabbruch
             AbsDelay(500)                         'Pause 1/2 Sekunde
          Next
          Port_WriteBit(24,1)                      'Alarm "akustisch" ausschalten
          Port_WriteBit(25,1)                      'Alarm "optisch" ausschalten
      End Sub

  '   Ausgabe der Tastatureingaben auf dem LCD-Display
  '   *******************************************************************************
      Sub Anzeige()
          LCD_CursorOff()                          'Display Cursor ausschalten
          LCD_CursorPos(00)                        'Position für Text Zeile 1
          LCD_WriteText(Zeile1)                    'Zeile 1 ausgeben
          LCD_CursorPos(40)                        'Position für Text Zeile 2
          LCD_WriteText(Zeile2)                    'Zeile 2 ausgeben
      End Sub
  '   *******************************************************************************