#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <math.h>
//broker connect
#define IO_USERNAME "[email protected]" //<----------Mudar para o seu
#define IO_KEY "123456" //<----------Mudar para o seu
//wifi connect
const char* ssid = "WOKWI-Guest";
const char* password ="";
const char* mqttserver = "maqiatto.com";
const int mqttport = 1883;
const char* mqttUser = IO_USERNAME;
const char* mqttPassword = IO_KEY;
WiFiClient espClient;
PubSubClient client(espClient);
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
BLEAdvertisedDevice* myDevice;
BLEScan *pBLEScan;
int scanTime = 100;
bool scanning = false;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.print(WiFi.localIP());
}
float calculateDistance(int rssi) {
// Parâmetros para cálculo de distância (ajuste conforme necessário)
int txPower = -59; // Nível de potência do transmissor (valor típico para BLE)
if (rssi == 0) {
return -1.0; // Não foi possível calcular a distância
}
float ratio = rssi * 1.0 / txPower;
if (ratio < 1.0) {
return pow(ratio, 10);
} else {
float distance = (0.89976) * pow(ratio, 7.7095) + 0.111;
return distance;
}
}
void publishBroker(){
while (!client.connected()) {
Serial.print("Tentando conexão MQTT...");
//client ID
String clientId = "ESP32 - Zona proibida";
clientId += String(random(0xffff), HEX);
// Se conectado
if (client.connect(clientId.c_str(), mqttUser, mqttPassword)) {
Serial.println("conectado");
}
delay(5000);
}
client.publish("[email protected]/alerta", "Gato entrou na zona proibida!");
}
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.print(" - Conexão BLE disponível: ");
Serial.println(advertisedDevice.toString().c_str());
if (advertisedDevice.haveName()) {
Serial.print(" - Device name: ");
Serial.println(advertisedDevice.getName().c_str());
Serial.println("");
}
// Se encontramos um dispositivo com o UUID do serviço, marcamos como nosso dispositivo
if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(BLEUUID(SERVICE_UUID))) {
BLEDevice::getScan()->stop();
Serial.print(" - Serviço encontrado!");
Serial.println(advertisedDevice.getServiceUUID().toString().c_str());
// Obtém o RSSI
int rssi = advertisedDevice.getRSSI();
Serial.print(" - RSSI: ");
Serial.println(rssi);
// Calcula a distância
float distance = calculateDistance(rssi);
Serial.print(" - Distância estimada: ");
Serial.print(distance);
Serial.println(" m");
if(distance <= 1.5){
Serial.print(" - Gato está próximo! ");
client.publish("[email protected]/alerta", "Gato está próximo!");
//publicar no broker
}
}
scanning = false;
}
};
void setup() {
Serial.begin(115200);
setup_wifi(); //conectar com wifi
client.setServer(mqttserver, 1883); // Publicar
Serial.println("Starting BLE client...");
BLEDevice::init("");
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true);
//pBLEScan->setInterval(100);
//pBLEScan->setWindow(99); // less or equal setInterval value
pBLEScan->start(scanTime, false);
scanning = true;
}
void loop() {
if (!scanning) {
Serial.println("Reinicia Scan...");
pBLEScan->start(scanTime, false); // Escaneia
scanning = true;
}
if (myDevice) {
//BLEClient* pClient = BLEDevice::createClient();
//Serial.println(" - Cliente criado!");
// Conecte-se ao servidor
//pClient->connect(myDevice);
//Serial.println(" - Conectado!");
// Desconecte-se
//pClient->disconnect();
//Serial.println(" - Desconectado!");
// Limpeza
//delete myDevice;
//myDevice = nullptr;
// Reiniciar a pesquisa após uma pausa
//BLEDevice::getScan()->start(30, false);
}
delay(2000);
}