//Alarmsystem V4.0 -
//Master-Board
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
LiquidCrystal_I2C lcd(0x27, 20, 4);
//Sensoren
const int scs = 2; //Eingang Schlüsselschalter -> D2
const int taster_display = 3; //Eingang Taster Display -> D3
const int mgs_t = 4; //Eingang Magnetschalter Tür -> D4
const int mgs_f = 5; //Eingang Magnetschalter Fenster -> D5
const int ess_t = 6; //Eingang Erschütterungssensor Tür -> D6
const int ess_f = 7; //Eingang Erschütterungssensor Fenster -> D7
const int schalter_sms = 8; //Eingang Schalter Test SMS -> D8
//Aktoren
const int sirene = A0; //Ausgang Sirene ->
const int slave = A1; //Ausgang Slave ->
const int led_rot = A2; //Ausgang LED rot ->
const int led_gruen = A3; //Ausgang LED grün ->
//Variablen
bool m_mgs_t; //Merker Magnetschalter Tür getriggert
bool m_mgs_f; //Merker Magnetschalter Tür getriggert
bool m_ess_t; //Merker Erschütterungssensor Tür getriggert
bool m_ess_f; //Merker Erschütterungssensor Fenster getriggert
bool a_mgs_t; //Merker Alarm ausgelöst durch Magnetschalter Tür
bool a_mgs_f; //Merker Alarm ausgelöst durch Magnetschalter Fenster
bool a_ess_t; //Merker Alarm ausgelöst durch Erschütterungssensor Tür
bool a_ess_f; //Merker Alarm ausgelöst durch Erschütterungssensor Fenster
bool reset_status; //Merker System reset
bool trigger; //Merker Alarm wurde ausgelöst
bool aktiv; //Merker System aktiv
bool alarm; //Merker Alarm ausgelöst
bool quittieren; //Merker quittieren Meldung Display
bool test_sms; //Merker Test SMS senden
long rfid_code; //RFID-Code
//Timer
long timer_display; //Timer Beleuchtung Display
long timer_mgs_t; //Timer Doppelabfragung Magnetschalter Tür
long timer_mgs_f; //Timer Doppelabfragung Magnetschalter Fenster
long timer_ess_t; //Timer Doppelabfragung Erschütterungssensor Tür
long timer_ess_f; //Timer Doppelabfragung Erschütterungssensor Fenster
long timer_alarm; //Timer Alarmdauer
long timer_zyklus;
//Zeiten - alle Zeiten in Millisekunden!
long time_display = 5000; //Zeit Beleuchtung Display
long time_mgs_t = 1000; //Zeit Doppelabfragung Magnetschalter Tür
long time_mgs_f = 1000; //Zeit Doppelabfragung Magnetschalter Fenster
long time_ess_t = 1000; //Zeit Doppelabfragung Erschütterungssensor Tür
long time_ess_f = 1000; //Zeit Doppelabfragung Erschütterungssensor Fenster
long time_alarm = 10000; //Zeit Alarmdauer
long time_send_sms = 20000; //Zeit SMS senden
void setup() {
//Eingänge
pinMode(scs, INPUT);
pinMode(taster_display, INPUT);
pinMode(mgs_t, INPUT_PULLUP);
pinMode(mgs_f, INPUT_PULLUP);
pinMode(ess_t, INPUT);
pinMode(ess_f, INPUT);
pinMode(schalter_sms, INPUT_PULLUP);
//Ausgänge
pinMode(sirene, OUTPUT);
pinMode(slave, OUTPUT);
pinMode(led_gruen, OUTPUT);
pinMode(led_rot, OUTPUT);
//Initialiserung
reset_status = LOW;
aktiv = LOW;
m_mgs_t = LOW;
m_mgs_f = LOW;
m_ess_t = LOW;
m_ess_f = LOW;
a_mgs_t = LOW;
a_mgs_f = LOW;
a_ess_t = HIGH;
a_ess_f = HIGH;
digitalWrite(sirene, LOW);
digitalWrite(slave, LOW);
digitalWrite(led_rot, LOW);
digitalWrite(led_gruen, LOW);
//Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(scs), reset, FALLING);
attachInterrupt(digitalPinToInterrupt(taster_display), lcd_beleuchtung, FALLING);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" Alarmsystem V4.0 ");
boot_animation();
}
void loop() {
timer_zyklus = millis();
if (trigger == LOW) rtc_clock(); //Zeit einfrieren bei Alarm
erste_abfragung(); //erste Abfragung der Sensoren
zweite_abfragung(); //zweite Abfragung der Sensoren
//if (digitalRead(schalter_sms) == HIGH) sende_test_sms();
if (millis() - timer_display > time_display && trigger == LOW) lcd.noBacklight(); //Hintergrundbeleuchtung AUS -> dauer EIN bei Alarm
else lcd.backlight(); //Hintergrundbeleuchtung EIN
if (reset_status == HIGH) { //Reset System
digitalWrite(led_gruen, HIGH);
digitalWrite(led_rot, LOW);
digitalWrite(slave, LOW);
digitalWrite(sirene, LOW);
aktiv = LOW;
alarm = LOW;
m_mgs_t = LOW;
m_mgs_f = LOW;
m_ess_t = LOW;
m_ess_f = LOW;
a_mgs_t = LOW;
a_mgs_f = LOW;
a_ess_t = LOW;
a_ess_f = LOW;
test_sms = LOW;
if (trigger == LOW) {
lcd.setCursor(0, 2);
lcd.print(" System bereit ");
}
}
if (reset_status == HIGH && digitalRead(mgs_t) == LOW && digitalRead(mgs_f) == LOW && digitalRead(scs) == HIGH) {
aktiv = HIGH;
digitalWrite(led_gruen, LOW);
digitalWrite(led_rot, HIGH);
reset_status = LOW;
lcd.setCursor(0, 2);
lcd.print(" System aktiv ");
}
if (alarm == HIGH) { //Trigger Alarm
alarmierung();
}
if (quittieren == HIGH && digitalRead(scs) == LOW) { //Quittieren Alarmmeldung Display
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" ");
trigger = LOW;
}
if (digitalRead(schalter_sms) == LOW && aktiv == LOW) {
sende_testsms();
}
quittieren = LOW;
//Serial.print(reset_status);
//Serial.println(trigger);
//Serial.println(millis() - timer_zyklus);
}
void boot_animation() { //Boot Animation bei Neustart
delay(1000);
lcd.setCursor(0, 2);
lcd.print("System startet...");
delay(1000);
for (int i = 0; i < 10; i++) {
lcd.setCursor(i, 3);
lcd.print("\xFF");
delay(250);
}
for (int i = 10; i < 20; i++) {
lcd.setCursor(i, 3);
lcd.print("\xFF");
delay(50);
}
lcd.setCursor(0, 2);
lcd.print(" Fertig! ");
lcd.setCursor(0, 3);
lcd.print(" ");
delay(1000);
lcd.setCursor(0, 2);
lcd.print(" Standby ");
lcd.setCursor(0, 0);
lcd.print(" ");
timer_display = millis();
}
void rtc_clock() { //Funktion Datum + Uhrzeit
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.print(" ");
char Datum[] = "DD.MM.YY";
lcd.print(now.toString(Datum));
lcd.print(" ");
char Zeit[] = "hh:mm:ss";
lcd.print(now.toString(Zeit));
}
void erste_abfragung() { //Funktion erste Abfragung der Sensoren
if (aktiv == HIGH && digitalRead(mgs_t) == HIGH && m_mgs_t == LOW) { //Magnetschalter Tür getriggert
timer_mgs_t = millis();
m_mgs_t = HIGH;
}
if (aktiv == HIGH && digitalRead(mgs_f) == HIGH && m_mgs_f == LOW) { //Magnetschalter Fenster getriggert
timer_mgs_f = millis();
m_mgs_f = HIGH;
}
if (aktiv == HIGH && digitalRead(ess_t) == HIGH && m_ess_t == LOW) { //Erschütterungssensor Tür getriggert
timer_ess_t = millis();
m_ess_t = HIGH;
}
if (aktiv == HIGH && digitalRead(ess_f) == HIGH && m_ess_f == LOW) { //Erschütterungssensor Fenster getriggert
timer_ess_f = millis();
m_ess_f = HIGH;
}
}
void zweite_abfragung() { //Funktion zweite Abfragung der Sensoren
if (millis() - timer_mgs_t >= time_mgs_t && m_mgs_t == HIGH) { //Magnetschalter Tür Doppelabfragung
if (digitalRead(mgs_t) == HIGH) {
trigger = HIGH;
alarm = HIGH;
aktiv = LOW;
m_mgs_t = LOW;
a_mgs_t = HIGH;
timer_alarm = millis();
}
else m_mgs_t = LOW;
}
if (millis() - timer_mgs_f >= time_mgs_f && m_mgs_f == HIGH) { //Magnetschalter Fenster Doppelabfragung
if (digitalRead(mgs_f) == HIGH) {
trigger = HIGH;
alarm = HIGH;
aktiv = LOW;
m_mgs_f = LOW;
a_mgs_f = HIGH;
timer_alarm = millis();
}
else m_mgs_f = LOW;
}
if (millis() - timer_ess_t >= time_ess_t && m_ess_t == HIGH) { //Erschütterungssensor Tür Doppelabfragung
if (digitalRead(ess_t) == HIGH) {
trigger = HIGH;
alarm = HIGH;
aktiv = LOW;
m_ess_t = LOW;
a_ess_t = HIGH;
timer_alarm = millis();
}
else m_ess_t = LOW;
}
if (millis() - timer_ess_f >= time_ess_f && m_ess_f == HIGH) { //Erschütterungssensor Fenster Doppelabfragung
if (digitalRead(ess_f) == HIGH) {
trigger = HIGH;
alarm = HIGH;
aktiv = LOW;
m_ess_f = LOW;
a_ess_f = HIGH;
timer_alarm = millis();
}
else m_ess_f = LOW;
}
}
void reset() { //Funktion reset System
reset_status = HIGH;
}
void alarmierung() { //Funktion Alarm ausgelöst
digitalWrite(sirene, HIGH);
lcd.setCursor(0, 2);
lcd.print(" Alarm ausgel\xEFst!");
if (millis() - timer_alarm >= time_alarm) {
digitalWrite(sirene, LOW);
alarm = LOW;
while (digitalRead(scs) == HIGH) {
digitalWrite(led_rot, !digitalRead(led_rot));
delay(250);
}
}
if (a_mgs_t == HIGH) {
lcd.setCursor(0, 3);
lcd.print(" Magnets. T\xF5r ");
}
if (a_mgs_f == HIGH) {
lcd.setCursor(0, 3);
lcd.print(" Magnets. Fenster ");
}
if (a_ess_t == HIGH) {
lcd.setCursor(0, 3);
lcd.print(" Ersch\xF5tter. T\xF5r");
}
if (a_ess_f == HIGH) {
lcd.setCursor(0, 3);
lcd.print("Ersch\xF5tter. Fenster");
}
}
void lcd_beleuchtung() { //Interrupt für Display Beleuchtung
timer_display = millis();
quittieren = HIGH;
}
void sende_testsms() {
digitalWrite(slave, HIGH);
lcd.backlight();
lcd.setCursor(0, 2);
lcd.print(" Sende SMS... ");
for (int i = 0; i < 20; i++) {
lcd.setCursor(i, 3);
lcd.print("\xFF");
delay(time_send_sms / 20);
}
lcd.setCursor(0, 2);
lcd.print(" SMS gesendet! ");
delay(1000);
lcd.setCursor(0, 2);
lcd.print(" Standby ");
lcd.setCursor(0, 3);
lcd.print(" ");
timer_display = millis();
digitalWrite(slave, LOW);
}