/*
Opa, claro! Vou te ajudar a começar com o código para medir a distância entre dois ESP32 usando BLE (Bluetooth Low Energy). A ideia é usar o RSSI (Received Signal Strength Indicator) para estimar a distância. Vou te passar um código inicial para os ESP32.
### Código para o ESP32 Rastreador (no gato)
Este ESP32 vai enviar o sinal BLE:
```cpp
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
uint32_t value = 0;
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
void setup() {
Serial.begin(115200);
BLEDevice::init("Gato Tracker");
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setValue("Hello World");
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->start();
}
void loop() {
// Coloque o código que você quiser rodar continuamente aqui
}
```
### Código para os ESP32 das Zonas Proibidas
Este ESP32 vai ler o sinal do rastreador e calcular a distância baseada no RSSI:
```cpp
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
int scanTime = 5; // Tempo de scan em segundos
BLEScan* pBLEScan;
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
int rssi = advertisedDevice.getRSSI();
std::string name = advertisedDevice.getName();
if (name == "Gato Tracker") {
Serial.print("Dispositivo encontrado: ");
Serial.print(name.c_str());
Serial.print(" com RSSI: ");
Serial.println(rssi);
// Calcule a distância usando o valor de RSSI
double distance = calculateDistance(rssi);
Serial.print("Distância estimada: ");
Serial.print(distance);
Serial.println(" metros");
}
}
};
double calculateDistance(int rssi) {
int txPower = -69; // Potência de transmissão em dBm (pode variar)
if (rssi == 0) {
return -1.0; // Não foi possível calcular a distância
}
double ratio = rssi*1.0/txPower;
if (ratio < 1.0) {
return pow(ratio,10);
} else {
double distance = (0.89976)*pow(ratio,7.7095) + 0.111;
return distance;
}
}
void setup() {
Serial.begin(115200);
BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); // Cria o objeto scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); // Ative o scan ativo
pBLEScan->setInterval(100);
pBLEScan->setWindow(99);
}
void loop() {
BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
Serial.print("Dispositivos encontrados: ");
Serial.println(foundDevices.getCount());
delay(2000);
}
```
### Explicação
- **ESP32 Rastreador**: Este código configura um ESP32 para atuar como um servidor BLE, anunciando um serviço que pode ser detectado por outros dispositivos BLE.
- **ESP32 Zona Proibida**: Este código configura um ESP32 para escanear dispositivos BLE próximos. Quando encontra o dispositivo do rastreador, calcula a distância baseada no RSSI.
### Próximos Passos
1. **Testar a medição de distância**: Veja se a função `calculateDistance` está funcionando corretamente e ajusta os parâmetros conforme necessário.
2. **Integrar com MQTT**: Adicione o código para enviar os dados de distância para o broker MQTT quando o gato estiver próximo demais.
3. **Acionar o buzzer**: Configure para ativar o buzzer quando a distância for menor que o limite definido.
Qualquer dúvida ou ajuste que precisar, é só falar!
*/