#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ================= LCD =================
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ================= SENSOR PINS =================
const int soundPin = A0;
const int pirPin = 2;
const int irPin = 3;
// ================= OUTPUT PINS =================
const int greenLED = 8;
const int yellowLED = 9;
const int redLED = 10;
const int buzzer = 11;
// ================= VARIABLES =================
int soundValue = 0;
int averageSound = 0;
bool pirState = false;
bool irState = false;
int disturbanceScore = 0;
unsigned long disturbanceStart = 0;
bool disturbanceActive = false;
String currentMode = "";
// ===================================================
// SETUP
// ===================================================
void setup() {
pinMode(pirPin, INPUT);
pinMode(irPin, INPUT);
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.init();
lcd.backlight();
Serial.begin(9600);
// Startup Screen
lcd.setCursor(0, 0);
lcd.print("EduSense AI");
lcd.setCursor(0, 1);
lcd.print("Initializing");
delay(3000);
lcd.clear();
// PIR Stabilization
lcd.setCursor(0,0);
lcd.print("Sensor Stable");
lcd.setCursor(0,1);
lcd.print("Wait 20 Sec");
delay(20000);
lcd.clear();
}
// ===================================================
// MAIN LOOP
// ===================================================
void loop() {
// ================= SOUND AVERAGING =================
// Multiple readings for stable detection
long totalSound = 0;
for(int i = 0; i < 15; i++) {
totalSound += analogRead(soundPin);
delay(2);
}
averageSound = totalSound / 15;
// ================= SENSOR READ =================
pirState = digitalRead(pirPin);
irState = digitalRead(irPin);
disturbanceScore = 0;
// ===================================================
// SMART SOUND FILTERING
// ===================================================
// Teacher voice ignored as much as possible
// Only high classroom disturbance counts
if(averageSound > 520) {
disturbanceScore += 3;
}
else if(averageSound > 420) {
disturbanceScore += 2;
}
else if(averageSound > 350) {
disturbanceScore += 1;
}
// ===================================================
// MOVEMENT ANALYSIS
// ===================================================
// Small movements ignored
if(pirState == HIGH) {
disturbanceScore += 2;
}
if(irState == LOW) {
disturbanceScore += 1;
}
// ===================================================
// MODE SELECTION
// ===================================================
// ---------------- GREEN ----------------
if(disturbanceScore <= 2) {
disturbanceActive = false;
greenMode();
}
// ---------------- YELLOW ----------------
else if(disturbanceScore <= 4) {
disturbanceActive = false;
yellowMode();
}
// ---------------- POSSIBLE RED ----------------
else {
// Start timing disturbance
if(!disturbanceActive) {
disturbanceActive = true;
disturbanceStart = millis();
}
// Disturbance must continue for 7 seconds
if(millis() - disturbanceStart > 7000) {
redMode();
}
else {
yellowMode();
}
}
// ===================================================
// SERIAL MONITOR
// ===================================================
Serial.print("Sound: ");
Serial.print(averageSound);
Serial.print(" Score: ");
Serial.println(disturbanceScore);
delay(200);
}
// ===================================================
// GREEN MODE
// ===================================================
void greenMode() {
if(currentMode != "GREEN") {
currentMode = "GREEN";
digitalWrite(greenLED, HIGH);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, LOW);
noTone(buzzer);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Class Focused");
lcd.setCursor(0,1);
lcd.print("Status: GOOD");
}
}
// ===================================================
// YELLOW MODE
// ===================================================
void yellowMode() {
if(currentMode != "YELLOW") {
currentMode = "YELLOW";
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, HIGH);
digitalWrite(redLED, LOW);
noTone(buzzer);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("High Activity");
lcd.setCursor(0,1);
lcd.print("Monitoring...");
}
}
// ===================================================
// RED MODE
// ===================================================
void redMode() {
if(currentMode != "RED") {
currentMode = "RED";
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Discipline");
lcd.setCursor(0,1);
lcd.print("ALERT ACTIVE");
}
// Soft siren
tone(buzzer, 1000);
delay(150);
noTone(buzzer);
delay(150);
}