#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include <Servo.h>
LiquidCrystal_I2C lcdInc(0x27, 16, 2);
RTC_DS1307 rtc;
Servo filtrationServo;
const int trigPin = 9;
const int echoPin = 8;
const int heaterLed = 4;
const int buzzerPin = 5;
const int servoPin = 7;
bool isBurning = false;
unsigned long burnStartTime = 0;
bool filtrationRunning = false;
unsigned long filtrationStartTime = 0;
const unsigned long burnDuration = 5000;
const unsigned long filtrationDuration = 7000;
const int detectDist = 30;
// Variables for continuous sweep
unsigned long lastServoMove = 0;
const unsigned long servoInterval = 15; // ms between moves
int servoPos = 0;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(heaterLed, OUTPUT);
pinMode(buzzerPin, OUTPUT);
lcdInc.init();
lcdInc.backlight();
if (!rtc.begin()) {
Serial.println("RTC not found!");
while (1);
}
filtrationServo.attach(servoPin);
filtrationServo.write(0);
lcdInc.setCursor(0, 0);
lcdInc.print("Incinerator Ready");
Serial.println("Incinerator System Ready");
}
long readDistanceCM() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000UL);
if (duration == 0) return 999;
return duration / 58;
}
void sweepServoFull() {
unsigned long currentMillis = millis();
if (currentMillis - lastServoMove >= servoInterval) {
lastServoMove = currentMillis;
servoPos += 5; // increment position
if (servoPos > 180) {
servoPos = 0; // reset to 0 for continuous rotation effect
}
filtrationServo.write(servoPos);
}
}
void loop() {
DateTime now = rtc.now();
int currentHour = now.hour();
int currentMinute = now.minute();
bool afterSchool = (currentHour == 10 && currentMinute >= 32) || (currentHour > 10);
if (!isBurning && !filtrationRunning && afterSchool) {
long dist = readDistanceCM();
if (dist <= detectDist) {
Serial.println("Pad detected. Starting burn...");
lcdInc.clear();
lcdInc.print("Pad Detected");
lcdInc.setCursor(0, 1);
lcdInc.print("Burning...");
digitalWrite(heaterLed, HIGH);
isBurning = true;
burnStartTime = millis();
}
}
if (isBurning && millis() - burnStartTime >= burnDuration) {
digitalWrite(heaterLed, LOW);
isBurning = false;
Serial.println("Burn complete. Starting filtration...");
lcdInc.clear();
lcdInc.print("Burn Complete");
delay(2000);
lcdInc.clear();
lcdInc.print("Filtration...");
filtrationRunning = true;
filtrationStartTime = millis();
}
if (filtrationRunning) {
if (millis() - filtrationStartTime >= filtrationDuration) {
filtrationRunning = false;
filtrationServo.write(0);
Serial.println("Filtration complete. Incinerator ready.");
lcdInc.clear();
lcdInc.print("Filtration Done");
delay(2000);
lcdInc.clear();
lcdInc.print("Incinerator Ready");
} else {
sweepServoFull(); // rotate servo continuously
}
}
}