#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Pin Definitions based on your diagram.json
#define BUTTON_SEAT 13
#define BUTTON_DROWSY 12
#define BUTTON_DOOR 14
#define BUZZER 27
// Initialize LCD: address 0x27 is standard for 16x2 I2C displays in Wokwi
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
// Configure input pins with internal pull-up resistors
pinMode(BUTTON_SEAT, INPUT_PULLUP);
pinMode(BUTTON_DROWSY, INPUT_PULLUP);
pinMode(BUTTON_DOOR, INPUT_PULLUP);
// Configure buzzer pin
pinMode(BUZZER, OUTPUT);
noTone(BUZZER); // Ensure buzzer starts silent
// Initialize LCD
lcd.init();
lcd.backlight();
// Welcome screen
lcd.setCursor(0, 0);
lcd.print(" SYSTEM READY ");
delay(2000);
lcd.clear();
}
void loop() {
// Read button states (LOW = Pressed/Active, HIGH = Released/Normal)
bool isSeatBeltUnfastened = (digitalRead(BUTTON_SEAT) == LOW);
bool isDriverDrowsy = (digitalRead(BUTTON_DROWSY) == LOW);
bool isDoorOpen = (digitalRead(BUTTON_DOOR) == LOW);
bool triggerAlarm = false;
int toneFrequency = 1000; // Default warning frequency (1000 Hz)
lcd.setCursor(0, 0);
// System State Logic Priority
if (isDriverDrowsy) {
lcd.print("! DROWSY ALERT !");
lcd.setCursor(0, 1);
lcd.print(" WAKE UP DRIVER ");
toneFrequency = 1500; // High urgency pitch
triggerAlarm = true;
}
else if (isDoorOpen) {
lcd.print("WARNING: DOOR ");
lcd.setCursor(0, 1);
lcd.print("IS NOT CLOSED! ");
toneFrequency = 800; // Medium urgency pitch
triggerAlarm = true;
}
else if (isSeatBeltUnfastened) {
lcd.print("WARNING: FASTEN ");
lcd.setCursor(0, 1);
lcd.print("YOUR SEATBELT! ");
toneFrequency = 500; // Lower urgency pitch
triggerAlarm = true;
}
else {
// Normal Operating Conditions
lcd.print("STATUS: SAFE ");
lcd.setCursor(0, 1);
lcd.print("DRIVE CAREFULLY ");
triggerAlarm = false;
}
// Handle Buzzer Audio Signal
if (triggerAlarm) {
// Play the tone at the designated frequency
tone(BUZZER, toneFrequency);
delay(150);
noTone(BUZZER);
delay(150);
} else {
noTone(BUZZER);
delay(200); // Small stability delay when state is normal
}
}