#include <ESP32Servo.h> // Servo Motor
#include <Wire.h> // Comunicação I2C
#include <RTClib.h> // RTC
#include <HX711.h> // Load Cell Library
#include <WiFi.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiServer server(80);
#define zero_val 703138
#define real_weight 230
#define real_raw 771902
Servo myServo;
RTC_DS3231 rtc;
HX711 scale;
const int servoPin = 18; // Pino do Servo Motor
const int rtcAddress = 0x68; // Endereço I2C do RTC DS1307
const int ld_cell = 2; // Pino de dados da célula de carga
const int ld_sck = 4; // Pino de clock da célula de carga
int targetWeight; // Peso alvo em gramas
int feedHour1;
int feedMinute1;
int feedHour2;
int feedMinute2;
float grams_weight; // Variável para armazenar o peso em gramas
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // Inicializa a comunicação I2C (SDA, SCL)
scale.begin(ld_cell, ld_sck); // Inicializa a célula de carga
myServo.attach(servoPin); // Anexa o servo ao pino
myServo.write(90); // Define a posição inicial do servo
Serial.println();
Serial.print("Conectando-se a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectada.");
Serial.print("Endereço de IP: ");
Serial.println(WiFi.localIP());
server.begin(); // Inicia o servidor web
if (!rtc.begin()) {
Serial.println("Não foi possível encontrar o RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("O RTC perdeu a energia, configurando a hora!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
float ConvertVal(long raw_val) {
float unit = (float)real_weight / (float)(zero_val - real_raw); //
return (float)(zero_val - raw_val) * unit;
}
void extrairDadosDaURL(const String& url) {
int index1 = url.indexOf('/') + 1;
int index2 = url.indexOf('/', index1);
int index3 = url.indexOf('/', index2 + 1);
int index4 = url.indexOf('/', index3 + 1);
int index5 = url.indexOf('/', index4 + 1);
feedHour1 = url.substring(index1, index2).toInt();
feedMinute1 = url.substring(index2 + 1, index3).toInt();
targetWeight = url.substring(index3 + 1, index4).toInt();
feedHour2 = url.substring(index4 + 1, index5).toInt();
feedMinute2 = url.substring(index5 + 1).toInt();
}
void loop() {
WiFiClient client = server.available();
if (client) {
Serial.println("Novo Cliente.");
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n') {
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
break;
} else {
extrairDadosDaURL(currentLine);
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
}
}
client.stop();
Serial.println("Cliente Desconectado.");
}
DateTime now = rtc.now();
Serial.print("Hora atual: ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.println(now.second(), DEC);
printWifiStatus();
if ((now.hour() == feedHour1 && now.minute() == feedMinute1 && now.second() == 0) ||
(now.hour() == feedHour2 && now.minute() == feedMinute2 && now.second() == 0)) {
Serial.println("É hora de alimentar!");
myServo.write(90); // Abre a porta (ângulo 180 graus)
bool doorClosed = false;
while (true) {
if (scale.is_ready()) {
scale.set_scale();
long raw_weight = scale.get_units(10);
grams_weight = ConvertVal(raw_weight);
Serial.print("Peso: ");
Serial.println(grams_weight);
delay(1);
const float tolerance = 5.0;
if (abs(grams_weight - targetWeight) <= tolerance) {
myServo.write(0); // Fecha a porta ao atingir o peso alvo
doorClosed = true;
break;
}
}
delay(100);
}
while (doorClosed && grams_weight < targetWeight) {
myServo.write(90); // Reabre a porta se o peso cair abaixo do alvo
doorClosed = false;
delay(1000);
}
}
delay(100);
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
// print where to go in a browser:
Serial.print("To see this page in action, open a browser to http://");
Serial.println(ip);
}