// https://wokwi.com/projects/419523916199154689
const byte switchPin = 2;
const byte redLedPin = 3;
const byte buzzerPin = 4;
const byte greenLedPin = 5;
const byte powerPin = 6;
const byte photoresistorPin = A0;
const int photoresistorThreshold = 777;
enum : byte {NORMAL, ACTIVATED, MUTED} state = NORMAL;
bool powerIsOff()
{
bool power = analogRead(photoresistorPin) < photoresistorThreshold;
digitalWrite(powerPin, !power);
return power;
}
bool powerIsOn()
{
bool power = powerIsOff();
digitalWrite(powerPin, !power);
return !power;
}
bool buttonIsPressed() {
return digitalRead(switchPin) == LOW;
}
void alarmOn() {
digitalWrite(greenLedPin, LOW);
digitalWrite(redLedPin, HIGH);
tone(buzzerPin, 777); // 4000 = upset cat!
state = ACTIVATED;
}
void alarmOff() {
digitalWrite(greenLedPin, HIGH);
digitalWrite(redLedPin, LOW);
noTone(buzzerPin);
state = NORMAL;
}
void buzzerOff() {
noTone(buzzerPin);
state = MUTED;
}
void setup() {
pinMode(greenLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(switchPin, INPUT_PULLUP);
alarmOff();
powerIsOff(); // just to set the power LED correctly at startup
}
void loop() {
switch (state) {
case NORMAL:
if (powerIsOff()) alarmOn() ;
break;
case ACTIVATED:
if (powerIsOn()) alarmOff();
else if (buttonIsPressed()) buzzerOff() ;
break;
case MUTED:
if (powerIsOn()) alarmOff();
break;
}
}