#include <OneWire.h>
#include <Ultrasonic.h>
#include <DallasTemperature.h>
#include <ESP32Servo.h>
#define TRIG_PIN 2
#define ECHO_PIN 42
#define COMPORTA_PIN 14
#define TUBO_PIN 15
#define TEMP_SENSOR_PIN 1
#define RELAY_PIN 17
#define BTN 16
Servo servoComporta;
Servo servoTubo;
OneWire oneWire(TEMP_SENSOR_PIN);
DallasTemperature sensors(&oneWire);
float distanciaSilo;
float volumeRacao;
float pesoRacao;
float temperaturaAgua;
bool alimentarpeixe = false;
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);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BTN, INPUT);
servoComporta.attach(COMPORTA_PIN);
servoTubo.attach(TUBO_PIN);
// Iniciar o sensor de temperatura
sensors.begin();
}
void loop() {{
// Leitura do sensor ultrassônico
distanciaSilo = lerDistanciaUltrassom();
// Calcular volume e peso da ração
calcularPesoRacao();
delay(1000); // Verificar a cada segundo
}
if (BTN == HIGH && alimentarpeixe == false) {
alimentarPeixes();
alimentarpeixe = true;
Serial.println ("Alimentando peixes!");
}
{
// 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");
delay(60000); // Escrever na tela a cada minuto
}
}
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() {
servoComporta.write(180);
delay(3000);
servoComporta.write(0);
digitalWrite(RELAY_PIN, HIGH);
moverServoGradualmente(servoTubo, 0, 120, 2000);
delay(500);
moverServoGradualmente(servoTubo, 120, 0, 2000);
delay(500);
moverServoGradualmente(servoTubo, 0, 120, 2000);
delay(500);
moverServoGradualmente(servoTubo, 120, 0, 2000);
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);
}
}
}