* * * * * Willkommen bei RolandPudimat.de! * * * * *


Keine Werbung!
Keine Cookies!


Du bist der . Besucher seit dem 22.09.2009.
Du bist hier: [Startseite] · [Projekte] · Alarmanlage

Alarmanlage


Die österreichische Band EAV textete: „Das Böse ist immer und überall!“ Meine alte Alarmanlage versandte bei Einbruch keine SMS mehr. Die Anlage wurde in CN entwickelt und hergestellt. Mir war es mangels Dokumentation nicht gelungen, den Fehler zu finden und zu beheben.


Weil ich nicht darauf verzichten wollte, bei Einbruch eine Nachricht zu erhalten, beschloss ich den Selbstbau einer SMS-Einbruchmeldeanlage. Die EMA sollte einfach aufgebaut und zuverlässig sein. Eine selbstgebaute EMA hat den Vorteil, hinsichtlich der Funktion die eigenen Vorstellungen umzusetzen und reparabel und erweiterbar zu sein. Dank der fleißigen Chinesen ist es heute kein Problem, alle Komponenten zu einem akzeptablen Preis zu beschaffen.


Die EMA wird mit einem Mikrorechner (PIC) von Microchip gesteuert. “PIC” steht für Programmable Intelligent Computer. Der PIC wertet die Signale von Meldern aus und gibt optische, akustische und SMS-Alarmmeldungen aus. Im Internet fand ich Angebote für eine Entwicklungsplatine mit einer 40-poligen Klemmfassung, ein GSM-Modul vom Typ A6 und einen PIC-Brenner vom Typ PICKit 3.


Ich hatte noch PIC16F628A auf Lager. Der 18-Pin PIC16F628A ist nicht mehr der neuste und hat wenig Speicherplatz. Mehr Möglichkeiten bieten PIC18F der nächsten Generation, wie z.B. der PIC18F14K22 (20 Pin).


Für PICs werden komplett bestückte Entwicklungsplatinen für weniger als 10 EUR angeboten. Auf der von mir verwendeten Entwicklungsplatine sind alle Pins des PIC über Steckerleisten kontaktierbar, so dass man die Ein- und Ausgaben eines Programms testen kann. Dank Klemmfassung ist der PIC schnell testbereit. Die Platine enthält auch einen Stecker für die Stromversorgung, einen Steckplatz für einen Quarz zur Takterzeugung und eine Programmierschnittstelle des PIC.


Die am häufigsten eingesetzte Programmiersprachen für Mikrocontroller sind Assembler oder C. Microchip stellt kostenlos die Entwicklungsumgebung MPLAB X und den XC8-Compiler zur Verfügung. Ein in C entworfenes Programm kann mit dem XC8-Compiler in ausführbaren Maschinencode (HEX-Datei) gewandelt werden. Der Maschinencode wird mit dem Programmiergerät PICKit 3 in den Flash-EEPROM-Speicher des PIC geschrieben- Elektronikersprech: “gebrannt”.


Ich bin C-Einsteiger. Im Netz finden sich diverse C-Kurse, die den Einstieg erleichtern: z.B:
https://pic-projekte.de/blog/ , oder
http://www.sprut.de/electronic/pic/c/c.html .
Auch das locker geschriebene Buch „C für Dummies “ (616 Seiten, Standard-C) von Dan Gookin war sehr hilfreich.
Das C-Programm zum Steuern meiner EMA beruht auf einer Bauanleitung, die am 08.02.2018 hier zu finden war:
http://www.instructables.com/id/SMS-Alarm-With-PIC-Microcontroller/


Die Datei ema.c enthält das Hauptprogramm und Unterprogramme.


Zu Beginn werden mit #pragma config-Anweisungen die Konfigurationsbits für den PIC gesetzt. Mit #define-Anweisungen erhalten die verwendeten Pins sinnvolle Bezeichner und die Frequenz des internen Taktgebers wird bekannt gegeben.


Es ist zweckmäßig, die Pins RB6-7 für ein In-Circuit Serial Programming (ICSP) freizuhalten- sonst gibt der Brenner bzw. MPLAB X eine Fehlermeldung aus.


Dann werden globale Variablen deklariert. Es folgen die Anweisungen für die Unterprogramme und schließlich die Funktion main mit den Anweisungen des Hauptprogramms.


Konfiguration:
Die UART-Pins TX und RX des 628A, werden als Eingänge definiert (auch TX ): TRISB = 0bxxxxx11x; // RB1+2: UART RX TX
(Datenblatt: “Bit SPEN (RCSTA<7>) and bits TRISB<2:1> have to be set in order to configure pins RB2/TX/CK and RB1/RX/DT as the Universal Synchronous Asynchronous Receiver Transmitter.”)


Mit einem Terminalprogramm kann mit AT+IPR? die voreingestellte Baudrate b des GSM-Modules bestimmt werden. Beim Konfigurieren der seriellen Ausgabe muss entsprechend der Taktfrequenz f und der Baudrate b der korrekte Wert für das SPBRG-Register angegeben werden. Um eine Beschaltung mit einem externen Quarz incl. zweier Kondensatoren zu sparen, habe ich mich für den Betrieb mit internen Taktgeber f= 4000000 Hz entschieden. Dadurch stehen auch bei Bedarf die PIN RA6 und RA7 als Eingänge bzw. Ausgänge zur Verfügung. Als Baudrate habe ich b=19200 Bd gewählt, so dass die Daten mit einer geringen Fehlerrate von +0,16% übertragen werden. Mit AT+IPR=19200 setzen und mit AT&W die zu verwendende Baudrate im GSM-Modul speichern.


SPRG: 12 = (f/16b)-1, mit f = 4000000 Hz, b = 19200 Bd, +0,16% Fehler


Das Ein-Ausgabe-Verhalten der meisten PIN muss durch Setzen bzw. Löschen von Steuerbits in Registern voreingestellt werden, z.B.:
CMCON = 0b00000111; // 7 = alle Komparatoren AUS, RA0-3 als I/O
ADCON1 = 0b00000111; // 7 = alle PIN digital
INTCON = 0b00000000; // verhindere Interrupts
TRISy = 0bxxxxxxxx; // für PORTy: x=1 Input, x=0 Output


Eingaben:
Die Eingänge des PIC, die mit den NC-Meldern in ZONE1-3 verbunden sind, liegen im unbetätigten Zustand an 0V, d.h., an logisch 0. Öffnet ein Melderkontakt, dann wird der entsprechende Eingang mit 10k gegen +5V, d.h., logisch 1, gezogen.
Je ZONE1-3 können mehrere NC-Melder in Reihe geschaltet werden.
Die Eingänge von TASTER, SCHALTER1, SCHALTER2 liegen ebenfalls über 10K an +5V, d.h., an logisch 1. Wenn der Taster bzw. ein Schalter geschlossen wird, liegt der entsprechende Eingang auf logisch 0.
Die laufende Abfrage einschließlich Entprellen der Eingänge ist eine der Hauptfunktionen des die EMA steuernden Programms.


Entprellen:

Wenn mechanische Kontakte von Meldern, Tastern und Schaltern betätigt werden, tritt Kontaktprellen auf. Beim Aufeinanderprallen von zwei Kontakten handelt es sich um teilelastische mechanische Stoßvorgänge. Die Kontakte haben jeweils eine eigene Masse, Federkonstante und Dämpfung. Durch Energieverlust hat der bewegte Kontakt nach dem Stoß eine geringere Relativgeschwindigkeit als vor dem Stoß. Das Prellen klingt mit der Zeit ab. Durch das Prellen treten innerhalb von Millisekunden an einem Eingangs-PIN des PIC mehrere Signalwechsel auf, die zu einem unerwünschten Programmablauf führen können.
Ich habe versuchsweise einen Stabmagneten 40mal je Sekunde an einem Reedkontakt vorbei rotieren lassen. Bei geschlossenem Kontakt floß ein Strom von 5mA durch 1 kOhm. Das Oszillogramm zeigt, dass das Prellen nach ca. 0,2 ms abgeklungen ist.
Obwohl die EMA die meiste Zeit vor sich hinschläft, d.h., zeitunkritisch ist, habe ich mich dennoch entschieden, etwas gegen das Prellen zu tun.


In main.c wird eine Funktion zum Entprellen nach Christian Riggenbach aufgerufen. Am 23.03.2018 hier:
https://www.mikrocontroller.net/articles/Entprellung#Warteschleifen-Verfahren


Eine for-Schleife wird erst dann verlassen, wenn der Pegel an einem Eingang in acht hintereinander folgenden Schleifendurchläufen konstant war. In jedem Durchlauf wird 150 us gewartet, so dass in 8 * 150 us = 1,2 ms das Prellen höchstwahrscheinlich vorüber ist. Dauert das Prellen länger, folgen weitere Schleifendurchläufe bis der Eingangspegel stabil bleibt.


Um innerhalb der Funktion lesend und schreibend auf das PORT-Register zugreifen zu können, ist es notwendig, den PORTx als Pointer ("by reference") zu übergeben. *port muss als "volatile" deklariert werden, so dass dass der Wert dieser Variablen vor jedem Zugriff neu aus dem Hauptspeicher eingelesen werden muss. Ohne "volatile" gibt der Kompiler eine Warnung aus. An die Variable "maske" wird der Binärwert des zu entprellenden Eingangspin übergeben:
0b00000100 steht für Bit2/PIN2 des PORTx.


Ausgaben:
Die logischen Pegel an den Eingängen werden zu Ausgabesignalen verarbeitet. Bei Alarm werden über die serielle Schnittstelle UART des PIC AT-Befehle an das GSM-Modem ausgegeben, welches eine Alarm-SMS an ein Empfänger-Telefon absetzt. Ist SCHALTER2 geschlossen, wird im Internmodus ein Auslösen des Bewegungsmelders ignoriert, keine SMS abgesetzt und bei Alarm der SUMMER eingeschalten.


Programmablauf:
- Mit init_PIC(); wird der PIC initiiert.
- Wenn der PIC bereit ist, gibt es eine Bestätigung mit doppel_PIEP(); und doppel_BLINK(); einen Doppelton und 2mal LED-Blinken.
- Wenn der SCHALTER1 geschlossen ist, wird das UP geh_TEST(); ausgeführt, wobei die LED_STATUS leuchtet. Wenn ein Melder zum Testen ausgelöst wird, leuchtet die LED_TASTER auf und als ok wird ein Doppelpiep ausgegeben.
- Ohne Gehtest wird mit pruefe_MELDER(); überprüft, ob eine Tür oder ein Fenster offen steht (ZONEx ausgelöst). Ist ein Melder ausgelöst, blinkt die LED_TASTER. Das Programm wird erst fortgesetzt, wenn die Tür/ das Fenster verschlossen wurde. Sind alle Zonen bereit, gibt es einen Doppelpiep und 2mal LED-Blinken. Die EMA ist ab hier aktivierbar.
- Ein Drücken des Start-Stopp-TASTER wird mit Doppelpiep und 2mal LED-Blinken quittiert. Das UP aktivieren_EMA(); läuft ab, wobei während einer Ausgangsverzögerung av =20s der SUMMER Pieptöne ausgibt und die LED_STATUS blinkt. Nach Ablauf der Ausgangsverzögerung gibt es als Scharfschaltsignal einen Doppelpiep und 2mal LED-Blinken.
- Nach dem Scharfschalten befindet sich das Programm in der Programm-Hauptschleife: while(1).
- Bei Einbruch oder Fehlalarm :-( wird in den Variablen eingaenge_status, alarm_speicher festgehalten, welcher Melder ausgelöst hat. Während des Ablaufes einer Eingangsverzögerung ev=20s blinkt die LED_STATUS. Eine Alarmierung kann noch abgebrochen werden, wenn während des Ablaufes der ev der Start-Stopp-TASTER mindestens 3s lang gedrückt wird. Bei Abbruch springt das Programm zurück zur Marke “anfang” zum erneuten Scharfschalten mit dem UP aktivieren_EMA();
- Ohne Abbruch läuft das Programm weiter, indem geprüft wird, ob der SCHALTER2 auf “Intern” steht. In diesem Fall erfolgt eine Alarmmeldung nur mit dem SUMMER- keine SMS.
- Zur Vorbereitung eines SMS-Versandes werden mit init_USART(); die serielle Schnittstelle aktiviert und aus dem gespeicherten Wert für den auslösenden Melder mit generiere_ALARMTXT(); der Text für eine Alarm-SMS generiert und in der Variablen message gespeichert.
- Im Folgenden werden über den TX-Ausgang des PIC eine Reihe von AT-Befehlen an das GSM-Modem gesandt, in deren Ergebnis eine Alarm-SMS versandt wird.
- Die LED_GSM blitzt auf, wenn eine SMS versandt wurde.
- Um die Kosten zu begrenzen, werden je ZONEx nur zwei SMS versandt.


Testbetrieb:
Zum Testen der EMA dienen LED und ein Summer. Z.B. steht ein Doppelton für OK, wenn das Programm eine bestimmten Befehl abgearbeitet hat.
while(TASTER == 1) stoppt das Programm an der betreffenden Zeile, bis der TASTER gedrückt wird.
Wenn der UART_TxD-Ausgang des GSM-Moduls über den RX-Eingang eines TTL-USB-Pegelwandler mit einem Rechner verbunden wird, kann mit einem Terminalprogramm überprüft werden, ob das Modul die AT-Befehle korrekt verarbeitet.
Damit das Guthaben der Prepaid-SIM-Karte nicht unnötig verbraucht wird, reicht es, zum Testen ein Alarmmobiltelefon kurz anzuklingeln.


Stromversorgung:
Ein Notebooknetzteil liefert 19V=/3A. Ein 7812 erzeugt daraus +13,5V, mit der die Ladung eines Akkus +12V/4Ah erhalten bleibt. Die +13,5V werden mit einem LM1085 zu +5V gewandelt, die zur Spannungsversorgung des PIC und des GSM-Moduls dienen. Der LM1085 kann bei Bedarf mehr als 1A an das GSM-Modul liefern. Bei Netzspannungsausfall erfolgt die Stromversorgung allein über den Akku. Eine Flip-Flop-Schaltung mit einem 4093 und eine blinkende LED zeigen den Netzausfall an. Wenn ein Melder oder eine Sirene mit +12V versorgt sein müssen, stehen diese mit dem 7812 bzw. dem Akku zur Verfügung.


KVP:
Ich habe das Programm hingefriemelt- es funktioniert.
Verbesserungsvorschläge willkommen. :-)


Hier ein paar Dokumente zum Nachbau:
- Ein Stromlaufplan: [EMA Stromlaufplan.pdf]
- Ein Programmablaufplan: [EMA Programmablaufplan.pdf]
- Der Quelltext: [EMA Quelltext.c]
- Ein paar Fotos:

* * *

EMA Versuchsaufbau

* * *

EMA Prellen Versuchsaufbau

* * *

EMA Prellen Oszillogramm 1

* * *

EMA Prellen Oszillogramm 2

* * *

EMA USB 2 TTL Wandler

* * *

EMA GSM-Modul 1

* * *

EMA GSM-Modul 2

* * *

EMA PIR vorn

* * *

EMA PIR hinten

* * *

EMA komplett

* * *

© 2009-2019, Roland Pudimat, 10.04.2019