#include "BluetoothSerial.h"
#include <DHT.h>
#include <ESP32Servo.h>
// Estruturação dos pinos do ESP32
#define ledr_pin 21 // Pino LED Vermelho conectado ao pino digital 21 do ESP
#define buzzer_pin 22 // Defina o pino conectado ao buzzer
#define servo_pin 23 // Pino SERVO conectado ao pino digital 23 do ESP
#define dht_pin 25 // Pino DHT conectado ao pino digital 25 do ESP
#define ledg_pin 26 // Pino LED Verde conectado ao pino digital 26 do ESP
#define sm_pin 27 // Pino SM conectado ao pino digital 27 do ESP
#define trig_pin 32 // Pino TRIG conectado ao pino digital 32 do ESP
#define echo_pin 33 // Pino ECHO conectado ao pino digital 33 do ESP
// Indicar que o Bluetooth está ligado
#define ledbt_pin 19 // Pino LED Vermelho conectado ao pino digital 21 do ESP
// ----- Conexão Bluetooth -----
// Nome do dispositivo Bluetooth
String device_name = "Lixeira Inteligente";
// Verifica se o Bluetooth está disponível
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
// Verifica o perfil da porta serial
#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Port Profile for Bluetooth is not available or not enabled. It is only available for the ESP32 chip.
#endif
BluetoothSerial SerialBT; // Declara o objeto da serial do Bluettoth
// ----- Conexão Bluetooth -----
// ----- Variáveis de Controle -----
bool estado_tampa = false; // Variável para armazenar o estado da tampa
bool buzzer_ativo = false; // Variável para controlar o estado do buzzer
unsigned long ultimo_som_buzzer = 0; // Variável para registrar o tempo do último acionamento do buzzer
// Variáveis de estado para mapear se os sensores/atuadores estão ativos ou não via Bluetooth
bool sm_ativo = true;
bool dht_ativo = true;
bool su_ativo = true;
bool mostrarDados = false; // Controle para exibir os dados
float temperatura;
float umidade;
float volume;
long distancia; // Variável para armazenar a distância medida
// ----- Variáveis de Controle -----
// ----- Sensores -----
// DHT
DHT dht(dht_pin, DHT11);
// Servo Motor
Servo servo_motor; // Cria um objeto Servo para controlar o servo motor
// ----- Sensores -----
// ----- Funções -----
long medir_distancia() {
// Envia um pulso para o pino TRIG
digitalWrite(trig_pin, LOW); // Define o nível lógico baixo no pino TRIG
delayMicroseconds(2); // Aguarda 2 microssegundos
digitalWrite(trig_pin, HIGH); // Define o nível lógico alto no pino TRIG
delayMicroseconds(10); // Aguarda 10 microssegundos
digitalWrite(trig_pin, LOW); // Define novamente o nível lógico baixo no pino TRIG
// Mede o tempo do pulso de retorno (em microssegundos)
long duracao = pulseIn(echo_pin, HIGH);
// Calcula a distância em centímetros
long distancia = (duracao / 29.1) / 2; // Velocidade do som em cm/us (343 m/s = 34300 cm/s)
return distancia;
}
void enviar_menu() {
SerialBT.println(F("\nMenu:"));
SerialBT.println(F("1 - Ativar/Desativar sensor de temperatura"));
SerialBT.println(F("2 - Ativar/Desativar sensor de movimento"));
SerialBT.println(F("3 - Ativar/Desativar sensor de distância"));
SerialBT.println(F("d - Iniciar/Parar exibição dos dados dos sensores"));
SerialBT.println(F("m - Voltar ao menu principal"));
}
// Verifica se o Bluetooth está conectado
void conexao_bluetooth() {
if (SerialBT.connect()) {
digitalWrite(ledr_pin, HIGH);
enviar_menu();
} else {
digitalWrite(ledbt_pin, LOW);
}
}
void processar_dados(){
// Sensor de Movimento e Servo Motor
if (sm_ativo) {
// Verifica se o sensor de presença está ativo
if (digitalRead(sm_pin) == HIGH && estado_tampa == false) {
// Serial.println("Movimento detectado - Abrindo a tampa");
// SerialBT.println("Movimento detectado - Abrindo a tampa");
servo_motor.write(90); // Abre a tampa
digitalWrite(ledg_pin, HIGH); // Acende o LED Verde
estado_tampa = true; // Tampa aberta
} else if (digitalRead(sm_pin) == LOW && estado_tampa == true) {
// Serial.println("Movimento não detectado - Fechando a tampa");
// SerialBT.println("Movimento não detectado - Fechando a tampa");
delay(3000); // Aguarda 3 segundos antes da tampa fechar
servo_motor.write(0); // Fecha a tampa
digitalWrite(ledg_pin, LOW); // Apaga o LED Verde
estado_tampa = false; // Tampa fechada
}
}
// Sensor Ultrassônico
if (su_ativo) {
distancia = medir_distancia(); // Chama a função para medir a distância
if (!estado_tampa) {
// Lixeira não está cheia
if (distancia > 5) {
digitalWrite(ledr_pin, LOW); // Apaga o LED Vermelho
// Supõe-se que a altura total da lixeira é de 20 cm
float altura_total = 20.0; // altura total da lixeira em cm
// Cálculo do volume ocupado como porcentagem
volume = ((altura_total - distancia) / altura_total) * 100.0;
} else { // Lixeira está cheia
// Serial.print("Lixeira está cheia!"); // Lixeira cheia
// SerialBT.println("Lixeira está cheia!");
digitalWrite(ledr_pin, HIGH); // Acende o LED Vermelho
// Lixeira cheia -> 100%
volume = 100.0;
// Enviar sinal para plataforma de Controle
// ...
}
}
}
// DHT11
if (dht_ativo) {
umidade = dht.readHumidity(); // Lê a umidade relativa
temperatura = dht.readTemperature(); // Lê a temperatura em Celsius
// Verifica se alguma leitura falhou
if (isnan(umidade) || isnan(temperatura)) {
Serial.println("Falha no sensor DHT11!");
return;
}
// Identificar se a temperatura é alta (indício de fogo) ou baixa (sem indício de fogo)
if (temperatura >= 31) {
// Serial.println("Temperatura alta -> Ativa o Buzzer.");
// Verifica se o buzzer não está ativo e se passaram 10 segundos desde o último acionamento
if (!buzzer_ativo && (millis() - ultimo_som_buzzer > 10000)) {
// Dispara o Buzzer e envia notificação
digitalWrite(buzzer_pin, HIGH);
delay(1000); // Mantém o tom por 1 s
digitalWrite(buzzer_pin, LOW);
buzzer_ativo = true;
ultimo_som_buzzer = millis();
}
// Código para notificar o celular
// ...
} else {
buzzer_ativo = false; // Reseta o estado do buzzer
// Serial.println("Temperatura baixa.");
}
}
}
void informar_estado_sensor(char tipo_sensor, bool estado) {
SerialBT.print(F("Sensor "));
SerialBT.print(tipo_sensor);
SerialBT.println(estado ? F(" ativado.") : F(" desativado."));
}
void exibir_dados() {
if (dht_ativo) {
float temp = dht.readTemperature();
if (!isnan(temp)) {
SerialBT.print(F("Temperatura: "));
SerialBT.print(temp);
SerialBT.println(F("°C"));
} else {
SerialBT.println(F("Erro ao ler temperatura!"));
}
}
if (sm_ativo) {
int movimento = digitalRead(PIRPIN);
SerialBT.print(F("Movimento: "));
SerialBT.println(movimento ? F("Detectado") : F("Não detectado"));
}
if (su_ativo) {
long duracao, distancia;
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
duracao = pulseIn(ECHOPIN, HIGH);
distancia = duracao * 0.034 / 2;
SerialBT.print(F("Distância: "));
SerialBT.print(distancia);
SerialBT.println(F("cm"));
}
delay(2000); // Espera um pouco antes da próxima leitura
}
// ----- Funções -----
void setup() {
Serial.begin(115200); // Inicializa a comunicação serial
// Estabelecendo a conexão Bluetooth
SerialBT.begin(device_name); // Nome do dispositivo Bluetooth
Serial.printf("O dispositivo com nome \"%s\" começou.\nAgora você pode emparelhá-lo com Bluetooth!\n", device_name.c_str());
// DHT11
dht.begin(); // Inicializa o sensor DHT
// Sensor Ultrassônico
pinMode(trig_pin, OUTPUT); // Configura o pino TRIG como saída
pinMode(echo_pin, INPUT); // Configura o pino ECHO como entrada
pinMode(ledr_pin, OUTPUT); // Define o pino do LED Vermelho como saída
// Sensor de Movimento
pinMode(sm_pin, INPUT); // Define o pino do sensor SM como entrada
pinMode(ledg_pin, OUTPUT); // Define o pino do LED Verde como saída
// Servo Motor
servo_motor.attach(servo_pin);
servo_motor.write(0); // Inicializa o servo na posição 0 graus
// Buzzer
pinMode(buzzer_pin, OUTPUT); // Define o pino do buzzer como saída
Serial.println("Sistema inicializado");
Serial.println("-----------------------------");
}
void loop() {
// Verifica conexão com o Bluetooth
conexao_bluetooth();
static unsigned long ultima_leitura = 0;
unsigned long tempo_atual = millis();
if (SerialBT.available()) {
char comando = SerialBT.read();
switch (comando) {
case '1':
dht_ativo = !dht_ativo;
informar_estado_sensor('1', dht_ativo);
break;
case '2':
sm_ativo = !sm_ativo;
informar_estado_sensor('2', sm_ativo);
break;
case '3':
su_ativo = !su_ativo;
informar_estado_sensor('3', su_ativo);
break;
case 'd': // Comando para mostrar os dados
mostrarDados = !mostrarDados;
SerialBT.println(mostrarDados ? F("Exibindo dados.") : F("Parando exibição de dados."));
break;
case 'm': // Comando para voltar ao menu
mostrarDados = false; // Garante que a exibição dos dados seja interrompida ao voltar ao menu
enviarMenu();
break;
// ... outros casos ...
}
}
if (mostrarDados) {
exibir_dados(); // Chama a função que mostra os dados dos sensores
}
// Realiza leituras a cada 2 segundos (2000 milissegundos)
if (tempo_atual - ultima_leitura >= 2000) {
processar_dados();
ultima_leitura = millis(); // Atualiza o tempo da última leitura
}
delay(3000); // Aguarda 3 segundos antes da próxima leitura
}