#define RGB_R 5
#define RGB_G 15
#define RGB_B 2
#define KEY_PIN 23
#define LIGHT_PIN 4
#define PIR_PIN 27
#define BEEP_PIN 25
bool defensing = false;
bool alarming = false;
void IRAM_ATTR onKeyPress() {
alarming = false;
defensing = false;
allLedOff();
noTone(BEEP_PIN);
}
void IRAM_ATTR onPirTrigger() {
if (defensing) alarming = true;
}
void allLedOff() {
digitalWrite(RGB_R, LOW);
digitalWrite(RGB_G, LOW);
digitalWrite(RGB_B, LOW);
}
void greenBreath() {
static int b = 0, d = 2;
analogWrite(RGB_G, b);
b += d;
if (b <= 0 || b >= 255) d = -d;
delay(10);
}
void setup() {
Serial.begin(115200);
pinMode(RGB_R, OUTPUT);
pinMode(RGB_G, OUTPUT);
pinMode(RGB_B, OUTPUT);
pinMode(BEEP_PIN, OUTPUT);
allLedOff();
pinMode(KEY_PIN, INPUT_PULLDOWN);
attachInterrupt(digitalPinToInterrupt(KEY_PIN), onKeyPress, RISING);
pinMode(PIR_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIR_PIN), onPirTrigger, FALLING);
}
void loop() {
int lightVal = analogRead(LIGHT_PIN);
if (lightVal > 2000 && !alarming) {
defensing = true;
greenBreath();
} else {
defensing = false;
allLedOff();
}
if (alarming) {
digitalWrite(RGB_R, HIGH);
digitalWrite(RGB_B, LOW);
tone(BEEP_PIN, 1000);
delay(200);
digitalWrite(RGB_R, LOW);
digitalWrite(RGB_B, HIGH);
noTone(BEEP_PIN);
delay(200);
}
}