#include <Arduino.h> // Include Arduino core library for ESP32
#include <BLEDevice.h> // Include BLE library for ESP32
#include <BLEServer.h> // Include BLE server functionality
#include <BLEUtils.h> // Include BLE utility functions
#include <BLE2902.h> // Include BLE descriptor for notifications
// Define pins for components
#define LED_PIN 5 // GPIO 5 for LED (simulating vibration motor)
#define HRV_PIN 34 // GPIO 34 for potentiometer (simulating HRV sensor)
#define HRV_THRESHOLD 1500 // Threshold for low HRV (tweak based on testing)
// Define BLE service and characteristic UUIDs
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" // Unique service UUID
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" // Unique characteristic UUID
// Global BLE objects
BLEServer *pServer = NULL; // Pointer to BLE server
BLECharacteristic *pCharacteristic = NULL; // Pointer to BLE characteristic
bool deviceConnected = false; // Track BLE connection status
// BLE server callbacks to handle connection/disconnection
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) { // Called when a device connects
deviceConnected = true; // Set connection flag
Serial.println("Device connected"); // Log connection
}
void onDisconnect(BLEServer* pServer) { // Called when a device disconnects
deviceConnected = false; // Clear connection flag
Serial.println("Device disconnected"); // Log disconnection
BLEDevice::startAdvertising(); // Restart advertising
}
};
void setup() {
Serial.begin(115200); // Start serial communication at 115200 baud
pinMode(LED_PIN, OUTPUT); // Set LED pin as output
digitalWrite(LED_PIN, LOW); // Ensure LED is off initially
pinMode(HRV_PIN, INPUT); // Set HRV pin as input (analog)
// Initialize BLE
BLEDevice::init("FocusNudger"); // Set BLE device name
pServer = BLEDevice::createServer(); // Create BLE server
pServer->setCallbacks(new MyServerCallbacks()); // Attach connection callbacks
BLEService *pService = pServer->createService(SERVICE_UUID); // Create BLE service
pCharacteristic = pService->createCharacteristic( // Create characteristic
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY // Allow read and notify
);
pCharacteristic->addDescriptor(new BLE2902()); // Add descriptor for notifications
pService->start(); // Start the service
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); // Get advertising object
pAdvertising->start(); // Start advertising
Serial.println("BLE advertising started"); // Log advertising start
}
void loop() {
int hrvValue = analogRead(HRV_PIN); // Read analog value from potentiometer (0-4095)
Serial.print("HRV: "); // Print label
Serial.println(hrvValue); // Print HRV value
if (hrvValue < HRV_THRESHOLD) { // Check if HRV indicates distraction
digitalWrite(LED_PIN, HIGH); // Turn on LED (simulate vibration)
delay(200); // Vibrate for 200ms
digitalWrite(LED_PIN, LOW); // Turn off LED
Serial.println("Vibration triggered"); // Log vibration
}
if (deviceConnected) { // If a device is connected via BLE
String hrvStr = String(hrvValue); // Convert HRV to string
pCharacteristic->setValue(hrvStr.c_str()); // Set BLE characteristic value
pCharacteristic->notify(); // Notify connected device
Serial.print("Sent HRV via BLE: "); // Log BLE transmission
Serial.println(hrvStr); // Print sent value
}
delay(1000); // Wait 1 second before next loop
}