#include #include #include #include char *firmwareRev = "1.1"; //VERSION int EEPROMVersion = 1; //version control to rewrite eeprom after update int EEPROMBuild = 1; //RUNTIME VARIABLES bool fullAlarm = false; //bool to control if this is a full alarm that requres a panel reset to clear bool silenced = false; bool keyInserted = false; //if the control panel has a key inserted bool horn = false; //bool to control if the horns are active bool strobe = false; //bool to control if the strobes are active bool trouble = false; //bool to control if the panel is in trouble bool troubleAck = false; //bool to control if the trouble is acknowledged bool configMenu = false; //determine if the control panel is in the configuration menu bool resetPressed = false; bool silencePressed = false; //make sure that presses don't count more than once bool drillPressed = false; bool resetStillPressed = false; bool silenceStillPressed = false; //make sure that presses don't count more than once bool drillStillPressed = false; bool updateScreen = false; //updating the screen in the config menu bool possibleAlarm = false; //panel receieved 0 from pull station ciruit and is now investigating bool definiteAlarm = false; //panel has investigated and determined that it was not a fluke bool walkTest = false; //is the system in walk test bool silentWalkTest = false; bool backlightOn = true; int characters[] = {32,45,46,47,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90}; //characters allowed on name int panelNameList[16]; int clearTimer = 0; //timer for keeping track of button holding for clearing character in the name editor int verification = 0; //number to keep track of ms for verification int drill = 0; //number to keep track of ms for drill int troubleTimer = 0; //ms for trouble int codeWheelTimer = 0; //code wheel timing variable int troubleLedTimer = 0; //number to keep track of ms for trouble light int alarmLedTimer = 0; //alarm led timer int troubleType = 0; //trouble type 0 - general, 1 - eol resistor int lcdUpdateTimer = 0; //update delay int lcdTimeoutTimer = 0; //timer to keep track of how long until lcd off int walkTestSmokeDetectorTimer = 0; int currentScreen = -1; //update display if previous screen is not the same int configPage = 0; //config page for the config menu int cursorPosition = 0; //which menu item the cursor is over int zerosCounted = 0; //verification variable int walkTestCount = 0; //keep track of walk test activations int zoneAlarm = 0; //which zone is in alarm 0 - none | 1 - zone 1 | 2 - zone 2 | 3 - zone 1 & 2 String configTop; //configuration menu strings for lcd String configBottom; String currentConfigTop; //configuration menu strings for current lcd display String currentConfigBottom; //CONFIG VARIABLES (Set these by default in case eeprom fails to load, and it cannot be reset. Allows the FACP to still run with a default configuration) bool keyRequired = false; //determine if key switch is required to operate buttons bool isVerification = true; //is verification turned on bool eolResistor = true; //is the EOL resistor enabled bool preAlarm = false; //use pre-alarm? bool smokeDetectorPreAlarm = false; //should smoke detectors activate first stage bool audibleSilence = true; int smokeDetectorTimeout = 5; //how long should smoke detector pre-alarm wait before cancelling the pre-alarm int firstStageTime = 1; //time in minutes that first stage should last int codeWheel = 0; //which alarm pattern to use, code-3 default int verificationTime = 2500; int resistorLenience = 0; int panelHomescreen = 0; int lcdTimeout = 0; String panelName = ""; LiquidCrystal_I2C lcd(0x27,16,2); //PINS int zone1Pin = 15; int zone2Pin = 15; //TESTING is set to 15 but is normally 39 int hornPin = 13; int buzzerPin = 4; int strobePin = 18; int smokeDetectorPin = 14; int readyLedPin = 27; int silenceLedPin = 26; int alarmLedPin = 25; int keySwitchPin = 33; int resetSwitchPin = 32; int silenceSwitchPin = 35; int drillSwitchPin = 34; int sclPin = 22; int sdaPin = 21; void resetEEPROM() { for (int i=0; i<=1024; i++){ //write all 255's from 0-1024 address EEPROM.write(i,255); } EEPROM.write(0,76);EEPROM.write(1,101);EEPROM.write(2,120);EEPROM.write(3,122);EEPROM.write(4,97);EEPROM.write(5,99);EEPROM.write(6,104); //write Lexzach to addresses 0-6 EEPROM.write(7,0); //code-3 default EEPROM.write(8,0); //key not required by default EEPROM.write(9,1); //verification is turned on by default EEPROM.write(10,25); //default verification time of 2.5 seconds //system name "ANTIGNEOUS" EEPROM.write(11,65);EEPROM.write(12,78);EEPROM.write(13,84);EEPROM.write(14,73);EEPROM.write(15,71);EEPROM.write(16,78);EEPROM.write(17,69);EEPROM.write(18,79);EEPROM.write(19,85);EEPROM.write(20,83); for (int i=21; i<=26; i++){ //write all 0's from 23-71 address EEPROM.write(i,0); } EEPROM.write(50, EEPROMVersion); //write current version and build EEPROM.write(51, EEPROMBuild); EEPROM.write(72,125); //EOL lenience 500 by default (take the value stored and multiply by 4 to get actual value) EEPROM.write(73,1); //EOL resistor is enabled by default EEPROM.write(74,0); //pre-alarm disabled by default EEPROM.write(75,1); //pre-alarm first-stage is 1 minute by default EEPROM.write(76,0); //smoke detector pre-alarm is disable by default EEPROM.write(77,5); //smoke detector timeout is five minutes by default EEPROM.write(78,0); //homescreen is panel name by default EEPROM.write(79,1); //audible silence is enabled by default EEPROM.write(80,0); //lcd timeout is disabled by default (time in MS found by taking value and multiplying it by 15000) EEPROM.commit(); } void setup() { Serial.begin(115200); //begin serial Serial.println("Lexzach's Low-Cost FACP v1"); Serial.println("Booting..."); pinMode(hornPin, OUTPUT); //horn pinMode(strobePin, OUTPUT); //strobe pinMode(smokeDetectorPin, OUTPUT); //smoke relay pinMode(readyLedPin, OUTPUT); //ready LED pinMode(silenceLedPin, OUTPUT); //silence LED pinMode(alarmLedPin, OUTPUT); //alarm LED pinMode(keySwitchPin, INPUT); //key switch pinMode(resetSwitchPin, INPUT); //reset switch pinMode(silenceSwitchPin, INPUT); //silence switch pinMode(resetSwitchPin, INPUT); //drill switch pinMode(zone1Pin, INPUT); //zone 1 pinMode(zone2Pin, INPUT); //zone 2 pinMode(buzzerPin, OUTPUT); //buzzer digitalWrite(hornPin, HIGH); //horn digitalWrite(strobePin, HIGH); //strobe digitalWrite(smokeDetectorPin, HIGH); //smoke relay pinMode(sclPin, OUTPUT); //scl pinMode(sdaPin, OUTPUT); //sda Serial.println("Initializing LCD..."); lcd.init(); //initialize LCD lcd.backlight(); lcd.clear(); lcd.setCursor(4,0); lcd.print("Booting..."); Serial.println("Configured all pins"); EEPROM.begin(1025); //allocate memory address 0-1024 for EEPROM Serial.println("Configured EEPROM for addresses 0-1024"); // EEPROM.write(0,255); //UNCOMMENT TO INVALIDATE EEPROM AND REFLASH IT AFTER EVERY RESTART // EEPROM.commit(); Serial.println("Verifying EEPROM configuration integrity..."); if (EEPROM.read(0) != 76 or EEPROM.read(6) != 104 or EEPROM.read(7) > 5 or EEPROM.read(8) > 1 or EEPROM.read(50) != EEPROMVersion or EEPROM.read(51) != EEPROMBuild){ //EEPROM verification, check essential-to-run components, listing all conditions that cannot exist in a correct EEPROM Serial.println("EEPROM verification failed. Re-writing EEPROM"); resetEEPROM(); } else { Serial.println("EEPROM verification finished"); } Serial.println("Current EEPROM:"); for (int i=0; i<=1024; i++){ Serial.print(EEPROM.read(i)); Serial.print(" "); } Serial.println(); //CONFIG LOADING ROUTINE Serial.println("Loading config from EEPROM..."); codeWheel = EEPROM.read(7); //codeWheel setting address if (EEPROM.read(8) == 1){ keyRequired = true; } else { keyRequired = false; } if (EEPROM.read(9) == 1){ isVerification = true; } else { isVerification = false; } if (EEPROM.read(73) == 1){ eolResistor = true; } else { eolResistor = false; } if (EEPROM.read(74) == 1){ preAlarm = true; } else { preAlarm = false; } if (EEPROM.read(76) == 1){ smokeDetectorPreAlarm = true; } else { smokeDetectorPreAlarm = false; } if (EEPROM.read(79) == 1){ audibleSilence = true; } else { audibleSilence = false; } smokeDetectorTimeout = EEPROM.read(77)*60000; firstStageTime = EEPROM.read(75)*60000; verificationTime = EEPROM.read(10)*100; resistorLenience = EEPROM.read(72)*4; panelHomescreen = EEPROM.read(78); lcdTimeout = EEPROM.read(80)*15000; int x=0; for (int i=11; i<=71; i++){ //read panel name if (EEPROM.read(i) != 0){ panelName = panelName + (char)EEPROM.read(i); panelNameList[x] = EEPROM.read(i); x++; } } Serial.println("Config loaded"); digitalWrite(readyLedPin, HIGH); //power on ready LED on startup digitalWrite(silenceLedPin, LOW); digitalWrite(alarmLedPin, LOW); digitalWrite(smokeDetectorPin, LOW); //turn on smoke relay } void tone() { ledcSetup(0, 5000, 8); // setup beeper ledcAttachPin(buzzerPin, 0); // attach beeper ledcWriteTone(0, 1500); // play tone } void noTone() { ledcSetup(0, 5000, 8); // setup beeper ledcAttachPin(buzzerPin, 0); // attach beeper ledcWriteTone(0, 0); // stop tone } void activateNAC(){ horn = true; strobe = true; fullAlarm = true; silenced = false; configMenu = false; tone(); digitalWrite(alarmLedPin, HIGH); digitalWrite(silenceLedPin, HIGH); } void checkKey(){ if (digitalRead(keySwitchPin) == HIGH){ keyInserted = true; } else { keyInserted = false; } } void checkDevices(){ if (walkTest == 0){ if ((analogRead(zone1Pin) <= resistorLenience or analogRead(zone2Pin) <= resistorLenience) and horn != true and silenced==false){ possibleAlarm = true; } if (possibleAlarm == true and horn != true and strobe != true and silenced==false and isVerification == true){ //verification code if (analogRead(zone1Pin) == 0 or analogRead(zone2Pin) == 0){ zerosCounted++; } if (verification >= verificationTime){ if (zerosCounted > 0.1*verificationTime and analogRead(zone1Pin) == 0 and analogRead(zone2Pin) == 0){ definiteAlarm = true; possibleAlarm = false; zerosCounted = 0; verification = 0; } else { zerosCounted = 0; possibleAlarm = false; verification = 0; } } else { verification++; } } } else if (walkTest == true){ if (analogRead(zone1Pin) == 0){// or analogRead(zone2Pin) == 0){ walkTestCount++; walkTestSmokeDetectorTimer = 0; while (analogRead(zone1Pin) <= resistorLenience) {// or analogRead(zone2Pin) <= resistorLenience) { digitalWrite(strobePin, LOW); if (silentWalkTest == false){ digitalWrite(hornPin, LOW); } digitalWrite(alarmLedPin, HIGH); walkTestSmokeDetectorTimer++; if (walkTestSmokeDetectorTimer >= 5000){ digitalWrite(smokeDetectorPin, HIGH); } delay(1); } digitalWrite(strobePin, HIGH); if (silentWalkTest == false){ digitalWrite(hornPin, HIGH); } digitalWrite(alarmLedPin, HIGH); currentScreen = -1; delay(250); digitalWrite(smokeDetectorPin, LOW); } } if (definiteAlarm == true or (isVerification == false and analogRead(zone1Pin) <= resistorLenience and horn != true and silenced==false)){ //activate the horns and strobes after verification activateNAC(); definiteAlarm = false; } else if (analogRead(zone1Pin) == 4095 and eolResistor == true and troubleTimer == 2000) { trouble = true; troubleType=1; } else if (analogRead(zone1Pin) == 4095 and eolResistor == true and troubleTimer <= 2000){ troubleTimer++; } else { troubleTimer = 0; } } void troubleCheck(){ if (trouble == true){ if (troubleLedTimer == 0){ digitalWrite(readyLedPin, LOW); if (troubleAck == false and fullAlarm == false){ noTone(); } } else if (troubleLedTimer == 750){ digitalWrite(readyLedPin, HIGH); if (troubleAck == false and fullAlarm == false){ //sound the buzzer if the trouble is not acked tone(); } } else if (troubleLedTimer == 1500){ troubleLedTimer = -1; } troubleLedTimer++; } else { if (walkTest == false){ digitalWrite(readyLedPin, HIGH); } if (troubleLedTimer != 0){ noTone(); } troubleLedTimer=0; } } void checkButtons(){ if (digitalRead(resetSwitchPin) == HIGH){ //RESET BUTTON lcd.clear(); lcd.setCursor(2,0); lcd.print("Resetting..."); tone(); digitalWrite(readyLedPin, HIGH); //ready LED digitalWrite(silenceLedPin, HIGH); //silence LED digitalWrite(alarmLedPin, HIGH); //alarm LED digitalWrite(hornPin, HIGH); //horn digitalWrite(strobePin, HIGH); //strobe digitalWrite(smokeDetectorPin, HIGH); //smoke relay delay(2500); noTone(); digitalWrite(readyLedPin, LOW); //ready LED digitalWrite(silenceLedPin, HIGH); //silence LED digitalWrite(alarmLedPin, HIGH); //alarm LED ESP.restart(); } if (digitalRead(silenceSwitchPin) == HIGH){ //SILENCE BUTTON if (horn == true){ //if horns are not silenced, silence the horns digitalWrite(silenceLedPin, HIGH); digitalWrite(alarmLedPin, HIGH); horn = false; if (audibleSilence == false){ strobe = false; } silenced=true; noTone(); } else if (horn == false and strobe == false and trouble == true and silencePressed == false and troubleAck==false){ troubleAck = true; noTone(); } else if (horn == false and strobe == false and fullAlarm == false and silencePressed == false and configMenu == false){ configMenu = true; resetStillPressed = true; //make sure the menu doesn't close out as soon as someone opens it silenceStillPressed = true; drillStillPressed = true; char *main[] = {"Testing","Settings"}; //menu 0 configTop = (String)main[0]; configBottom = (String)main[1]; configPage = 0; cursorPosition = 0; currentConfigBottom = ""; currentConfigTop = ""; } silencePressed = true; } else { silencePressed = false; } if (digitalRead(drillSwitchPin) == HIGH and horn != true){ //DRILL BUTTON if (drill == 2000){ activateNAC(); } else { drill++; } drillPressed = true; } else { drill = 0; drillPressed = false; } } void alarm(){ if (strobe == true){ digitalWrite(strobePin, LOW); }else{ digitalWrite(strobePin,HIGH); } if (horn == true){ if (codeWheel == 0){ if (codeWheelTimer == 0){ //temporal code 3 digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 500) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 1000) { digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 1500) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 2000) { digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 2500) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 4000) { codeWheelTimer = -1; } } else if (codeWheel == 1) { if (codeWheelTimer == 0){ //marchtime digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 250){ digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 500){ codeWheelTimer = -1; } } else if (codeWheel == 2) { //4-4 if (codeWheelTimer == 0) { digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 300) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 600) { digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 900) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 1200) { digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 1500) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 1800) { digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 2100) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 2850) { digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 3150) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 3450) { digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 3750) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 4050) { digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 4350) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 4650) { digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 4950) { digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 14950) { codeWheelTimer = -1; } } else if (codeWheel == 3) { //continuous digitalWrite(hornPin, LOW); } else if (codeWheel == 5) { if (codeWheelTimer == 0){ //marchtime slower digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 500){ digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 1000){ codeWheelTimer = -1; } } else if (codeWheel == 4) { if (codeWheelTimer == 0){ //california code digitalWrite(hornPin, LOW); } else if (codeWheelTimer == 10000){ digitalWrite(hornPin, HIGH); } else if (codeWheelTimer == 15000){ codeWheelTimer = -1; } } codeWheelTimer++; alarmLedTimer++; if (alarmLedTimer >= 750){ if (digitalRead(25) == false){ digitalWrite(alarmLedPin, HIGH); alarmLedTimer = 0; } else { digitalWrite(alarmLedPin, HIGH); alarmLedTimer = 0; } } } else { digitalWrite(hornPin, HIGH); codeWheelTimer = 0; } } void lcdUpdate(){ if (trouble==false and fullAlarm==false and horn==false and strobe==false and walkTest == false and currentScreen != 0){ lcd.noAutoscroll(); lcd.clear(); lcd.setCursor(2,0); lcd.print("System Normal"); lcd.setCursor(0,1); if (panelHomescreen == 0){ lcd.print(panelName); } else if (panelHomescreen == 1){ lcd.print(analogRead(zone1Pin)); } currentScreen = 0; } else if (trouble==true){ if (troubleType == 0 and currentScreen != 1){ lcd.clear(); lcd.setCursor(1,0); lcd.print("* Trouble *"); lcd.setCursor(2,1); lcd.print("Unknown"); currentScreen = 1; } else if (troubleType == 1 and currentScreen != 2){ lcd.clear(); lcd.setCursor(0,0); lcd.print("* Trouble *"); lcd.setCursor(0,0); lcd.print("Ground Fault"); lcd.autoscroll(); currentScreen = 2; } } else if (fullAlarm == true and silenced == false and currentScreen != 3){ lcd.clear(); lcd.setCursor(1,0); lcd.print("* FIRE ALARM *"); // lcd.setCursor(2,1); // lcd.print("Zone 1"); currentScreen = 3; } else if (silenced == true and currentScreen != 4){ lcd.clear(); lcd.setCursor(1,0); lcd.print("* FIRE ALARM *"); lcd.setCursor(1,1); lcd.print("-- SILENCED --"); // lcd.setCursor(2,1); // lcd.print("Zone 1"); currentScreen = 4; } else if (walkTest == true and currentScreen != 5) { lcd.clear(); lcd.setCursor(0,0); lcd.print("* Supervisory *"); lcd.setCursor(0,1); if (silentWalkTest == false){ lcd.print("Walk Test - "+(String)walkTestCount); } else { lcd.print("S. Wlk Test - "+(String)walkTestCount); } currentScreen = 5; digitalWrite(readyLedPin, LOW); //ready led off for walk test } } void config(){ char *main[] = {"Testing","Settings"}; //menu 0 char *mainTesting[] = {"Walk Test","Silent Wlk Test","Strobe Test"}; //menu 1 char *mainSettings[] = {"Fire Alarm","Panel"}; //menu 2 char *mainSettingsFireAlarmSettings[] = {"Coding","Verification","Pre-Alarm","Audible Sil.: "}; //menu 3 char *mainSettingsVerificationSettings[] = {"Verification:","Verif. Time"}; //menu 4 char *mainSettingsFireAlarmSettingsCoding[] = {"Temporal Three","Marchtime","4-4","Continuous","California","Slow Marchtime"}; //menu 5 char *mainSettingsFireAlarmSettingsPreAlarmSettings[] = {"Pre-Alarm: ","stage 1: ","Detector PreAlrm"}; //menu 6 char *mainSettingsFireAlarmSettingsPreAlarmSettingsSmokeDetectorPreAlarmSettings[] = {"Det. PreAlrm: ","Det. 1st stge: ","Det. Tmeout: "}; //menu 7 char *mainPanelSettings[] = {"Panel Name","Panel Security","LCD Dim:","Factory Reset","About"}; //menu 8 char *mainPanelSettingsPanelSecurity[] = {"None","Keyswitch","Passcode"}; //menu 9 char *mainPanelSettingsPanelName[] = {"Enter Name:"}; //menu 10 char *mainPanelSettingsFactoryReset[] = {"Are you sure?"}; //menu 11 char *mainPanelSettingsAbout[] = {"ANTIGNEOUS OS","Firmware:",firmwareRev,"by Lexzach"}; //menu 12 // char *mainPanelSettingsHomescreen[] = {"Panel Name", "Stats for Nerds"}; //menu 10 // char *mainPanelSettingsHomescreenStatsForNerds[] = {"Zone Input Voltages"}; //menu 11 if (digitalRead(resetSwitchPin) == HIGH){ //RESET BUTTON resetPressed = true; } else { resetPressed = false; resetStillPressed = false; } if (digitalRead(silenceSwitchPin) == HIGH){ //SILENCE BUTTON silencePressed = true; } else { silencePressed = false; silenceStillPressed = false; } if (digitalRead(drillSwitchPin) == HIGH){ //DRILL BUTTON drillPressed = true; } else { drillPressed = false; drillStillPressed = false; } if (configPage == 0){ if (resetPressed == true and resetStillPressed == false){ if (cursorPosition == 0){ //main screen cursorPosition = 1; configTop = (String)main[1]; configBottom = (String)main[0]; } else if (cursorPosition == 1){ cursorPosition = 0; configTop = (String)main[0]; configBottom = (String)main[1]; } } else if (silencePressed == true and silenceStillPressed == false){ silencePressed = true; configMenu = false; currentScreen=-1; } else if (drillPressed == true and drillStillPressed == false){ if (cursorPosition == 0){ //cursor over testing configPage = 1; //change screen to testing cursorPosition = 0; configTop = (String)mainTesting[0]; configBottom = (String)mainTesting[1]; } else if (cursorPosition == 1){ //cursor over settings configPage = 2; //change screen to settings cursorPosition = 0; configTop = (String)mainSettings[0]; configBottom = (String)mainSettings[1]; } } } else if (configPage == 1){ if (resetPressed == true and resetStillPressed == false){ if (cursorPosition == 0){ cursorPosition = 1; configTop = (String)mainTesting[1]; configBottom = (String)mainTesting[2]; } else if (cursorPosition == 1) { cursorPosition = 2; configTop = (String)mainTesting[2]; configBottom = (String)mainTesting[0]; } else if (cursorPosition == 2) { cursorPosition = 0; configTop = (String)mainTesting[0]; configBottom = (String)mainTesting[1]; } } else if (silencePressed == true and silenceStillPressed == false){ configPage = 0; cursorPosition = 0; configTop = (String)main[0]; configBottom = (String)main[1]; strobe = false; } else if (drillPressed == true and drillStillPressed == false){ if (cursorPosition == 0){ walkTest = true; silentWalkTest = false; silencePressed = true; configMenu = false; currentScreen=-1; walkTestCount = 0; } else if (cursorPosition == 1) { walkTest = true; silentWalkTest = true; silencePressed = true; configMenu = false; currentScreen=-1; walkTestCount = 0; } else if (cursorPosition == 2) { if (strobe == false){ strobe = true; configTop = (String)mainTesting[2]+" *"; } else { strobe = false; configTop = (String)mainTesting[2]; } } } } else if (configPage == 2){ if (resetPressed == true and resetStillPressed == false){ if (cursorPosition == 0){ //main screen cursorPosition = 1; configTop = (String)mainSettings[1]; configBottom = (String)mainSettings[0]; } else if (cursorPosition == 1){ cursorPosition = 0; configTop = (String)mainSettings[0]; configBottom = (String)mainSettings[1]; } } else if (silencePressed == true and silenceStillPressed == false){ configPage = 0; cursorPosition = 0; configTop = (String)main[0]; configBottom = (String)main[1]; } else if (drillPressed == true and drillStillPressed == false){ if (cursorPosition == 0){ configPage = 3; //change screen to facp settings cursorPosition = 0; configTop = (String)mainSettingsFireAlarmSettings[0]; configBottom = (String)mainSettingsFireAlarmSettings[1]; } else if (cursorPosition == 1){ configPage = 8; //change screen to facp settings cursorPosition = 0; configTop = (String)mainPanelSettings[0]; configBottom = (String)mainPanelSettings[1]; } } } else if (configPage == 3){ if (resetPressed == true and resetStillPressed == false){ if (cursorPosition == 0){ cursorPosition = 1; configTop = (String)mainSettingsFireAlarmSettings[1]; configBottom = (String)mainSettingsFireAlarmSettings[2]; } else if (cursorPosition == 1) { cursorPosition = 2; configTop = (String)mainSettingsFireAlarmSettings[2]; configBottom = (String)mainSettingsFireAlarmSettings[3]+audibleSilence; } else if (cursorPosition == 2) { cursorPosition = 3; configTop = (String)mainSettingsFireAlarmSettings[3]+audibleSilence; configBottom = (String)mainSettingsFireAlarmSettings[0]; } else if (cursorPosition == 3) { cursorPosition = 0; configTop = (String)mainSettingsFireAlarmSettings[0]; configBottom = (String)mainSettingsFireAlarmSettings[1]; } } else if (silencePressed == true and silenceStillPressed == false){ configPage = 2; cursorPosition = 0; configTop = (String)mainSettings[0]; configBottom = (String)mainSettings[1]; } else if (drillPressed == true and drillStillPressed == false){ if (cursorPosition == 0){ configPage = 5; cursorPosition = 0; if (codeWheel == 0){ configTop = (String)mainSettingsFireAlarmSettingsCoding[0] + "*"; } else { configTop = (String)mainSettingsFireAlarmSettingsCoding[0]; } if (codeWheel == 1){ configBottom = (String)mainSettingsFireAlarmSettingsCoding[1] + "*"; } else { configBottom = (String)mainSettingsFireAlarmSettingsCoding[1]; } } else if (cursorPosition == 1) { configPage = 4; cursorPosition = 0; configTop = (String)mainSettingsVerificationSettings[0]; configBottom = (String)mainSettingsVerificationSettings[1]; } else if (cursorPosition == 2) { configPage = 6; cursorPosition = 0; configTop = (String)mainSettingsFireAlarmSettingsPreAlarmSettings[0]; configBottom = (String)mainSettingsFireAlarmSettingsPreAlarmSettings[1]; } else if (cursorPosition == 3) { if (audibleSilence == true){ audibleSilence = false; EEPROM.write(79,0); } else { audibleSilence = true; EEPROM.write(79,1); } EEPROM.commit(); configTop = (String)mainSettingsFireAlarmSettings[3]+audibleSilence; configBottom = (String)mainSettingsFireAlarmSettings[0]; } } } else if (configPage == 8){ if (resetPressed == true and resetStillPressed == false){ if (cursorPosition == 0){ cursorPosition = 1; configTop = (String)mainPanelSettings[1]; if (lcdTimeout == 0){ configBottom = (String)mainPanelSettings[2] + "off"; } else if (lcdTimeout<=30000) { configBottom = (String)mainPanelSettings[2] + lcdTimeout/1000+"s"; } else { configBottom = (String)mainPanelSettings[2] + lcdTimeout/60000+"m"; } } else if (cursorPosition == 1) { cursorPosition = 2; if (lcdTimeout == 0){ configTop = (String)mainPanelSettings[2] + "off"; } else if (lcdTimeout<=30000) { configTop = (String)mainPanelSettings[2] + lcdTimeout/1000+"s"; } else { configTop = (String)mainPanelSettings[2] + lcdTimeout/60000+"m"; } configBottom = (String)mainPanelSettings[3]; } else if (cursorPosition == 2) { cursorPosition = 3; configTop = (String)mainPanelSettings[3]; configBottom = (String)mainPanelSettings[4]; } else if (cursorPosition == 3) { cursorPosition = 4; configTop = (String)mainPanelSettings[4]; configBottom = (String)mainPanelSettings[0]; } else if (cursorPosition == 4) { cursorPosition = 0; configTop = (String)mainPanelSettings[0]; configBottom = (String)mainPanelSettings[1]; } } else if (silencePressed == true and silenceStillPressed == false){ configPage = 2; cursorPosition = 0; configTop = (String)mainSettings[0]; configBottom = (String)mainSettings[1]; } else if (drillPressed == true and drillStillPressed == false){ if (cursorPosition == 0){ configPage = 10; cursorPosition = 0; configTop = "Enter Name:"; configBottom = (String)panelName; lcd.blink_on(); } else if (cursorPosition == 1) { //panel security } else if (cursorPosition == 2) { if (lcdTimeout == 0){ lcdTimeout = 15000; EEPROM.write(80,1); } else if (lcdTimeout == 15000){ lcdTimeout = 30000; EEPROM.write(80,2); } else if (lcdTimeout == 30000){ lcdTimeout = 60000; EEPROM.write(80,4); } else if (lcdTimeout == 60000){ lcdTimeout = 300000; EEPROM.write(80,20); } else if (lcdTimeout == 300000){ lcdTimeout = 600000; EEPROM.write(80,40); } else if (lcdTimeout >= 600000){ lcdTimeout = 0; EEPROM.write(80,0); } EEPROM.commit(); if (lcdTimeout == 0){ configTop = (String)mainPanelSettings[2] + "off"; } else if (lcdTimeout<=30000) { configTop = (String)mainPanelSettings[2] + lcdTimeout/1000+"s"; } else { configTop = (String)mainPanelSettings[2] + lcdTimeout/60000+"m"; } } else if (cursorPosition == 3){ //factory reset } else if (cursorPosition == 4){ //firmware version } } } else if (configPage == 10){ //panel rename routine if (resetPressed == true and resetStillPressed == false){ clearTimer = 0; if (panelNameList[cursorPosition] == 90){ panelNameList[cursorPosition] = 32; } else if (panelNameList[cursorPosition] == 32){ panelNameList[cursorPosition] = 39; } else if (panelNameList[cursorPosition] == 39){ panelNameList[cursorPosition] = 45; } else if (panelNameList[cursorPosition] == 57){ panelNameList[cursorPosition] = 65; } else { panelNameList[cursorPosition] = panelNameList[cursorPosition] + 1; } } else if (resetPressed==true and resetStillPressed==true) { clearTimer++; if (clearTimer >= 1000) { panelNameList[cursorPosition] = 32; } } else if (silencePressed == true and silenceStillPressed == false){ int x=0; for (int i=11; i<=26; i++){ //write new panel name EEPROM.write(i,panelNameList[x]); x++; } lcd.blink_off(); EEPROM.commit(); configPage = 8; cursorPosition = 0; configTop = (String)mainPanelSettings[0]; configBottom = (String)mainPanelSettings[1]; x=0; panelName = ""; for (int i=11; i<=71; i++){ //read panel name if (EEPROM.read(i) != 0){ panelName = panelName + (char)EEPROM.read(i); panelNameList[x] = EEPROM.read(i); x++; } } } else if (drillPressed == true and drillStillPressed == false){ currentConfigTop = "e"; //make sure the screen re-renders if (cursorPosition != 15){ cursorPosition++; } else { cursorPosition = 0; } } if (configPage == 10){ //make sure the panel doesn't re-render the text on the previous page when exiting configBottom = ""; for (int i=0; i<=15; i++){ //generate name to print on lcd configBottom = configBottom + (char)panelNameList[i]; } } } else if (configPage == 5){ if (resetPressed == true and resetStillPressed == false){ if (cursorPosition == 0){ cursorPosition = 1; if (codeWheel == 1){ configTop = (String)mainSettingsFireAlarmSettingsCoding[1]+"*"; } else{ configTop = (String)mainSettingsFireAlarmSettingsCoding[1]; } if (codeWheel == 2){ configBottom = (String)mainSettingsFireAlarmSettingsCoding[2]+"*"; } else { configBottom = (String)mainSettingsFireAlarmSettingsCoding[2]; } } else if (cursorPosition == 1) { cursorPosition = 2; if (codeWheel == 2){ configTop = (String)mainSettingsFireAlarmSettingsCoding[2]+"*"; } else { configTop = (String)mainSettingsFireAlarmSettingsCoding[2]; } if (codeWheel == 3){ configBottom = (String)mainSettingsFireAlarmSettingsCoding[3]+"*"; } else { configBottom = (String)mainSettingsFireAlarmSettingsCoding[3]; } } else if (cursorPosition == 2) { cursorPosition = 3; if (codeWheel == 3){ configTop = (String)mainSettingsFireAlarmSettingsCoding[3]+"*"; } else { configTop = (String)mainSettingsFireAlarmSettingsCoding[3]; } if (codeWheel == 4){ configBottom = (String)mainSettingsFireAlarmSettingsCoding[4]+"*"; } else { configBottom = (String)mainSettingsFireAlarmSettingsCoding[4]; } } else if (cursorPosition == 3) { cursorPosition = 4; if (codeWheel == 4){ configTop = (String)mainSettingsFireAlarmSettingsCoding[4]+"*"; } else { configTop = (String)mainSettingsFireAlarmSettingsCoding[4]; } if (codeWheel == 5){ configBottom = (String)mainSettingsFireAlarmSettingsCoding[5]+"*"; } else { configBottom = (String)mainSettingsFireAlarmSettingsCoding[5]; } } else if (cursorPosition == 4) { cursorPosition = 5; if (codeWheel == 5){ configTop = (String)mainSettingsFireAlarmSettingsCoding[5]+"*"; } else { configTop = (String)mainSettingsFireAlarmSettingsCoding[5]; } if (codeWheel == 0){ configBottom = (String)mainSettingsFireAlarmSettingsCoding[0]+"*"; } else { configBottom = (String)mainSettingsFireAlarmSettingsCoding[0]; } } else if (cursorPosition == 5) { cursorPosition = 0; if (codeWheel == 0){ configTop = (String)mainSettingsFireAlarmSettingsCoding[0]+"*"; } else { configTop = (String)mainSettingsFireAlarmSettingsCoding[0]; } if (codeWheel == 1){ configBottom = (String)mainSettingsFireAlarmSettingsCoding[1]+"*"; } else{ configBottom = (String)mainSettingsFireAlarmSettingsCoding[1]; } } } else if (silencePressed == true and silenceStillPressed == false){ configPage = 3; //change screen to facp settings cursorPosition = 0; configTop = (String)mainSettingsFireAlarmSettings[0]; configBottom = (String)mainSettingsFireAlarmSettings[1]; } else if (drillPressed == true and drillStillPressed == false){ EEPROM.write(7,cursorPosition); EEPROM.commit(); configTop = (String)mainSettingsFireAlarmSettingsCoding[cursorPosition]+"*"; if (cursorPosition == 5){ configBottom = (String)mainSettingsFireAlarmSettingsCoding[0]; } else { configBottom = (String)mainSettingsFireAlarmSettingsCoding[cursorPosition+1]; } codeWheel = EEPROM.read(7); //codeWheel setting address } } // if (resetPressed == true and resetStillPressed == false){ // } else if (silencePressed == true and silenceStillPressed == false){ // } else if (drillPressed == true and drillStillPressed == false){ // } if (configTop != currentConfigTop or configBottom != currentConfigBottom){ lcd.clear(); lcd.setCursor(0,0); lcd.print("]" + configTop); lcd.setCursor(0,1); lcd.print(configBottom); currentConfigTop = configTop; currentConfigBottom = configBottom; if (configPage == 10){ lcd.setCursor(cursorPosition,1); } } if (digitalRead(resetSwitchPin) == HIGH){ //RESET BUTTON resetStillPressed = true; } if (digitalRead(silenceSwitchPin) == HIGH){ //SILENCE BUTTON silenceStillPressed = true; } if (digitalRead(drillSwitchPin) == HIGH){ //DRILL BUTTON drillStillPressed = true; } } void loop() { if (lcdTimeout!=0){ if (lcdTimeout <= lcdTimeoutTimer and backlightOn == true){ lcd.noBacklight(); backlightOn = false; } else if (backlightOn == true) { lcdTimeoutTimer++; } if ((drillPressed == true or silencePressed == true or resetPressed == true or fullAlarm == true or trouble == true) and backlightOn == false){ lcdTimeoutTimer = 0; lcd.backlight(); backlightOn = true; } } delay(1); checkKey(); //check to see if the key is inserted checkDevices(); //check pull stations and smoke detectors if ((keyInserted == true or keyRequired == false) and configMenu == false){ checkButtons(); //check if certain buttons are pressed } troubleCheck(); //trouble check alarm(); //alarm codewheel if (configMenu==false){ lcdUpdate(); } else if (configMenu==true) { if (keyInserted == true or keyRequired == false){ config(); } } }