#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo feederServo;
const int trigPin = 17;
const int echoPin = 18;
const int servoPin = 16;
const int feedDistance = 15;
const int openDegree = 35;
const int closeDegree = 0;
const int dropTime = 1500;
int feedCount = 0;
bool lock = false;
int getDistance() {
digitalWrite(trigPin, 0);
delayMicroseconds(2);
digitalWrite(trigPin, 1);
delayMicroseconds(10);
digitalWrite(trigPin, 0);
long duration = pulseIn(echoPin, 1, 30000);
int distance = duration * 0.0343 / 2;
if (distance == 0) return 999;
return distance;
}
void showDefault() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Da an: ");
lcd.print(feedCount);
}
void showFeeding() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Cho pet an");
}
void openServo() {
feederServo.write(openDegree);
}
void closeServo() {
feederServo.write(closeDegree);
}
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
showDefault();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
feederServo.attach(servoPin);
closeServo();
}
void loop() {
int distance = getDistance();
if (distance > 0 && distance < feedDistance) {
if (lock == false) {
feedCount++;
showFeeding();
openServo();
delay(dropTime);
closeServo();
lock = true;
}
}
else if (distance >= 20) {
if (lock == true) {
lock = false;
showDefault();
}
}
delay(100);
}