#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 

#define TRIGGER_PIN 11 
#define ECHO_PIN 12 
#define LED_RED 9 
#define LED_GREEN 8 
#define LED_BLUE 7 

LiquidCrystal_I2C lcd(0x27, 16, 2); // Initialize LCD

void setup() {
  Serial.begin(9600); 
  lcd.init(); 
  lcd.backlight(); 
  pinMode(TRIGGER_PIN, OUTPUT); 
  pinMode(ECHO_PIN, INPUT); 
  pinMode(LED_RED, OUTPUT); 
  pinMode(LED_GREEN, OUTPUT); 
  pinMode(LED_BLUE, OUTPUT); 
}

void loop() {
  digitalWrite(TRIGGER_PIN, LOW); 
  delayMicroseconds(2);
  
  digitalWrite(TRIGGER_PIN, HIGH); 
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  
  unsigned long duration = pulseIn(ECHO_PIN, HIGH); 
  int distance = duration / 29 / 2; 
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
  
  if(distance >= 107 && distance <= 120) { // Door is closed
    digitalWrite(LED_RED, LOW); 
    digitalWrite(LED_GREEN, HIGH); 
    digitalWrite(LED_BLUE, LOW); 
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Door is closed");
  } else if(distance > 120) { // Door is open
    digitalWrite(LED_RED, HIGH); 
    digitalWrite(LED_GREEN, LOW); 
    digitalWrite(LED_BLUE, LOW); 
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Door is open");
    lcd.setCursor(0, 1);
  } else if(distance < 107){ // Door is partially open
    digitalWrite(LED_RED, LOW); 
    digitalWrite(LED_GREEN, LOW); 
    digitalWrite(LED_BLUE, HIGH); 
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Door is ");
    lcd.setCursor(0, 1);
    lcd.print("partially open");
  }
  delay(50); // Wait for 50ms before taking another reading
}