#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h>
#define TRIGGER_PIN 5
#define ECHO_PIN 18
#define MAX_DISTANCE 30 // in cm
#define BUZZER_PIN 4
#define SWITCH_PIN 19
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 columns, 2 rows
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
unsigned long lastDisconnectTime = 0;
bool switchState = true;
bool wasConnected = true;
float containerHeight = 30.0; // Adjust based on your container size
void setup() {
pinMode(SWITCH_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("System Starting...");
delay(2000);
lcd.clear();
}
void loop() {
switchState = digitalRead(SWITCH_PIN) == LOW;
if (!switchState) {
if (wasConnected) {
lastDisconnectTime = millis();
wasConnected = false;
}
if (millis() - lastDisconnectTime >= 30000) {
while (digitalRead(SWITCH_PIN) == HIGH) {
digitalWrite(BUZZER_PIN, HIGH);
delay(1000);
digitalWrite(BUZZER_PIN, LOW);
delay(1000);
switchState = digitalRead(SWITCH_PIN) == LOW;
if (switchState) {
wasConnected = true;
return;
}
}
}
return;
}
wasConnected = true;
delay(100);
float distance = sonar.ping_cm();
if (distance == 0 || distance > containerHeight) {
Serial.println("Invalid distance");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distance Error");
return;
}
float fillLevel = ((containerHeight - distance) / containerHeight) * 100.0;
// Display fill level on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Fill Level:");
lcd.setCursor(0, 1);
lcd.print(fillLevel, 1);
lcd.print(" %");
// Sound buzzer if over 80%
if (fillLevel >= 80.0) {
digitalWrite(BUZZER_PIN, HIGH);
delay(1000);
digitalWrite(BUZZER_PIN, LOW);
}
delay(2000); // Update rate
}