#include <DHT.h>
#include <WiFi.h>
#include <Servo.h>
#define DHTPIN 4
#define DHTTYPE DHT22
#define TRIG_PIN 5
#define ECHO_PIN 18
#define SERVO_PIN 16
const char* ssid = "Wokwi-GUEST";
const char* password = "";
DHT dht(DHTPIN, DHTTYPE);
Servo servo;
unsigned long previousMillis = 0;
const long interval = 60000; // Feed every 1 minute (adjust as needed)
// Food level function
float getFoodLevel() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2; // cm
return distance;
}
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin(ssid, password);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
servo.attach(SERVO_PIN);
servo.write(0); // Close chute initially
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
// Monitor environment
float temp = dht.readTemperature();
float hum = dht.readHumidity();
Serial.print("Temp: "); Serial.print(temp); Serial.print(" °C, ");
Serial.print("Humidity: "); Serial.print(hum); Serial.println(" %");
// Check food level
float foodLevel = getFoodLevel();
Serial.print("Food Level (cm): "); Serial.println(foodLevel);
if (foodLevel > 20) { // Low food warning if distance is > 20 cm
Serial.println("Warning: Low food level!");
}
// Automatic feeding logic
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
dispenseFood();
}
delay(2000);
}
// Function to dispense food
void dispenseFood() {
Serial.println("Dispensing food...");
servo.write(90); // Open chute
delay(3000); // Wait for food to drop
servo.write(0); // Close chute
}