Compare commits
6 Commits
nightly-fi
...
stable-v1.
Author | SHA1 | Date | |
---|---|---|---|
5e98be43ed | |||
a924b6d243 | |||
21c20db83e | |||
94d8cd9c53 | |||
9263e47355 | |||
969e449376 |
41
README.md
41
README.md
@ -1,39 +1,6 @@
|
||||
# ⚠️ TESTED FIRMWARE IS IN [RELEASES](https://github.com/Lexzach/antigneous/releases) ⚠️
|
||||
# Stable Release v1.5
|
||||
|
||||
[](https://forthebadge.com) [](https://forthebadge.com) [](https://forthebadge.com)
|
||||

|
||||
# What is this? 🔥
|
||||
Antigneous is an open-source conventional fire alarm control panel, 3 years in the making. A fire alarm control panel is the device responsible for controlling all of the devices in a fire alarm system, such as smoke detectors, pull stations, and notification devices. Normally, a fire alarm control panel will run you back hundreds, if not thousands of dollars. This project strives to fix that issue by allowing for anyone to build their own reliable fire alarm control panel without breaking the bank.
|
||||
|
||||
# What do you mean by "open-source" 🔓
|
||||
**You do not have to give a single cent to me in order to build this panel.**
|
||||
|
||||
The code that is being ran in an Antigneous fire alarm control panel is completely visible to everyone and anyone, [right here](https://github.com/Lexzach/antigneous/blob/official-firmware/main/main.ino)! Don't like something about Antigneous, you can change it (or even better submit an issue or pull request). All hardware that is used in the making of an Antigneous panel is available to anyone. The wiring diagram for making your own is also available to anyone.
|
||||
|
||||
# Instruction Manuals 📄
|
||||
📕 [Basic Assembly and Operation Manual](https://github.com/Lexzach/antigneous/blob/official-firmware/instructions/antigneous_instructions.pdf) - [Download](https://github.com/Lexzach/antigneous/raw/official-firmware/instructions/antigneous_instructions.pdf)
|
||||
|
||||
📚 [Technical Instruction Manual](https://github.com/Lexzach/antigneous/blob/official-firmware/instructions/antigneous_tech_instructions.pdf) - [Download](https://github.com/Lexzach/antigneous/raw/official-firmware/instructions/antigneous_tech_instructions.pdf)
|
||||
|
||||
# Features and Limitations ⚖️
|
||||
Although I have tried to make Antigneous as feature-rich as possible, there are some limitations to take into consideration...
|
||||
|
||||
## Features ✅
|
||||
- LCD display
|
||||
- Very customizable, tinker friendly design
|
||||
- Many coding selections: Temporal three, Code 4-4, Marchtime, Continuous, California Code, and Slower Marchtime
|
||||
- Togglable keyless silence
|
||||
- Walk test, silent walk test, and strobe test
|
||||
- EOL resistor support for activating loop
|
||||
- Pull station and smoke detector verification
|
||||
- Fail-safe mode in case of unbootable panel
|
||||
- Selectable security levels, electronic keyswitch or no keyswitch
|
||||
- Strobe Sync support for System Sensor and Wheelock (more will be added)
|
||||
|
||||
## Current Limitations ❎
|
||||
- **NOT OFFICIALLY TESTED**! This should *not* be used in place of a fire panel from a name brand company
|
||||
- No EOL support for NAC circuit
|
||||
- No SmartSync, or two wire sync (CURRENTLY)
|
||||
- No support for 2 wire smoke detectors
|
||||
- Only 2 zones
|
||||
## Instruction Manuals 📄
|
||||
📕 [Basic Assembly and Operation Manual](https://code.lexza.ch/Lexzach/antigneous/src/branch/stable-v1.5/instructions/antigneous_instructions.pdf) - [Download](https://code.lexza.ch/Lexzach/antigneous/raw/branch/stable-v1.5/instructions/antigneous_instructions.pdf)
|
||||
|
||||
📚 [Technical Instruction Manual](https://code.lexza.ch/Lexzach/antigneous/src/branch/stable-v1.5/instructions/antigneous_tech_instructions.pdf) - [Download](https://code.lexza.ch/Lexzach/antigneous/raw/branch/stable-v1.5/instructions/antigneous_tech_instructions.pdf)
|
||||
|
BIN
gh_icon.png
BIN
gh_icon.png
Binary file not shown.
Before Width: | Height: | Size: 294 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
133
main/main.ino
133
main/main.ino
@ -13,15 +13,6 @@ char *firmwareRev = "v1.5"; //VERSION
|
||||
int EEPROMVersion = 1; //version control to rewrite eeprom after update
|
||||
int EEPROMBuild = 5;
|
||||
|
||||
//patents
|
||||
// https://patents.google.com/patent/US5559492 - simplex
|
||||
// https://patents.google.com/patent/US6281789 - simplex smartsync
|
||||
// https://patents.google.com/patent/US6194994 - wheelock
|
||||
// https://patents.google.com/patent/US5659287A/en - gentex strobe sync
|
||||
// https://patents.google.com/patent/US5959528 - gentex smartsync
|
||||
// https://patents.google.com/patent/US8928191B2/en - potter weird universal sync
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------- RUNTIME VARIABLES
|
||||
bool fullAlarm = false; //bool to control if this is a full alarm that requres a panel reset to clear
|
||||
bool silenced = false;
|
||||
@ -86,8 +77,6 @@ bool preAlarm = false; //use pre-alarm?
|
||||
bool smokeDetectorVerification = false; //should smoke detectors activate first stage
|
||||
bool smokeDetectorCurrentlyInVerification = false; //Is a smoke detector currently in verification?
|
||||
bool audibleSilence = true;
|
||||
bool useTwoWire = false; //does the panel use 2 wire for alarms
|
||||
int twoWireTimer = 0; //timer for 2 wire alarms
|
||||
int smokeDetectorTimeout = 60000; //how long to wait before toggling smoke detectors back on
|
||||
int smokeDetectorPostRestartTimer = 0; //variable to keep track of the 60 seconds post-power up that the panel watches the smoke detector
|
||||
int smokeDetectorPostRestartVerificationTime = 120000; //time in ms that the smoke detector should be monitored
|
||||
@ -325,11 +314,7 @@ void setup() {
|
||||
Serial.println("EEPROM verification failed.");
|
||||
lcd.clear();
|
||||
lcd.setCursor(0,0);
|
||||
if (EEPROM.read(50) != EEPROMVersion or EEPROM.read(51) != EEPROMBuild){ //display error 2 if the firmware is different
|
||||
lcd.print("ERROR 2");
|
||||
} else {
|
||||
lcd.print("ERROR 1");
|
||||
}
|
||||
lcd.print("ERROR 1");
|
||||
lcd.setCursor(0,1);
|
||||
lcd.print("check manual");
|
||||
while(not digitalRead(resetButtonPin) and not digitalRead(drillButtonPin)){ //wait until button is pressed
|
||||
@ -373,7 +358,6 @@ void setup() {
|
||||
smokeDetectorVerification = EEPROM.read(76) == 1 ? true : false;
|
||||
audibleSilence = EEPROM.read(79) == 1 ? true : false;
|
||||
keylessSilence = EEPROM.read(27) == 1 ? true : false;
|
||||
useTwoWire = EEPROM.read(30) == 1 ? true : false;
|
||||
smokeDetectorTimeout = EEPROM.read(77)*5000;
|
||||
smokeDetectorPostRestartVerificationTime = EEPROM.read(28)*5000;
|
||||
firstStageTime = EEPROM.read(75)*60000;
|
||||
@ -745,7 +729,7 @@ void alarm(){
|
||||
strobeOn(false);
|
||||
strobeSyncTimer = 0;
|
||||
}
|
||||
if (horn and not useTwoWire){
|
||||
if (horn){
|
||||
if (not preAlarm or secondStage){ //yes, preAlarm == false is redundant but in the case that second stage == false, but pre-alarm is off, the full alarm will still sound
|
||||
if (codeWheel == 0){
|
||||
|
||||
@ -847,42 +831,6 @@ void alarm(){
|
||||
codeWheelTimer = -1;
|
||||
}
|
||||
|
||||
codeWheelTimer++;
|
||||
firstStageTimer++;
|
||||
if (firstStageTimer>=firstStageTime){
|
||||
codeWheelTimer = 0;
|
||||
secondStage = true;
|
||||
currentScreen = -1;
|
||||
}
|
||||
}
|
||||
} else if (useTwoWire){ //-------------------------------- DO MORE TESTING WITH THIS!!!!
|
||||
if (horn and (not preAlarm or secondStage)){
|
||||
if (twoWireTimer >= 1000){
|
||||
twoWireTimer = 0;
|
||||
} else if (twoWireTimer >= 975){
|
||||
hornOn(false);
|
||||
} else if (twoWireTimer <= 10){
|
||||
hornOn(true);
|
||||
}
|
||||
twoWireTimer++;
|
||||
} else if (not horn and silenced and audibleSilence){
|
||||
if (twoWireTimer >= 1000){
|
||||
twoWireTimer = 0;
|
||||
} else if (twoWireTimer >= 965){
|
||||
hornOn(false);
|
||||
} else if (twoWireTimer <= 10){
|
||||
hornOn(true);
|
||||
}
|
||||
twoWireTimer++;
|
||||
} else if (horn and preAlarm and not secondStage){
|
||||
if (codeWheelTimer == 0){
|
||||
hornOn(true);
|
||||
} else if (codeWheelTimer == 75){
|
||||
hornOn(false);
|
||||
} else if (codeWheelTimer >= 5075){
|
||||
codeWheelTimer = -1;
|
||||
}
|
||||
|
||||
codeWheelTimer++;
|
||||
firstStageTimer++;
|
||||
if (firstStageTimer>=firstStageTime){
|
||||
@ -894,7 +842,6 @@ void alarm(){
|
||||
} else {
|
||||
hornOn(false);
|
||||
codeWheelTimer = 0;
|
||||
twoWireTimer = 0;
|
||||
}
|
||||
if (fullAlarm){
|
||||
alarmLedTimer++;
|
||||
@ -1036,15 +983,15 @@ 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.:","No-Key Sil.:","Strobe Sync","2 Wire:"}; //menu 3
|
||||
char *mainSettingsFireAlarmSettings[] = {"Coding","Verification","Pre-Alarm","Audible Sil.:","No-Key Sil.:","Strobe Sync"}; //menu 3
|
||||
char *mainSettingsVerificationSettings[] = {"Verification:","V.Time:","Det.Verif.:","Det.Timeout:","Det.Watch:"}; //menu 4
|
||||
char *mainSettingsFireAlarmSettingsCoding[] = {"Temporal Three","Marchtime","4-4","Continuous","California","Slow Marchtime"}; //menu 5
|
||||
char *mainSettingsFireAlarmSettingsPreAlarmSettings[] = {"Pre-Alarm:","Stage1 Time:"}; //menu 6
|
||||
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 *mainSettingsFireAlarmSettingsStrobeSync[] = {"None","System Sensor","Wheelock", "Gentex","Simplex"}; //menu 11
|
||||
char *mainPanelSettingsAbout[] = {"Antigneous FACP","Nightly ","Made by Lexzach","Hrs On: "}; //menu 12
|
||||
char *mainSettingsFireAlarmSettingsStrobeSync[] = {"None","System Sensor","Wheelock"}; //menu 11
|
||||
char *mainPanelSettingsAbout[] = {"Antigneous FACP","Stable ","Made by Lexzach","Hrs On: "}; //menu 12
|
||||
|
||||
if (digitalRead(resetButtonPin)){ //RESET BUTTON
|
||||
resetPressed = true;
|
||||
@ -1147,11 +1094,7 @@ void config(){
|
||||
} else if (drillPressed and not drillStillPressed){
|
||||
if (cursorPosition == 0){
|
||||
configPage = 3; //change screen to facp settings
|
||||
if (useTwoWire){
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettings[0] + " off", (String)mainSettingsFireAlarmSettings[1]);
|
||||
} else {
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettings[0], (String)mainSettingsFireAlarmSettings[1]);
|
||||
}
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettings[0], (String)mainSettingsFireAlarmSettings[1]);
|
||||
} else if (cursorPosition == 1){
|
||||
configPage = 8; //change screen to facp settings
|
||||
configLCDUpdate(0, (String)mainPanelSettings[0], (String)mainPanelSettings[1]);
|
||||
@ -1179,25 +1122,15 @@ void config(){
|
||||
configLCDUpdate(4, (String)mainSettingsFireAlarmSettings[4]+"off", (String)mainSettingsFireAlarmSettings[5], false, false);
|
||||
}
|
||||
} else if (cursorPosition == 4) {
|
||||
configLCDUpdate(5, (String)mainSettingsFireAlarmSettings[5], (String)mainSettingsFireAlarmSettings[6]+useTwoWire, false, true);
|
||||
configLCDUpdate(5, (String)mainSettingsFireAlarmSettings[5], (String)mainSettingsFireAlarmSettings[0], false, false);
|
||||
} else if (cursorPosition == 5){
|
||||
if (useTwoWire){
|
||||
configLCDUpdate(6, (String)mainSettingsFireAlarmSettings[6]+useTwoWire, (String)mainSettingsFireAlarmSettings[0]+"off", true, false);
|
||||
} else {
|
||||
configLCDUpdate(6, (String)mainSettingsFireAlarmSettings[6]+useTwoWire, (String)mainSettingsFireAlarmSettings[0], true, false);
|
||||
}
|
||||
} else if (cursorPosition == 6){
|
||||
if (useTwoWire){
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettings[0] + " off", (String)mainSettingsFireAlarmSettings[1]);
|
||||
} else {
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettings[0], (String)mainSettingsFireAlarmSettings[1]);
|
||||
}
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettings[0], (String)mainSettingsFireAlarmSettings[1]);
|
||||
}
|
||||
} else if (silencePressed and not silenceStillPressed){
|
||||
configPage = 2;
|
||||
configLCDUpdate(0, (String)mainSettings[0], (String)mainSettings[1]);
|
||||
} else if (drillPressed and not drillStillPressed){
|
||||
if (cursorPosition == 0 and not useTwoWire){
|
||||
if (cursorPosition == 0){
|
||||
configPage = 5;
|
||||
if (codeWheel == 0){
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettingsCoding[0] + "*", (String)mainSettingsFireAlarmSettingsCoding[1]);
|
||||
@ -1253,20 +1186,6 @@ void config(){
|
||||
} else {
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettingsStrobeSync[0], (String)mainSettingsFireAlarmSettingsStrobeSync[1]);
|
||||
}
|
||||
} else if (cursorPosition == 6){
|
||||
if (useTwoWire){
|
||||
useTwoWire = false;
|
||||
EEPROM.write(30,0);
|
||||
} else {
|
||||
useTwoWire = true;
|
||||
EEPROM.write(30,1);
|
||||
}
|
||||
EEPROM.commit();
|
||||
if (useTwoWire){
|
||||
configLCDUpdate(cursorPosition, (String)mainSettingsFireAlarmSettings[6]+useTwoWire, (String)mainSettingsFireAlarmSettings[0] + " off", true, false);
|
||||
} else {
|
||||
configLCDUpdate(cursorPosition, (String)mainSettingsFireAlarmSettings[6]+useTwoWire, (String)mainSettingsFireAlarmSettings[0], true, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------------------- SETTINGS > FIRE ALARM
|
||||
@ -1481,11 +1400,7 @@ void config(){
|
||||
}
|
||||
} else if (silencePressed and not silenceStillPressed){
|
||||
configPage = 3; //change screen to facp settings
|
||||
if (useTwoWire){
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettings[0] + " off", (String)mainSettingsFireAlarmSettings[1]);
|
||||
} else {
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettings[0], (String)mainSettingsFireAlarmSettings[1]);
|
||||
}
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettings[0], (String)mainSettingsFireAlarmSettings[1]);
|
||||
} else if (drillPressed and not drillStillPressed){
|
||||
EEPROM.write(7,cursorPosition); //write the new codewheel settings to eeprom
|
||||
EEPROM.commit();
|
||||
@ -1838,29 +1753,13 @@ void config(){
|
||||
}
|
||||
} else if (cursorPosition == 1) {
|
||||
if (strobeSync == 2){
|
||||
configLCDUpdate(2, (String)mainSettingsFireAlarmSettingsStrobeSync[2]+"*", (String)mainSettingsFireAlarmSettingsStrobeSync[3]);
|
||||
} else if (strobeSync == 3){
|
||||
configLCDUpdate(2, (String)mainSettingsFireAlarmSettingsStrobeSync[2], (String)mainSettingsFireAlarmSettingsStrobeSync[3]+"*");
|
||||
configLCDUpdate(2, (String)mainSettingsFireAlarmSettingsStrobeSync[2]+"*", (String)mainSettingsFireAlarmSettingsStrobeSync[0]);
|
||||
} else if (strobeSync == 0){
|
||||
configLCDUpdate(2, (String)mainSettingsFireAlarmSettingsStrobeSync[2], (String)mainSettingsFireAlarmSettingsStrobeSync[0]+"*");
|
||||
} else{
|
||||
configLCDUpdate(2, (String)mainSettingsFireAlarmSettingsStrobeSync[2], (String)mainSettingsFireAlarmSettingsStrobeSync[3]);
|
||||
configLCDUpdate(2, (String)mainSettingsFireAlarmSettingsStrobeSync[2], (String)mainSettingsFireAlarmSettingsStrobeSync[0]);
|
||||
}
|
||||
} else if (cursorPosition == 2) {
|
||||
if (strobeSync == 3){
|
||||
configLCDUpdate(3, (String)mainSettingsFireAlarmSettingsStrobeSync[3]+"*", (String)mainSettingsFireAlarmSettingsStrobeSync[4]);
|
||||
} else if (strobeSync == 4){
|
||||
configLCDUpdate(3, (String)mainSettingsFireAlarmSettingsStrobeSync[3], (String)mainSettingsFireAlarmSettingsStrobeSync[4]+"*");
|
||||
} else{
|
||||
configLCDUpdate(3, (String)mainSettingsFireAlarmSettingsStrobeSync[3], (String)mainSettingsFireAlarmSettingsStrobeSync[4]);
|
||||
}
|
||||
} else if (cursorPosition == 3) {
|
||||
if (strobeSync == 4){
|
||||
configLCDUpdate(4, (String)mainSettingsFireAlarmSettingsStrobeSync[4]+"*", (String)mainSettingsFireAlarmSettingsStrobeSync[0]);
|
||||
} else if (strobeSync == 5){
|
||||
configLCDUpdate(4, (String)mainSettingsFireAlarmSettingsStrobeSync[4], (String)mainSettingsFireAlarmSettingsStrobeSync[0]+"*");
|
||||
} else{
|
||||
configLCDUpdate(4, (String)mainSettingsFireAlarmSettingsStrobeSync[4], (String)mainSettingsFireAlarmSettingsStrobeSync[0]);
|
||||
}
|
||||
} else if (cursorPosition == 4) {
|
||||
if (strobeSync == 0){
|
||||
configLCDUpdate(0, (String)mainSettingsFireAlarmSettingsStrobeSync[0]+"*", (String)mainSettingsFireAlarmSettingsStrobeSync[1]);
|
||||
} else if (strobeSync == 1){
|
||||
@ -1871,11 +1770,11 @@ void config(){
|
||||
}
|
||||
} else if (silencePressed and not silenceStillPressed){
|
||||
configPage = 3; //change screen to facp settings
|
||||
configLCDUpdate(5, (String)mainSettingsFireAlarmSettings[5], (String)mainSettingsFireAlarmSettings[6]+useTwoWire, false, true);
|
||||
configLCDUpdate(5, (String)mainSettingsFireAlarmSettings[5], (String)mainSettingsFireAlarmSettings[0], false, false);
|
||||
} else if (drillPressed and not drillStillPressed){
|
||||
EEPROM.write(29,cursorPosition); //write strobe sync settings
|
||||
EEPROM.commit();
|
||||
if (cursorPosition == 4){
|
||||
if (cursorPosition == 2){
|
||||
configLCDUpdate(cursorPosition, (String)mainSettingsFireAlarmSettingsStrobeSync[cursorPosition]+"*", (String)mainSettingsFireAlarmSettingsStrobeSync[0]);
|
||||
} else {
|
||||
configLCDUpdate(cursorPosition, (String)mainSettingsFireAlarmSettingsStrobeSync[cursorPosition]+"*", (String)mainSettingsFireAlarmSettingsStrobeSync[cursorPosition+1]);
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 582 KiB |
BIN
misc/ascii.jpg
BIN
misc/ascii.jpg
Binary file not shown.
Before Width: | Height: | Size: 533 KiB |
BIN
misc/eol.png
BIN
misc/eol.png
Binary file not shown.
Before Width: | Height: | Size: 21 KiB |
Loading…
x
Reference in New Issue
Block a user