#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "lcd.h"
#include "ldr.h"
#include "ds18b20.h"
#include "hc_sr04.h"
#include "motor_stepper.h"
#include "led_ornamental.h"
#include "relay.h"
#include "alarme.h"
// Configurações do I2C
#define I2C_PORT i2c0
#define SDA_PIN 16
#define SCL_PIN 17
// Definir valores de controle
#define TEMPERATURA_MIN 24.0
#define TEMPERATURA_MAX 26.0
#define NIVEL_MIN 10.0
#define NIVEL_MAX 30.0
#define LUZ_MIN 100.0
#define LUZ_MAX 800.0
#define TURBIDEZ_MAX 100.0
#define PH_MIN 6.5
#define PH_MAX 7.5
// Função para exibir o nível de água
void display_water_level() {
// Mede a distância até a superfície da água
float distance = measure_distance();
// Calcula o nível de água, assumindo que a distância máxima é quando o tanque está vazio (nível baixo)
float water_level = NIVEL_MAX - distance;
// Exibe a distância medida e o nível de água no LCD
lcd_set_cursor(1, 0);
char buffer[16];
snprintf(buffer, sizeof(buffer), "Nivel Agua: %.1f", water_level);
lcd_string(buffer);
sleep_ms(1500); // Espera 1 segundo para visualizar a informação
lcd_clear();
lcd_set_cursor(0, 0);
lcd_string("SISTEMA AQUARIO");
lcd_set_cursor(1, 0);
lcd_string("AGUARDANDO DADOS");
}
// Função que exibe a temperatura
void display_temperature() {
float temperature = readTemperature(); // Chama a função para ler a temperatura
// Exibe a temperatura no LCD
lcd_set_cursor(1, 0);
char buffer[16];
if (temperature == -999.0) {
snprintf(buffer, sizeof(buffer), "Erro Temp!");
lcd_string(buffer); // Se erro, exibe mensagem
} else {
lcd_clear();
lcd_set_cursor(0, 0);
lcd_string("SISTEMA AQUARIO");
lcd_set_cursor(1, 0);
snprintf(buffer, sizeof(buffer), "Temper.: %.1f C", temperature);
lcd_string(buffer); // Exibe a temperatura no formato desejado
}
sleep_ms(1000);
}
// Função para exibir os valores dos sensores LDR
void display_ldr_values() {
// Inicializa os sensores LDR
init_ldr_luz();
init_ldr_turbidez();
init_ldr_ph();
// Lê os valores de cada sensor
float lux = read_ldr_luz();
float turbidez = read_ldr_turbidez();
float ph_value = read_ldr_ph();
// Exibe os valores no terminal (ou display)
lcd_clear();
lcd_set_cursor(0, 0);
lcd_string("SISTEMA AQUARIO");
lcd_set_cursor(1, 0);
char buffer[16];
snprintf(buffer, sizeof(buffer), "Luminosidade: %.1f", lux);
lcd_string(buffer);
sleep_ms(1500); // Pausa de 1 segundo
lcd_clear();
lcd_set_cursor(0, 0);
lcd_string("SISTEMA AQUARIO");
lcd_set_cursor(1, 0);
snprintf(buffer, sizeof(buffer), "Turbidez: %.1f", turbidez);
lcd_string(buffer);
sleep_ms(1500); // Pausa de 1 segundo
lcd_clear();
lcd_set_cursor(0, 0);
lcd_string("SISTEMA AQUARIO");
lcd_set_cursor(1, 0);
snprintf(buffer, sizeof(buffer), "pH: %.2f", ph_value);
lcd_string(buffer);
sleep_ms(1500); // Pausa de 1 segundo
}
// Função para controlar o aquecedor
void control_heater(float temperature) {
if (temperature < TEMPERATURA_MIN) {
relay_aquecedor_on(); // Liga o aquecedor
} else if (temperature > TEMPERATURA_MAX) {
relay_aquecedor_off(); // Desliga o aquecedor
}
}
// Função para controlar o nível de água
void control_water_level(float distance) {
if (distance < NIVEL_MIN) {
// Nível baixo, acionar bomba ou alarme
alarme_ativar();
motor_stepper_rotate_clockwise(1000, 1); // Aciona a bomba para encher
} else if (distance > NIVEL_MAX) {
// Nível alto, acionar alarme
alarme_ativar();
} else {
alarme_desativar();
}
}
// Função para controlar a luz (LDR)
void control_light(float lux) {
if (lux < LUZ_MIN) {
relay_iluminacao_on(); // Liga a iluminação
} else if (lux > LUZ_MAX) {
relay_iluminacao_off(); // Desliga a iluminação
}
}
// Função para monitorar turbidez e pH
void monitor_water_quality(float turbidez, float ph) {
if (turbidez > TURBIDEZ_MAX) {
alarme_ativar(); // Alerta se a turbidez estiver muito alta
} else if (ph < PH_MIN || ph > PH_MAX) {
alarme_ativar(); // Alerta se o pH estiver fora da faixa
} else {
alarme_desativar();
}
}
// Função para controlar os motores
void control_motors() {
// Exemplo: girar o motor da bomba de água (motor 1) no sentido horário
motor_stepper_rotate_clockwise(1000, 1);
sleep_ms(2000); // Aguarda 2 segundos
// Exemplo: girar o motor do dispenser de ração (motor 2) no sentido horário
motor_stepper_rotate_clockwise(1000, 2);
sleep_ms(2000); // faz-se necessario de tecnicas para sistemas multithreadeds, para fazer o ligamento idepedente ao sistema de tempos em tempos
//por exemplo um sleep_ms(43200000); que equivale a 12 horas, ficaria show para a alimentação, mas só funcionade forma legal quando for implementado concorrentemente
}
int main() {
// Inicializa o I2C com os pinos SDA e SCL
i2c_init(I2C_PORT, 100000); // 100kHz de velocidade
gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);
gpio_pull_up(SDA_PIN);
gpio_pull_up(SCL_PIN);
// Inicializa os sensores LDR
init_ldr_luz();
init_ldr_turbidez();
init_ldr_ph();
// Inicializa o LCD
lcd_init_display();
lcd_clear();
lcd_set_cursor(0, 0);
lcd_string("SISTEMA AQUARIO");
lcd_set_cursor(1, 0);
lcd_string("Funcionando!");
sleep_ms(1500);
lcd_clear();
lcd_set_cursor(0, 0);
lcd_string("SISTEMA AQUARIO");
// Inicializa o sensor de temperatura
initSensor();
// Inicializa o sensor de nível HC-SR04
hc_sr04_init();
// Inicializa os LEDs ornamentais
led_ornamental_init();
// Inicializa os relés
init_relays();
// Inicializa o alarme
alarme_init();
// Inicializa os motores
motor_stepper_init();
while (true) {
// Lê os valores dos sensores LDR no LCD
display_ldr_values();
sleep_ms(1000); // Aguarda 1 segundo
// Lê a temperatura do sensor DS18B20
float temperature = readTemperature();
// Controla o aquecedor com base na temperatura
control_heater(temperature);
// Exibe a temperatura no LCD
display_temperature();
sleep_ms(1500);
// Exibe o nível de água do sensor HC-SR04
float distance = measure_distance();
display_water_level();
// Controla o nível de água
control_water_level(distance);
sleep_ms(1500);
// Controla a iluminação com base no valor LDR
float lux = read_ldr_luz();
control_light(lux);
sleep_ms(1000);
// Monitora a turbidez e o pH
float turbidez = read_ldr_turbidez();
float ph = read_ldr_ph();
monitor_water_quality(turbidez, ph);
sleep_ms(1000);
// Controle dos motores
control_motors();
// Ligar ou manter os LEDs ornamentais acesos durante o ciclo
led_ornamental_cycle(); // Se for o caso de deixar os LEDs acesos o tempo todo faz-se necessario de tecnicas para sistemas multithreadeds
}
return 0;
}
Alarme Segurança
Sensor de Nível
Sensor de Turbidez -
Sensor Qualidade da Água
***Simulado por esse LDR***
Sensor LDR -
Sensor de Luz Ambiente
Motor Bomba de Água
Motor Dispenser Ração
Iluminação
Ornamental
Fita Led
Sensor de PH -
Sensor Controle Ácidez
***Simulado por esse LDR***
Aquecedor
Resistor - EFC (Elemento Final de Controle)
Sensor de Temperatura