#define snoozePb 2 // Interrupt input for mode button
#define doorPin 3 // Interrupt input for door limit switch
#define alarmSpkr 7 // Output for alarm / buzzer
#define ledGrn 11
#define ledRed 12
#define modePot A0
#define delayPot A1
int alarmState;
int tempModeVal;
int modeVal; // No Alarm = 0 , Immediate Alarm = 1 , Delayed Alarm >1
int delayVal; //min delay = 10s, max delay = 20s
unsigned long tempDelayVal; //
unsigned long lastAlarmTime = 0; // Store millis to compare state after alarmDelay
unsigned long alarmDelay; // 10k-20k ms delay for buzzer to sound
int analogSCP (float x, float in_min, float in_max, float out_min, float out_max) {
return int (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
void door(){
leds();
// no alarm mode
// if((modeVal == 0)&&((digitalRead(doorPin)) == HIGH)){
if(modeVal == 0){
//noTone(alarmSpkr);
digitalWrite(alarmSpkr, LOW);
}
// immediate alarm mode
// if((modeVal == 1)&&((digitalRead(doorPin)) == HIGH)){
if(modeVal == 1){
if(digitalRead(snoozePb)){
//tone(alarmSpkr, 500);
digitalWrite(alarmSpkr, HIGH);
}
else{
//noTone(alarmSpkr);
digitalWrite(alarmSpkr, LOW);
}
}
// delayed alarm mode
// if((modeVal > 1)&&((digitalRead(doorPin)) == HIGH)){
if(modeVal > 1){
alarm();
}
}
void snooze(){
// if alarm not sounding add 10000ms to delay
if((!digitalRead(snoozePb))&&((millis() - lastAlarmTime) > alarmDelay)){
//noTone(alarmSpkr);
digitalWrite(alarmSpkr, LOW);
lastAlarmTime = millis();
alarmDelay = 10000;
}
else if((!digitalRead(snoozePb))&&((millis() - lastAlarmTime) < alarmDelay)){
//noTone(alarmSpkr);
digitalWrite(alarmSpkr, LOW);
tempDelayVal = millis() - lastAlarmTime;
if ((tempDelayVal + 10000) < alarmDelay){
}
}
}
void leds(){ // function for controlling leds
digitalWrite(ledGrn, !digitalRead(doorPin));
digitalWrite(ledRed, digitalRead(doorPin));
}
void alarm(){ // function for controlling alarm and mode led pulses
if ((millis() - lastAlarmTime) > alarmDelay) { // If more than 10s turn on alarm and state LED
//tone(alarmSpkr, 500);
digitalWrite(alarmSpkr, HIGH);
}
}
void timermode() {
// Potentiometer mode select No Alarm = 0, Immediate Alarm = 1, Delay Alarm > 1
modeVal = analogSCP(analogRead(A0),0,1023,0,3);
if(modeVal > 1){
//min delay = 10s, max delay = 20s
delayVal = analogSCP(analogRead(delayPot),0,1023,10,20);
alarmDelay = delayVal*1000;
}
Serial.println("test");
delay(1000);
}
void setup() { // set all inputs and outputs
Serial.begin(9600);
pinMode(snoozePb, INPUT_PULLUP);
pinMode(doorPin, INPUT_PULLUP);
pinMode(alarmSpkr, OUTPUT);
pinMode(ledGrn, OUTPUT);
pinMode(ledRed, OUTPUT);
attachInterrupt(digitalPinToInterrupt(snoozePb), snooze, RISING);
attachInterrupt(digitalPinToInterrupt(doorPin), door, RISING);
interrupts();
}
void loop() {
// print out the value you read:
Serial.print("A0: ");
Serial.print(modeVal);
Serial.print(", A1: ");
Serial.print(delayVal);
Serial.print(", door: ");
Serial.print(digitalRead(doorPin));
Serial.print(", green: ");
Serial.print(digitalRead(ledGrn));
Serial.print(", red: ");
Serial.print(digitalRead(ledRed));
Serial.print(", Alarm: ");
Serial.println(digitalRead(alarmSpkr));
delay(1000);
leds();
// If all doors are shut reset lights, alarm and update times
if ((digitalRead(doorPin)) == LOW){
digitalWrite(alarmSpkr, LOW);
timermode();
lastAlarmTime = millis();
//noTone(alarmSpkr);
alarmState = LOW;
}
}