#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define irSensorPetPin 2 // Pin for detecting pet presence
#define irSensorFoodPin 3 // Pin for detecting food level
#define redLedPin 11
#define greenLedPin 12
#define servoPin 9
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD address to 0x27 for a 16 chars and 2 line display
Servo myServo;
unsigned long previousDispenseTime = 0;
const unsigned long dispenseInterval = 86400000; // Dispense food every 24 hours (in milliseconds)
bool foodDispensed = false;
void setup() {
pinMode(irSensorPetPin, INPUT);
pinMode(irSensorFoodPin, INPUT);
pinMode(redLedPin, OUTPUT);
pinMode(greenLedPin, OUTPUT);
// Set the initial state of the food level sensor pin to HIGH
digitalWrite(irSensorFoodPin, HIGH);
lcd.begin(16, 2); // initialize the LCD
lcd.backlight(); // Turn on the backlight
}
void loop() {
// Read pet presence sensor
int petPresence = digitalRead(irSensorPetPin);
// Read food level sensor
int foodLevel = digitalRead(irSensorFoodPin);
// Get current time
unsigned long currentTime = millis();
// Check if it's time to dispense food and the pet is present
if (currentTime - previousDispenseTime >= dispenseInterval && petPresence == HIGH) {
dispenseFood();
previousDispenseTime = currentTime; // Update previousDispenseTime
}
// Update LCD and LED based on pet presence and food level
updateDisplay(petPresence, foodLevel);
delay(1000); // Delay for stability
}
void dispenseFood() {
myServo.attach(servoPin);
myServo.write(90); // Open the feeder
delay(2000); // Wait for food to dispense
myServo.write(0); // Close the feeder
myServo.detach(); // Detach servo after feeding
}
void updateDisplay(int petPresence, int foodLevel) {
if (petPresence == HIGH) {
digitalWrite(redLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pet is present");
foodDispensed = false; // Reset foodDispensed flag if pet is present
} else {
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pet not present");
}
if (foodLevel == LOW) {
digitalWrite(redLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Low food level");
} else {
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Food level OK");
}
}