#include <LiquidCrystal_I2C.h>
//INDOOR SENSOR
#define WINDOW 0
#define WATER 1
#define TEMPERATURE 2
#define FIRE 3
//OUTDOOR SENSOR CONNECTIONS
#define FRONTDOOR 4
#define PRESENCE 5
#define GARAGE 6
#define BACKDOOR 7
#define KEY 10
#define RFID 9
#define DELAY 5000
bool isIndoorSensor();
bool isOutdoorSensor();
void show(char *);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// variable state contains the current state
enum {STANDBY,INDOORS,OUTDOORS,ALARM, WAIT_IN, WAIT_OUT} state = STANDBY;
unsigned long start_time = 0; //tähän laitetaan aika muistiin
void setup()
{
pinMode(FIRE,INPUT_PULLUP);
pinMode(BACKDOOR,INPUT_PULLUP);
pinMode(WATER,INPUT_PULLUP);
pinMode(WINDOW,INPUT_PULLUP);
pinMode(TEMPERATURE,INPUT_PULLUP);
pinMode(GARAGE,INPUT_PULLUP);
pinMode(PRESENCE,INPUT_PULLUP);
pinMode(FRONTDOOR,INPUT_PULLUP);
pinMode(KEY,INPUT);
pinMode(RFID,INPUT);
lcd.backlight();
lcd.begin(16, 2);
show("STANDBY");
}
void loop()
{
// turn the LED on (HIGH is the voltage level)
switch (state) {
case STANDBY:
if (isActivated()){
state = INDOORS;
show("INDOORS");
}
break;
case INDOORS:
if(isRFID()){
state = WAIT_OUT;
show("Wait out");
start_time = millis();
}
else if(isIndoorSensor())
{
state = ALARM;
show("ALARM !!!");
}
else if(!isActivated()){
state = STANDBY;
show ("STANDBY");
}
break;
case OUTDOORS:
if (isOutdoorSensor())
{
state = WAIT_IN;
show("Wait in");
start_time = millis();
}
else if(isIndoorSensor())
{
state = ALARM;
show("ALARM!!!");
}
case ALARM:
if(!isActivated())
{
state = STANDBY;
show("STANDBY");
}
break;
case WAIT_OUT:
if ((millis() - start_time) >= DELAY)
{state = OUTDOORS;
show("OUTDOORS");
}
break;
case WAIT_IN:
if ((millis()- start_time) >= DELAY)
{
state = ALARM;
show ("ALARM !!!");
}
else if (!isRFID())
{
state = INDOORS;
show ("INDOORS");
}
break;
}
}
bool isIndoorSensor() {
return !(digitalRead(WINDOW) && digitalRead(WATER) && digitalRead(TEMPERATURE) && digitalRead(FIRE));
// kaikki lukijat on 1 jos ne ei ole päällä
//palauttaa 1 jos yksikin lukijoista on 0
}
bool isOutdoorSensor() {
return !(digitalRead(FRONTDOOR) && digitalRead(BACKDOOR) && digitalRead(PRESENCE) && digitalRead(GARAGE));
// kaikki lukijat on 1 jos ne ei ole päällä
//palauttaa 1 jos yksikin lukijoista on 0
}
void show(char* msg) {
lcd.setCursor(0,0); //lcd näytön asetukset
lcd.print(msg);
lcd.print(" ");
}
bool isActivated() {return digitalRead(KEY);}
bool isRFID() {return digitalRead(RFID);}