#include <Wire.h>
#include <RTClib.h>
#include <AccelStepper.h>
#define MANUAL_FEED_BUTTON_PIN 2 // Pin connected to the manual feed button
#define STEPS_PER_REVOLUTION 200 // Steps per revolution of your stepper motor
RTC_DS3231 rtc;
AccelStepper stepper(AccelStepper::DRIVER, 8, 9); // Step and direction pins connected to digital pins 8 and 9
const int feed1HourDefault = 8; // Default first feeding hour
const int feed1MinuteDefault = 0; // Default first feeding minute
const int feed2HourDefault = 17; // Default second feeding hour
const int feed2MinuteDefault = 30;// Default second feeding minute
int feed1Hour = feed1HourDefault; // First feeding hour
int feed1Minute = feed1MinuteDefault; // First feeding minute
int feed2Hour = feed2HourDefault; // Second feeding hour
int feed2Minute = feed2MinuteDefault; // Second feeding minute
bool feedingEnabled = false; // Flag to enable feeding
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
stepper.setMaxSpeed(500); // Set maximum speed in steps per second
stepper.setAcceleration(50); // Set acceleration in steps per second per second
pinMode(MANUAL_FEED_BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
DateTime now = rtc.now();
// Check if it's time for feeding or manual feed button is pressed
if ((now.hour() == feed1Hour && now.minute() == feed1Minute) ||
(now.hour() == feed2Hour && now.minute() == feed2Minute) ||
(digitalRead(MANUAL_FEED_BUTTON_PIN) == LOW)) {
dispenseFood();
}
char buf2[] = "YYYY/MM/DD-hh:mm:ss";
Serial.println(now.toString(buf2));
delay(1000); // 1-second delay
}
void dispenseFood() {
stepper.move(STEPS_PER_REVOLUTION); // Move one full revolution
while (stepper.distanceToGo() != 0) {
stepper.run();
delay(1);
}
Serial.println("Food dispensed!");
}