#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <BLE2902.h> // Necessário para compatibilidade de notificações
// UUIDs para o serviço e característica
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
// Definição dos pinos conforme solicitado
const int pinoLed1 = 33;
const int pinoLed2 = 32;
const int pinoBotao1 = 26;
const int pinoBotao2 = 25;
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
// Gerenciamento da conexão
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
Serial.println("Dispositivo Conectado");
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
Serial.println("Dispositivo Desconectado");
// Reinicia a visibilidade para permitir nova conexão
BLEDevice::startAdvertising();
}
};
// Recebimento de dados do Aplicativo
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
String value = pCharacteristic->getValue(); // Correção da String
if (value.length() > 0) {
char comando = value[0];
Serial.print("Comando recebido: ");
Serial.println(comando);
if (comando == 'A') {
digitalWrite(pinoLed1, !digitalRead(pinoLed1)); // Inverte estado LED 1
}
if (comando == 'B') {
digitalWrite(pinoLed2, !digitalRead(pinoLed2)); // Inverte estado LED 2
}
}
}
};
void setup() {
Serial.begin(115200);
pinMode(pinoLed1, OUTPUT);
pinMode(pinoLed2, OUTPUT);
pinMode(pinoBotao1, INPUT_PULLUP);
pinMode(pinoBotao2, INPUT_PULLUP);
// Inicializa o BLE
BLEDevice::init("ESP32_Controle");
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// Cria o Serviço
BLEService *pService = pServer->createService(SERVICE_UUID);
// Cria a Característica com suporte a Notificação e Escrita
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY |
BLECharacteristic::PROPERTY_INDICATE
);
// Adiciona o descritor 2902 para o "No profile found" não ocorrer
pCharacteristic->addDescriptor(new BLE2902());
pCharacteristic->setCallbacks(new MyCallbacks());
pService->start();
// Inicia a transmissão do sinal
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(true);
pServer->getAdvertising()->start();
Serial.println("Pronto! Conecte pelo Serial Bluetooth Terminal.");
}
void loop() {
static bool ultimoEstadoBtn1 = HIGH;
static bool ultimoEstadoBtn2 = HIGH;
// Lógica Botão 1
bool leitura1 = digitalRead(pinoBotao1);
if (leitura1 != ultimoEstadoBtn1) {
delay(50); // Debounce
if (leitura1 == LOW && deviceConnected) {
pCharacteristic->setValue("Botao 1 Pressionado");
pCharacteristic->notify();
Serial.println("Mensagem enviada: Botao 1");
}
ultimoEstadoBtn1 = leitura1;
}
// Lógica Botão 2
bool leitura2 = digitalRead(pinoBotao2);
if (leitura2 != ultimoEstadoBtn2) {
delay(50); // Debounce
if (leitura2 == LOW && deviceConnected) {
pCharacteristic->setValue("Botao 2 Pressionado");
pCharacteristic->notify();
Serial.println("Mensagem enviada: Botao 2");
}
ultimoEstadoBtn2 = leitura2;
}
}