EPIDINO                                         (Aktualisiert 2017-03-22 )


[ The most part is in German, but I'll add more and more English whenever I have time.]

Die Idee, ein  Epi-Alarmgeraet mit dem Arduino zu bauen kam, als der Sensor des Epi-Care Geraetes nicht mehr arbeitete und eine schnelle Loesung gefunden werden musste.

Und so entstand das Epidino. Ein Epi-Alarmgeraet mit Uebertragung des Alarms ins Handy-Netz.

Die erste Version ist mit einem ARDUINO UNO, ein Shield fuer die Bauteile und einem GSM-Shield.

Hier wird ein neues mit einer einheitlichen Platine gezeigt, mit dem sich verschiedene Loesungsmoeglichkeiten verwirklichen lassen.

Es koennen zwei Sensoren, Beschleunigungssensoren oder Piezo-Sensoren, angeschlossen werden.

Der Sensor liegt unter der Matratze. Ein Beschleunigungssensor macht natuerlich nur Sinn bei Bewegungen, wobei der Piezosensor auf Druck reagiert und auch bei fester Unterlage gute Ergebnisse liefert.

Darueber hinaus sind zwei Eingaenge vorhanden, an die beispielsweise ein Epi-Care free (mit Handsensor) oder ein SOS-Taster angeschlossen werden koennen.

Es kann ein GSM shield zum Senden einer SMS aufgesteckt werden.

Hat man kein GSM shield zur Verfuegung, so kann auch ein GSM Funk-Telefon-Wahlgeraet  (z.B. der  Firma AMG Sicherheitstechnik) angeschlossen werden.
Oder auch einfach nur ein Buzzer ueber eine Leitung ins Zimmer nebenan.


Zurzeit werden drei Piezo-Sensoren verwendet, und es funktioniert problemlos.
Mit den drei Potentiometern ist eine gute Einstellung der Empfindlichkeit, der Dauer und der Anzahl der Bewegungen moeglich.



  
 

Rechts der Ein-/Ausschalter, links daneben die orangefarbene Stopptaste, ganz links, kaum zu erkennen, die zweifarbene LED.
Sobald Bewegungen festgestellt werden,  beginnt der Timer an zu zaehlen. Dies wird durch eine gruene LED signalisiert.

Bewegungen werden durch die rote LED signalisiert.

  Zweifarbige LED     2 coloured LED




 

Ohne GSM shield.  Without GSM shield.


 

Das Epi-Care free kann im Koffer integriert werden. (Epi-Care free = ein Epilepsie-Alarm, den man als Armband tragen kann.)
Epi-Care free (armband sensor) can be integrated.

Epi-Care free Sensor




Mit GSM shield.  With GSM shield.


If a GSM shield is to be used you must put a
jumper here.
Wenn ein GSM shield verwendet wird, dann muss
hier (orangefarbener Kreis) ein Jumper gesetzt werden.






Im freien Platz rechts koennen die Sensoren, Netzadapter usw. (in einem Beutel) verstaut werden, sollte das Epidino mal mit auf die Reise gehen.
Als "Klingel" wird ein Prepaid Handy verwendet. Das Mitteilungssignal ist auf "Rufton" "Destiny" (oder anderes Klangmuster) eingestellt, so dass bei Empfang der SMS ein laengeres Signal ertoent. (Bei "Standard" oder "Einzelton" kommt es vor, dass das kurze Signal ueberhoert wird.)

The reset button corresponds to the reset button on the board.

An der Rueckseite des Koffers befinden sich die Anschluesse fuer die Sensoren.
Hier ist nur ein Sensor angeschlossen. Statt eines zweiten Sensors ist ein Stecker
eingesteckt, der den analogen Eingang auf HIGH (+5V) setzt.
Ganz rechts der 12V-Netzadapter-Anschluss.
Links sind drei Buchsen: eine fuer die Tuerlampe, eine fuer den Alarmausgang (beispielsweise zum Anschluss einer Klingel im Zimmer nebenan oder auch zum Anschluss eines Telefon-Wahlgeraetes, wenn kein GSM shield vorhanden ist) und eine zum Anschluss eines Tasters zum Rufen einer Betreuungsperson.

Bei Alarm wird eine SMS geschickt, in der auch mitgeteilt wird, ob Sensor1, Sensor 2 oder die Ruftaste den Alarm ausgeloest hat.

In case of an alarm a SMS will be sent with the message whether Sensor 1, Sensor 2 or the SOS button unit triggered the alarm.


Die Sensoren

Der Piezo-Sensor


An den Piezo-Sensor koennen weitere Piezo-Sensoren angeschlossen werden.


RC-Glied (siehe unten unter "Anschluss der Sensoren"  See "How to connect the sensors" below)
  
(non-polar (NP) electrolytic Condensor) 





Der Beschleungigungssensor     Accelerometer sensor)           


Der Beschleunigungs-Sensor ADXL335

Beschleunigungssensor mit  analogem Ausgang. Betriebsspannung: 3.3V.
Verwendet man einen Beschleunigungssensor mit einer Betriebsspannung von 5 V, so muss man Vcc des Sensors
mit dem 5V-Pin  verbinden.



Der Beschleunigungssensor ist in einem kleinen Plastikkaestchen untergebracht, das mit Styropor aufgefuellt ist.



SOS-Knopf   SOS button
Kann an einen Eingang (Alarm IN1 oder Alarm IN2) angeschlossen werden. Auch Mitbewohner koennen durch einfaches Druecken der Taste
Hilfe rufen.
Everybody can call for help just by pushing the button.



Tuerlampe   Door LED

Zwei LEDs sind ueber der Tuer angebracht und ueber ein Kabel und Stecker am Epidino angeschlossen.
Bei eingeschaltetem Epidino leuchten sie und signalisieren der Nachtwache, dass das Geraet in Betrieb ist.

The two LEDs at the door signal the persons in charge that the Epidino is switched on.
 





Damit die Stopptaste im Dunkeln besser  zu erkennen ist, ist diese mit einer unten angeklebten LED beleuchtet.
Stop button with LED


  Epidino  ausgeschaltet (OFF)

  Epidino  eingeschaltet  (ON)

 


Schaltplan und Platine, erstellt mit TARGET 3001!
Circuit and PCB designed with TARGET 3001!




Die Platine




Parts list for PCB         Teileliste fuer Platine

          pcs.
IC4 7805 TO220   7805 1
IC1 7809 TO220   7809 1
K23
1X10_BUCHSE     6
F2 0A KLEINSICHERUNG_8,4   0A 1
C1 100nF D4R2,54_ELKO   100nF 3
C10 100μF D7R2,54_ELKO   100μF 2
R15 10K 0204   10K 7
C9 10μF D6R2,54_ELKO   10μF 1
Q1 16MHz HC49/U   16MHz 1
R11 1K 0204   1K 9
D1 1N4004 D_RM12,7_DM3   1N4004 2
C6 1μF D6R2,54_ELKO   1μF 1
R1 20K POTI_63P   20K 3
C7 22pF 6X3R5,08   22pF 2
T2 2SC1815 TO92   2SC1815 2
C4 47μF D6R2,54_ELKO   47μF 2
IC3 4N30 DIL6   4N30 2
K14 A-20042-LP/FS Assmann_A-20042-LP/FS   A-20042-LP/FS 2
IC7 ATMEGA328P-PU DIL28S   ATMEGA328P-PU 1
Model1 DIODE D2   DIODE 2
K13 Einlot-DC-Buchse_2.1 EINLOT-DC-BUCHSE_2.1MM   Einlot-DC-Buchse_2.1 1
D3 LED_ROT_3MM LED_3MM_ROT   LED_ROT_3MM 3
X2 LM386N DIL8   LM386N 1
IC6 LP2950ACZ TO92   LP2950ACZ 1
K18 PRG Stiftleiste_2x03_G_2,54   PRG 1
S1 Reset TASTER_KURZHUB   Reset 1
AL1 RMP-17P D17R10,16   RMP-17P 1
K10 Stiftleiste_1x02_G_2,54 Stiftleiste_1x02_G_2,54   Stiftleiste_1x02_G_2,54 8
K17 Stiftleiste_1x03_G_2,54 Stiftleiste_1x03_G_2,54   Stiftleiste_1x03_G_2,54 3
K1 Stiftleiste_1x04_G_2,54 Stiftleiste_1x04_G_2,54   Stiftleiste_1x04_G_2,54 1
K11 Stiftleiste_1x06_G_2,54 Stiftleiste_1x06_G_2,54   Stiftleiste_1x06_G_2,54 1
K4 Stiftleiste_2x03_G_2,54 Stiftleiste_2x03_G_2,54   Stiftleiste_2x03_G_2,54 1
S4 Test1 TASTER_KURZHUB   Test1 1
S3 Test2 TASTER_KURZHUB   Test2 1
RE1 ZT12 ZT12   ZT12 2


Ausserdem:   Furthermore:
Koffer      Case
Taster      Push button
ON/OFF switch
AC adapter 12 V DC
LAN cable for sensors
Piezo element
Accelerometer   Beschleunigungs-Sensor ADXL335
Various small material



Anschluss der Sensoren  How to connect the sensors 
Das RC-Glied (Kondensator/Widerstand) ist in einem Plastikkaestchen in der Zuleitung des Piezo-Sensors untergebracht (siehe Bild oben).


The reset button corresponds to the reset button on the board. AVR Programmer,


There are two types of LAN cables. I more like "T568A"  (left)




ISP-Programmer (FT232 USB to Serial Communication Board)

zum Flashen des ATmega328.
for flashing the ATmega328.

Reset-Taster

 
Nr.5 und 6 an Reset-Taster           No.5 and 6 to Reset button
Der Reset-Taster entspricht dem Reset-Taster auf der Epidino-Platine.
The reset button corresponds to the reset button on the Epidino board.

For more information see:
FT232RL USB to Serial Breakout Board
https://www.arduino.cc/en/Main/Standalone

Hier wird der Programmer angeschlossen (orangefarben gekennzeichnet)
The Programmer is to be connected to the 6pin connector.


Man drueckt die Reset-Taste, klickt "Hochladen" (Pfeil nach rechts) und laesst die Reset-Taste los, sobald unten in der Info-Leiste "Hochladen" angezeigt wird.

Press the Reset button and click "Upload" (right arrow). Release the Reset button
when "Upload" is shown in the info line.


   Open-source Arduino Software (IDE)
Einstellung im Menue "Werkzeuge": Arduino Uno, Port xx, AVRISP mkII



Man kann natuerlich auch einfach den ATmega328 in einem Arduino Uno
flashen und dann in die Epidino-Platine stecken.
Of course, you can also simply flash the ATmega328 in an Arduino Uno and then insert it into the socket of the Epidino board.




Und hier der Code.         [  Aktualisiert: 2017-01-31 ]

To monitor the values set by the three pots please set "mon1" to 1 as shown below.
(Locate mon1 in the code.)
[Um die mit den drei Potentiometern eingestellten Werte auf dem Monitor zu sehen, setzt man "mon1" auf 1 wie hier gezeigt: (Bitte im Code aufsuchen.)]

byte mon0 = 0;
byte mon1 = 1;



-------------------------------------------- Anfang ------------------------------------------------------------
char remoteNumber[20] = "xxxxxxxxxxxxxx";  // phone number [Handy-Nummer, an die die SMS geschickt werden soll]
String SmsText = "Epidino";

/* Epidino Source Version: 17011
  INFO: AVR ISP

Adjustable with.... [Einstellbar mit...]
  ...Pot3  Duration of movement [Dauer der Bewegungsphase]
  ...Pot2  alarm threshold [Alarm-Schwelle, bei der ein Alarm ausgeloest wird.]
  ...Pot1  sensor sensitivity [Sensor-Empfindlichkeit zur Anpassung an die Matratze]


  <#>: Parameters to be changed [Mit <#> sind die Stellen markiert, die geaendert werden koennen]

  Connection for Accelerometer and/or piezo sensor [Anschlussmoeglichkeit von Beschleunigungssensor und/oder PiezoSensor]

  Duration: Duration of sensor activity registration [Legt fest, wie lange Sensoraktivitaet registriert wird]
  Pause: Wenn waehrend der Sensoraktivierungs-Dauer eine laengere Pause registriert wird, wird die Ueberwachungsphase abgebrochen.
  AlarmShreshold: At which counter value alarm is to be triggered [Bei welchem Zaehlerstand der Alarm ausgeloest werden soll]
  Piezo sensor:if the matress is on a hard surface (floor) an accelerometer doesn't make any sense because there are
  no movements. In this case a piezo sensor is useful because it registers pressure differences.

  [Wenn die Matratze  auf einer harten Unterlage liegt (kein Lattenrost) wie beispielsweise bei einem Futon,
  macht ein Bewegungssensor unter der Matratze keinen Sinn, da er sich ja nicht bewegt. Mit einem Piezosensor
  allerdings koennen Druckunterschiede registriert werden.]

  The parameters marked with <#> can be changed to get best results according to the type of matress/bed.
  [Je nach Sensor und Bett/Matratze muessen die mit <#> gekennzeichneten Parameter evtl. veraendert werden.]

  <<< GSM Shield and Relay output >>>
  <<< GSM Shield >>>
  Advantage: Easy to use. You can program it as you like. For example to send a SMS again if
  stop button was not pressed
  Disadvantage: The phone number must be in the code and can not be changed by others.

  [Vorteil: Kompakt, einfach aufstecken und schon fertig. Es kann selbst so programmiert werden, wie
  man es wuenscht. Zum Beispiel nach einer gewissen Zeit noch einmal waehlen lassen, falls niemand gekommen
  ist (Stopp-Taste wurde nicht gedrueckt)
  Es kann ein Handy oder auch ein Festnetz-Telefon angerufen werden.]
  Nachteil: Soll ein anderes Telefon/Handy angerufen werden, so muss die Nummer hier im Code geaendert und
  der Arduino neu geflashed werden]

  <<< Relay output>>>
  Advantage: You can use any GSM dialler or just a buzzer which is connected via a cable to another room.
  If you use the GSM-Wahlgeraet GW-02/NO from "AMG Alarmtechnik" for example you can change the phone number
  to be called just by sending a SMS to the dialler
  [Vorteil: Es kann ein beliebiges GSM-Wahlgeraet verwendet oder auch nur eine einfache Klingel angeschlossen
  werden.
  Bei Verwendung des GSM-Wahlgeraet GW-02/NO der Firma AMG Alarmtechnik beispielsweise kann die Nummer des
  anzurufenden Handys auf einfache Weise geaendert werden: Es braucht lediglich von dem anzurufenden Handy aus eine SMS an
  das Wahlgeraet gesendet zu werden.]

  Ein anderes Alarmgeraet kann angeschlossen werden (z.B. Epi-Care free). Wenn bei Einschalten dieses Geraetes am Ausgang ein Impuls
  auftritt, muss verhindert werden, dass dieser einen Alarm ausloest (bei Einschalten des Epidinos und auch bei Stoppen
  eines Fehlalarms). Hierfuer ist die "ResetPause": Nach Aus- und Wiedereinschalten des Relais (bei Druecken der Stopptaste)
  wird bis nach dem Ausgangsimpuls gewartet.
*/

#include <GSM.h>
#define PINNUMBER ""
// Initialisation of the library [Initialsieren der Library]
GSM gsmAccess;
GSM_SMS sms;

/* ---- GSM and/or Relay ---------------------------------------
  Jumper [k2]: With GSM Shield     No jumper: No GSM Shield   [Jumper: Mit GSM Shield, Kein Jumper: Ohne GSM Shield ]
*/

byte GsmYN = 1;  // 1:GSM Shield is used   0:GSM Shield is not used [ 1: Mit GSM Shield    0: Ohne GSM Shield ]

int AlarmDelay = 15000;         // <#> Wait until the alarm is triggered [Wartezeit bis der Alarm ausgeloest wird]
int RelayOnDuration = 10000;    // <#> How long the alarm relay should remain ON [Wie lange das AlarmRelais anbleiben soll]
byte RelayActive = 0;           // Whether Relay is active or not [Ob Relay aktiv ist oder nicht] (0=Nicht aktiv  1=Aktiv)
byte GsmActive = 0;             // 0:GSM shield is not active, 1:GSM shield is active [0:GSM ist nicht aktiv  1:aktiv]
int ResetPause = 2000;          // <#> Wait after ResetRelay has resetted the connected Alarm Unit (e.g. Epi-Care free) to supress output signal of this unit.
//                                    [Wartezeit nach Zuruecksetzen des angeschlossenen Alarmgereats (z.B. Epi-Care free)]
byte PauseOnOff = 0;  // <#> Es wird festgelegt, ob waehrend der Ueberwachungsphase eine laengere Bewegungspause zum Abbruch fuehren soll.


// For monitoring 0=OFF 1=ON [ Monitor-Ausgabe waehlen (nur fuer Programmierungszwecke)]
byte mon0 = 0;
byte mon1 = 1;

// <<<<< Digital In and Outputs >>>>>
//byte GsmRxPin = 2;       // P4 Pin2 ist fuer GSM festgelegt
//byte GsmTxPin = 3;       // P5 Pin3 ist fuer GSM festgelegt
//byte ModemResetPin = 7;  // P13 GSM Shield Reset
byte ModemResetPin = 7;    // P13 GSM Shield Reset
byte ModePin = 5;          // P11 for selecting GSM Shield
byte RelayPin = 6;         // P12 AlarmRelay
byte ResetRelayPin = 9;    // P15 Relay for resetting the connected Alarm Unit (e.g. Epi-Care free) [Relay zum Zuruecksetzen des angeschlossenen Alamgeraets (z.B. Epi-Care free]
byte AlarmIN1pin = 8;      // P14 Alarm 1
byte AlarmIN2pin = 4;      // P6  Alarm 2
byte SpeakerPin = 10;      // P16 Lautsprecher (Buzzer)
byte StopButtonPin = 11;   // P17 Stopp-Taste
byte RedLedPin = 12;       // P18 shows sensor activity, lights up when alarm is triggered [zeigt Sensoraktivitaet an, leuchtet stetig bei Alarm]
byte GreenLedPin = 13;     // P19 lights up at first sensor activity [Leuchtet bei der ersten Sensoraktivitaet auf]

// <<<<< Analog Inputs >>>>>
int Pot1Pin = A1; // P24 Sensitivity of the Sensor
int Pot2Pin = A2; // P25 Alarm Threshold (counter value) [Alarmschwelle (Zaehlerwert)]
int Pot3Pin = A0; // P23 Duration of movement registration [Dauer der Bewegungsregistrierung]

byte Sens1Pin = A4;        //     P27
byte Sens2Pin = A5;        //     P28

byte ST = 0;     //  0:Initial status (Timer OFF)  2:Sensor activated, 1:Red/Green-LED reset, 9:Alarm
byte LD = 0;     //  for LED control
//  0:RedLed=OFF  GreenLed=OFF  1 to 5:RedLed=ON  GreenLed=OFF   6...: RedLed=OFF  GreenLed=ON
int BZ = 0;      //  for speaker control

unsigned long TimerStart;  // Timer start time of monitoring period [Startzeit des Timers fuer Ueberwachungsphasendauer]
unsigned long TimerEnd;    // Timer end time of monitoring period [Endzeit des Timers fuer Uberwachungsphasendauer]
unsigned long Pause;       // pause during monitoring period [Pause innerhalb der Ueberwachungsphase]
unsigned long PauseEnd;    // Stopp des Timers bei Nicht-Aktivitaet waehrend der Aktivitaets-Registrierdauer

int Sens1Val = 0; // read sensor values [eingelesene Sensorwerte]
int Sens2Val = 0;

byte Sens1yn = 1; // Sensor1: 1:Sensor connected  0:No sensor connected
byte Sens2yn = 1; // Sensor2: 1:Sensor connected  0:No sensor connected

int Duration;               // Zeitspanne, in der die eingelesenen Werte aufsummiert werden
int Sens1Threshold = 350;   // Sensor sensitivity, determins at which threshold the counter should be increased
int Sens2Threshold = 350;   // = Sens1Threshold

int AlarmThreshold1 = 12;  // Schwelle1, die vorgibt, bei welchem Zaehlerstand der Alarm von Sensor1 ausgeloest werden soll
int AlarmThreshold2 = 12;  // = AlarmThreshold1

int Counter1 = 0;
int Counter2 = 0;
int vvv = 0;  // general variable [allgemeine Variable]

void setup() {
  pinMode(GreenLedPin, OUTPUT);
  pinMode(RedLedPin, OUTPUT);
  pinMode(SpeakerPin, OUTPUT);
  // pinMode(ModemResetPin, OUTPUT);  // GSM-Reset
  pinMode(RelayPin, OUTPUT);  // Relay
  digitalWrite(RelayPin, HIGH);
  pinMode(AlarmIN1pin, INPUT);     // Alarm von Alarm IN1
  pinMode(AlarmIN2Pin, INPUT);
  pinMode(ResetRelayPin, OUTPUT);  // ResetRelay to switch the connected Alarm Unit off and on again
  //                                  [ResetRelay zum Aus- und Wiedereinschalten des angeschlossenen Alarmgeraets (z.B.Epi-Care free)]
  digitalWrite(ResetRelayPin, HIGH); // High, so that the connected Alarm Unit is supplied with 12V power
  pinMode(StopButtonPin, INPUT);
  pinMode(ModePin, INPUT);

  if ( digitalRead(Sens1Pin) == HIGH ) { // Check if a sensor is connected or not. If HIGH: no sensor connected
    Sens1yn = 0;
  }
  if ( digitalRead(Sens2Pin) == HIGH ) {
    Sens2yn = 0;
  }
  Serial.begin(250000); // 115200
  if ( digitalRead(ModePin) == HIGH ) { // No GSM Shield when no Jumper [ Ohne GSM Shield, wenn der Jumper nicht gesetzt ist]
    GsmYN = 0;
  }
  if ( GsmYN == 1 ) {  // Only if GSM Shield is connected  [Nur wenn ein GSM shield vorhanden ist]
    // digitalWrite(ModemResetPin,LOW);
    Serial.println("SMS Messages Sender");
    boolean notConnected = true;  // connection status   [Verbindungsstatus]

    while (notConnected)
    {
      if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
        notConnected = false;
      }
      else
      {
        Serial.println("Not connected");
        tone(SpeakerPin, 3000, 1000);
        delay(1000);
      }
    }
    Serial.println("GSM initialisiert");
    tone(SpeakerPin, 100, 1000);
    digitalWrite(RedLedPin, HIGH);
    //SmsText = "Das Epidino wurde eingeschaltet";  // "The Epidino has been switched on";
    //sendSMS();
  }
  Reset();
}

void loop() {
  StopButton();
  AlarmIN1();
  AlarmIN2();

  Sens1Threshold = analogRead(Pot1Pin);  // sensitivity of the sensor
  Sens2Threshold = Sens1Threshold;

  AlarmThreshold1 = analogRead(Pot2Pin) / 20; // Alarmschwelle
  AlarmThreshold2 = AlarmThreshold1;

  vvv = analogRead(Pot3Pin);   // duration [Dauer]
  Duration = vvv * 100 / 1000;
  Pause = Duration * 0.1;

  if ( ST == 0 ) {   // Initial status. Not active. Timer OFF
    digitalWrite(RedLedPin, LOW);
    digitalWrite(GreenLedPin, LOW);
    LD = 0;
  }
  if ( ST < 9 ) {
    ReadSensor();  //  No alarm triggered yet [Alarm noch nicht ausgeloest]
  }
  if ( ST == 2 ) {       // Sensor activated [ Sensor ist aktiviert]
    digitalWrite(RedLedPin, HIGH);
    digitalWrite(GreenLedPin, LOW);
    ++LD;
  }
  if ( LD == 50 ) {
    digitalWrite(RedLedPin, LOW);
    digitalWrite(GreenLedPin, HIGH);
    LD = 0;
    ST = 1;
  }
  if ( ST == 9 ) { // Alarm triggered [Alarm ausgeloest] Alarm!
    digitalWrite(GreenLedPin, LOW);
    digitalWrite(RedLedPin, HIGH);

    if ( GsmActive == 0 && RelayActive == 0 ) {      // Waiting loop for Stop Button [ Warteschleife fuer Stoptaste ]
      vvv = 0;
      while (vvv < AlarmDelay) { // Loop for Stop button [Warteschleife fuer Stopptaste]
        tone(SpeakerPin, 800);
        StopButton();
        if ( ST == 0 ) {
          vvv = AlarmDelay;  // Stop button is pressed [Stopptaste gedrueckt]
        }
        ++vvv;
      }
      noTone(SpeakerPin);
    }

    if ( ST == 9 ) { // If Stop Button was not pressed

      if ( GsmYN == 1  &&  GsmActive == 0 ) {   // if GSM shield is used and no SMS was sent yet [GSM Shield, noch keine SMS geschickt]
        sendSMS();
      }
      if ( RelayActive == 0 ) { // if Alarm Relay is not activated yet [Alarm-Relais, noch nicht aktiviert]
        RelayOn();
      }
      ++BZ;
      if ( BZ == 20000) {
        tone(SpeakerPin, 100, 40); // short beep
        BZ = 0;
      }
    }
  }
}

void ReadSensor() {
  Sens1Val = 0;
  Sens2Val = 0;

  if ( Sens1yn == 1 ) {
    vvv = analogRead(Sens1Pin);
    Sens1Val = abs(vvv);
  }
  if ( Sens2yn == 1 ) {
    vvv = analogRead(Sens2Pin);
    Sens2Val = abs(vvv);
  }
  if ( mon0 == 1 ) {
    Monitor0();
  }
  if ( mon1 == 1 ) {
    Monitor1();
  }

  if ( Sens1Val > Sens1Threshold  ||  Sens2Val > Sens2Threshold ) {
    if  ( Sens1Val > Sens1Threshold ) {
      ++Counter1;  // increase counter1
    }
    if  ( Sens2Val > Sens2Threshold ) {
      ++Counter2;  // increase counter2
    }
    PauseEnd = TimerEnd; // reset PauseEnd time

    delay(200);

    if ( PauseOnOff == 1 ) {
      PauseEnd = millis() / 1000 + Pause;  // new Pause End
    }

    if ( ST == 0 ) {   // First sensor activity
      TimerOn();
      ST = 2;
    }
    else
    { // Timer is already running (not first sensor activity)
      ST = 2; // T=2  must be before CheckCounter() [ T=2 muss vor CheckCounter() sein.]
    }
  }
  CheckCounter();
}

void TimerOn() {     //  first sensor activation  [bei der ersten Aktivierung des Sensors ]
  TimerStart = millis() / 1000; // store actual time [aktuelle Zeit abspeichern]
  TimerEnd = TimerStart + Duration;
  digitalWrite(GreenLedPin, HIGH);
  digitalWrite(RedLedPin, LOW);
}

void CheckCounter() {
  if ( millis() / 1000 > TimerEnd  ||  millis() / 1000 > PauseEnd ) {
    Reset();  // Counter and Counter --> 0   T=0
    //    if ( mon1 == 1 ) {
    //      Serial.print("   if (millis... ");
    //    }
  }
  //  if ( mon1 == 1 ) {
  //    Monitor1();
  //  }
  if  ( Sens1yn == 1 && Counter1 > AlarmThreshold1 )   { // Wenn der Counter groesser als der vorgegebene Wert ist
    Reset();
    ST = 9;                   // Alarm! Activity LED leuchtet stetig
    SmsText = "Sensor1";
  }
  if  ( Sens2yn == 1 && Counter2 > AlarmThreshold2 )   { // Wenn der Counter groesser als der vorgegebene Wert ist
    Reset();
    ST = 9;                   // Alarm! Activity LED leuchtet stetig
    SmsText = "Sensor2";
  }
  StopButton();
}

void AlarmIN1() {
  if ( digitalRead(AlarmIN1pin) == LOW ) {
    digitalWrite(GreenLedPin, HIGH);
    digitalWrite(RedLedPin, LOW);
    ST = 9;                   // activity LED is lit continuously  [Aktivitaets-LED leuchtet stetig]
    SmsText = "Alarm1";
  }
}

void AlarmIN2() {
  if ( digitalRead(AlarmIN2Pin) == LOW ) {
    digitalWrite(GreenLedPin, HIGH);
    digitalWrite(RedLedPin, LOW);
    ST = 9;                   // LED lights  [LED leuchtet stetig]
    SmsText = "Alarm2";
  }
}

void StopButton() {
  if ( digitalRead(StopButtonPin) == LOW ) { //  StopButton was pushed
    vvv = 0;
    if ( RelayActive == 1 || GsmActive == 1 ) {
      vvv = 1;
    }
    digitalWrite(ResetRelayPin, LOW); // Switch off connected Alarm Unit
    Reset();
    delay(120);
    digitalWrite(ResetRelayPin, HIGH);
    melodyStopp();
    delay(ResetPause); // wait to ovoid alarm triggered by the output signal of a connected Alarm Unit
    //                    [Warten, um Alarmausloesung durch das Ausgangssignal eines angeschlossenen Alarmgeraetes (z.B Epi-Care free) zu verhindern.]
    tone(SpeakerPin, 100, 1000);
  }
}

void Reset() {
  digitalWrite(GreenLedPin, LOW);
  digitalWrite(RedLedPin, LOW);
  ST = 0;
  BZ = 0;
  Counter1 = 0;
  Counter2 = 0;
  digitalWrite(RelayPin, HIGH); // Switch off alarm relay immediately [Das AlarmRelais sofort abschalten]
  GsmActive = 0;   // GSM shield is not active [GSM Shield ist nicht aktiv]
  RelayActive = 0;  // Alarm relay is not active [AlarmRelais ist nicht aktiv]
  //  digitalWrite(ModemResetPin, LOW);
}

void sendSMS() {
  digitalWrite(GreenLedPin, LOW);
  digitalWrite(RedLedPin, HIGH);
  Serial.println("SENDING");
  Serial.print("SMS an Handy Nummer: ");
  Serial.println(remoteNumber);
  Serial.println("SENDING");
  Serial.println();
  Serial.print("Message:");
  Serial.println(SmsText);
  noTone(SpeakerPin);
  sms.beginSMS(remoteNumber);
  sms.print(SmsText);
  sms.endSMS();
  delay(1);
  Serial.println("\nCOMPLETE!\n");
  GsmActive = 1;
}

void RelayOn() {  // Activation of relay [Aktivieren des Relay ] (ST = 9)
  digitalWrite(RelayPin, LOW); // Relay einschalten (Relay schaltet, wenn Minus)
  RelayActive = 1;  // Relay is activated [AlarmRelais ist aktiviert]
}

void RelayOff() {  // Deaktivieren des Relay nach einer vorgegebenen Zeit
  vvv = 0;
  while (vvv < RelayOnDuration) {
    StopButton();
    if ( ST == 0 ) {
      vvv = RelayOnDuration;   // Wenn die StopButton gedrueckt wurde, Schleife sofort verlassen
    }
    tone(SpeakerPin, 1200);
    ++vvv;
  } // End of loop [Schleifenende]

  digitalWrite(RelayPin, HIGH); // turn off relay  [Relay abschalten (Relay schaltet, wenn Minus)]
  RelayActive = 5;  // AlarmRelais ist nach der vorgegebenen Zeit deaktiviert worden
  noTone(SpeakerPin);
}

void melodyStopp() {
  if ( vvv == 0 ) { // RelayActive = 0
    tone(SpeakerPin, 300);
    delay(800);  // warten
    tone(SpeakerPin, 1000);
    delay(800);  // warten
    noTone(SpeakerPin);
  }
  if ( vvv == 1 ) { // RelayActive = 1
    tone(SpeakerPin, 1000);
    delay(1000);  // warten
    noTone(SpeakerPin);
    vvv = 0;
  }
}

void Monitor0() {
  Serial.print(" ST:");
  Serial.print(ST);
  vvv = millis() / 1000;
  Serial.print(" Time:");
  Serial.print(vvv);
  Serial.print(" Duration:" );
  Serial.print(Duration);
  Serial.print(" TimerEnd:");
  Serial.print(TimerEnd);
  Serial.print(" PauseEnd:");
  Serial.print(PauseEnd);
  Serial.print(" AlarmThreshold1:");
  Serial.print(AlarmThreshold1);
  Serial.print(" Sens1Val:");
  Serial.print(Sens1Val);
  Serial.print(" Counter1:");
  Serial.print(Counter1);
  Serial.print(" Counter2:");
  Serial.print(Counter2);
  Serial.print(" AlarmThreshold2:");
  Serial.print(AlarmThreshold2);
  Serial.print(" Sens2Val:");
  Serial.print(Sens2Val);
  Serial.println();
}

void Monitor1() {
  Serial.print(" Duration:" );
  Serial.print(Duration);
  Serial.print("  AlarmThreshold1:");
  Serial.print(AlarmThreshold1);
  Serial.print("  Sens1Threshold:");
  Serial.print(Sens1Threshold);
  Serial.print("  Counter1:");
  Serial.print(Counter1);
  Serial.print("  Sens1Val: ");
  Serial.print(Sens1Val);
  Serial.println();

}

---------------------------- Ende --------------------------------------




































    







gratis-besucherzaehler