Autofeeding(wifi control, stepper motor)
Opened this issue · 0 comments
P-inc commented
#include <Stepper.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <ESPAsyncWebServer.h>
#include <Arduino.h>
const char* ssid = "xx; // Enter WiFi network name here
const char* password = "xx"; // Enter WiFi password here
const int stepsPerRevolution = 2037; // Number of steps in one revolution of the stepper motor
Stepper stepper(stepsPerRevolution, 19, 18, 5, 17); // Create step motor object
AsyncWebServerserver(80);
// NTP settings
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "asia.pool.ntp.org", 32400, 60000);
const unsigned long feedingInterval = 60000;
unsigned long lastFeedingTime = 0;
struct FeedingSchedule {
int hour;
int minute;
};
FeedingSchedule feedingSchedule[] = {
{8, 0}, // Example: 8 o'clock in the morning
{12, 30}, // Example: Lunch 12:30
{18, 0} // Example: 6pm
};
const int numberOfSchedules = sizeof(feedingSchedule) / sizeof(feedingSchedule[0]);
// Set pay cycle and time
unsigned long feedingPeriod = 60000; // Default value: 1 minute
int userSetHour = 12;
int userSetMinute = 0;
bool isFeeding = false; // Whether or not you are being paid
void startFeeding() {
isFeeding = true;
for (int i = 0; i < stepsPerRevolution; i++) {
stepper.step(1); // Move one step at a time (clockwise)
delay(5); // Delay between each step
}
stopFeeding(); //Stop the stepper motor when pay is finished
}
void stopFeeding() {
isFeeding = false;
// Stop the step motor or perform the desired action.
}
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected.");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
timeClient.begin();
timeClient.setTimeOffset(32400);
timeClient.update();
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
String html = "<html><head><title>Auto Feeder</title></head><body>";
html += "<h1>Auto Feeder</h1>";
html += "<p>Current time: " + timeClient.getFormattedTime() + "</p>";
html += "<p>Feeding every " + String(feedingPeriod / 1000) + " seconds</p>";
html += "<form action='/set-period' method='POST'>";
html += "<label for='period'>Feeding Period (seconds):</label>";
html += "<input type='number' id='period' name='period' min='1' value='" + String(feedingPeriod / 1000) + "'>";
html += "<input type='submit' value='Set Feeding Period'>";
html += "</form>";
html += "<form action='/set-time' method='POST'>";
html += "<label for='hour'>Hour:</label>";
html += "<input type='number' id='hour' name='hour' min='0' max='23' value='" + String(userSetHour) + "'>";
html += "<label for='minute'>Minute:</label>";
html += "<input type='number' id='minute' name='minute' min='0' max='59' value='" + String(userSetMinute) + "'>";
html += "<input type='submit' value='Set Feeding Time'>";
html += "</form>";
html += "<form action='/start-feeding' method='POST'>";
html += "<input type='submit' value='Start Feeding'>";
html += "</form>";
html += "<form action='/stop-feeding' method='POST'>";
html += "<input type='submit' value='Stop Feeding'>";
html += "</form>";
html += "</body></html>";
request->send(200, "text/html", html);
});
//Handler to handle payroll cycle settings
server.on("/set-period", HTTP_POST, [](AsyncWebServerRequest *request) {
if (request->hasParam("period", true)) {
feedingPeriod = request->getParam("period", true)->value().toInt() * 1000; // Convert seconds to milliseconds
}
request->redirect("/");
});
//Handler to handle setting payroll hours
server.on("/set-time", HTTP_POST, [](AsyncWebServerRequest *request) {
if (request->hasParam("hour", true) && request->hasParam("minute", true)) {
userSetHour = request->getParam("hour", true)->value().toInt();
userSetMinute = request->getParam("minute", true)->value().toInt();
}
request->redirect("/");
} );
// The rest of the web interface code remains the same.
server.begin();
}
void loop() {
unsigned long currentTime = millis();
if (isFeedingTime() && currentTime - lastFeedingTime >= feedingPeriod) {
if (!isFeeding) {
startFeeding();
}
lastFeedingTime = currentTime;
}
//Continue running the step motor to update the position
stepper.step(0); // Add this part to set the motor to stop
// NTP time update
timeClient.update();
}
bool isFeedingTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
return false;
}
return timeinfo.tm_hour == userSetHour && timeinfo.tm_min == userSetMinute;
}
Like the picture above, it uploads but does not work.