#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_MPU6050.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_MPU6050 mpu;
const int potPin = 36;
const int greenLED = 26;
const int redLED = 27;
const int buzzer = 25;
const int buttonPin = 33;
bool alertActive = false;
void setup() {
Serial.begin(115200);
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 failed");
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
if (!mpu.begin()) {
Serial.println("MPU6050 failed");
for (;;);
}
display.println("System Ready");
display.display();
delay(1000);
}
void loop() {
int potValue = analogRead(potPin); // simulating occupancy
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
if (digitalRead(buttonPin) == LOW) {
alertActive = false;
}
if (potValue > 2000) { // Occupied
digitalWrite(greenLED, HIGH);
display.clearDisplay();
display.setCursor(0, 0);
display.println("Occupied");
display.display();
} else {
digitalWrite(greenLED, LOW);
display.clearDisplay();
display.setCursor(0, 0);
display.println("Empty");
display.display();
}
if (abs(a.acceleration.x) > 15 || abs(a.acceleration.y) > 15) {
alertActive = true;
}
if (alertActive) {
digitalWrite(redLED, HIGH);
tone(buzzer, 1000);
display.setCursor(0, 16);
display.println("ALERT: Movement!");
display.display();
} else {
digitalWrite(redLED, LOW);
noTone(buzzer);
}
delay(500);
}