#include <ESP32Servo.h>
#include <Ultrasonic.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <RTClib.h>
#include <Wire.h>
// Definições dos pinos
#define TRIG_PIN 12
#define ECHO_PIN 13
#define COMPORTA_PIN 14
#define TUBO_PIN 15
#define TEMP_SENSOR_PIN 16
#define RELAY_PIN 17
#define SDA_PIN 1
#define SCL_PIN 2
Servo servoComporta;
Servo servoTubo;
RTC_DS1307 rtc;
// Horários de alimentação (formato: horas e minutos)
int hmAlimentacao[3][2];
//const int horaAlimentacao1 = 12;
//const int minutoAlimentacao1 = 01;
//const int horaAlimentacao2 = 12;
//const int minutoAlimentacao2 = 03;
//const int horaAlimentacao3 = 18;
//const int minutoAlimentacao3 = 0;
// Variáveis para armazenar leituras dos sensores
float distanciaSilo;
float volumeRacao;
float pesoRacao;
float temperaturaAgua;
bool alimentarpeixe = false;
// Configuração do sensor de temperatura
OneWire oneWire(TEMP_SENSOR_PIN);
DallasTemperature sensors(&oneWire);
// Parâmetros do silo e ração
const float raioSilo = 10.0; // Raio do silo em cm
const float alturaSilo = 50.0; // Altura máxima do silo em cm
const float densidadeRacao = 0.7; // Densidade da ração em g/cm³
void setup() {
Serial.begin(115200);
Wire.begin(1, 2); // Pinos SDA e SCL
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
// hora/minuto alimentacao 1
hmAlimentacao[0][0] = 11;
hmAlimentacao[0][1] = 24;
// hora/minuto alimentacao 2
hmAlimentacao[1][0] = 11;
hmAlimentacao[1][1] = 26;
// hora/minuto alimentacao 3
hmAlimentacao[2][0] = 18;
hmAlimentacao[2][1] = 0;
servoComporta.attach(COMPORTA_PIN);
servoTubo.attach(TUBO_PIN);
// Iniciar o sensor de temperatura
sensors.begin();
// Iniciar o RTC
if (!rtc.begin()) {
Serial.println("RTC não encontrado!");
while (1);
}
// Verificar se o RTC está funcionando
if (!rtc.isrunning()) {
Serial.println("RTC não está rodando, inicializando com data e hora padrão!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Define a data e hora para o tempo da compilação
}
}
void loop() {
// Leitura do sensor ultrassônico
distanciaSilo = lerDistanciaUltrassom();
// Calcular volume e peso da ração
calcularPesoRacao();
// Imprimir peso da ração
Serial.print("Peso estimado da ração no silo: ");
Serial.print(pesoRacao);
Serial.println(" g");
// Leitura da temperatura da água
lerTemperaturaAgua();
Serial.print("Temperatura da água: ");
Serial.print(temperaturaAgua);
Serial.println(" °C");
DateTime agora = rtc.now();
// Mostrar hora atual no Serial Monitor
Serial.print(agora.hour(), DEC);
Serial.print(':');
Serial.println(agora.minute(), DEC);
// Verificar se é hora de alimentar os peixes
for (int i=0;i < 3;i++){
if ((agora.hour() == hmAlimentacao[i][0]) &&
(agora.minute() == hmAlimentacao[i][1]) &&
(alimentarpeixe == false)){
Serial.println("Alimentando peixes...");
alimentarPeixes();
alimentarpeixe = true;
}
}
/*
if (((agora.hour() == horaAlimentacao1 && agora.minute() == minutoAlimentacao1) ||
(agora.hour() == horaAlimentacao2 && agora.minute() == minutoAlimentacao2) ||
(agora.hour() == horaAlimentacao3 && agora.minute() == minutoAlimentacao3)) &&
(alimentarpeixe == false)) {
Serial.println("Alimentando peixes...");
alimentarPeixes();
alimentarpeixe = true; // evitar múltiplas ativações
}
*/
for (int i=0;i < 3;i++){
if ((agora.hour() != hmAlimentacao[i][0]) &&
(agora.minute() != hmAlimentacao[i][1])){
alimentarpeixe = false;
}
}
/*
if ((agora.hour() != horaAlimentacao1 && agora.minute() != minutoAlimentacao1) &&
(agora.hour() != horaAlimentacao2 && agora.minute() != minutoAlimentacao2) &&
(agora.hour() != horaAlimentacao3 && agora.minute() != minutoAlimentacao3)) {
alimentarpeixe = false;
}
*/
delay(1000); // Verificar a cada segundo
}
float lerDistanciaUltrassom() {
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; // Calcula a distância em cm
return distance;
}
void calcularPesoRacao() {
// Altura da ração no silo
float alturaRacao = alturaSilo - distanciaSilo;
// Calcular o volume da ração (cm³)
volumeRacao = 3.14159265359 * raioSilo * raioSilo * alturaRacao;
// Calcular o peso da ração (g)
pesoRacao = volumeRacao * densidadeRacao;
}
void lerTemperaturaAgua() {
sensors.requestTemperatures(); // Solicitar leitura do sensor
temperaturaAgua = sensors.getTempCByIndex(0); // Obter temperatura em Celsius
}
void alimentarPeixes() {
// Abrir a comporta
servoComporta.write(180); // Ajustar o valor conforme necessário para abrir
delay(3000); // Manter a comporta aberta por 3 segundos (ajustar conforme necessário)
servoComporta.write(0); // Fechar a comporta (ajustar o valor conforme necessário)
// Movimentar o tubo de dispersão
// Movimentar o tubo de dispersão gradualmente
digitalWrite(RELAY_PIN, HIGH);
moverServoGradualmente(servoTubo, 0, 120, 2000); // Girar o tubo de 0 a 120 graus em 2 segundos
delay(500); // Aguardar 0,5 segundo
moverServoGradualmente(servoTubo, 120, 0, 2000); // Retornar o tubo à posição inicial em 2 segundos
delay(500); // Aguardar 0,5 segundo
moverServoGradualmente(servoTubo, 0, 120, 2000); // Girar o tubo de 0 a 120 graus em 2 segundos
delay(500); // Aguardar 0,5 segundo
moverServoGradualmente(servoTubo, 120, 0, 2000); // Retornar o tubo à posição inicial em 2 segundos
digitalWrite(RELAY_PIN, LOW);
}
void moverServoGradualmente(Servo &servo, int posInicial, int posFinal, int duracao) {
int passos = abs(posFinal - posInicial); // Número de passos a realizar
int tempoPorPasso = duracao / passos; // Tempo por passo em ms
if (posFinal > posInicial) {
for (int pos = posInicial; pos <= posFinal; pos++) {
servo.write(pos);
delay(tempoPorPasso);
}
} else {
for (int pos = posInicial; pos >= posFinal; pos--) {
servo.write(pos);
delay(tempoPorPasso);
}
}
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1