From 87fd0f35f68565dffcdf5445fcbefc68f9f59423 Mon Sep 17 00:00:00 2001 From: Clemens-Dautermann Date: Sun, 6 Feb 2022 19:30:51 +0100 Subject: [PATCH] created bluetooth server --- src/ble/BluetoothServer.cpp | 92 +++++++++++++++++++++++++++++++++++++ src/ble/BluetoothServer.h | 25 ++++++++++ src/main.cpp | 15 ++++-- src/sensors/BmpSensor.cpp | 3 +- 4 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 src/ble/BluetoothServer.cpp create mode 100644 src/ble/BluetoothServer.h diff --git a/src/ble/BluetoothServer.cpp b/src/ble/BluetoothServer.cpp new file mode 100644 index 0000000..4586e42 --- /dev/null +++ b/src/ble/BluetoothServer.cpp @@ -0,0 +1,92 @@ +#include +#include +#include +#include "BluetoothServer.h" + +#define INTERNAL_LED_PIN 2 +#define BLE_SERVER_NAME "ClimateGO" +#define SERVICE_UUID "2150123c-af53-4038-bc92-ba3d0870a9e4" +#define TEMPERATURE_CHARACTERISTIC_UUID "cba1d466-344c-4be3-ab3f-189f80dd7518" +#define PRESSURE_CHARACTERISTIC_UUID "ca73b3ba-39f6-4ab3-91ae-186dc9577d99" + +//Setup callbacks onConnect and onDisconnect +class ServerCallbacks : public BLEServerCallbacks { + void onConnect(BLEServer *pServer) override { + Serial.println("New device connected."); + digitalWrite(INTERNAL_LED_PIN, HIGH); + }; + + void onDisconnect(BLEServer *pServer) override { + Serial.println("Device disconnected."); + digitalWrite(INTERNAL_LED_PIN, LOW); + //restart advertising on device disconnect + pServer->getAdvertising()->start(); + } +}; + +/** + * Represents the Bluetooth server that handles all interactions + */ +BluetoothServer::BluetoothServer() { + // Create the BLE Device + BLEDevice::init(BLE_SERVER_NAME); + + // Create the BLE Server + this->bleServer = BLEDevice::createServer(); + bleServer->setCallbacks(new ServerCallbacks()); + + // Create the BLE Service + this->sensorService = bleServer->createService(SERVICE_UUID); + + //create characteristics that will enable data sharing + BLECharacteristic *temperatureCharacteristic = sensorService->createCharacteristic( + TEMPERATURE_CHARACTERISTIC_UUID, + BLECharacteristic::PROPERTY_READ + ); + BLECharacteristic *pressureCharacteristic = sensorService->createCharacteristic( + PRESSURE_CHARACTERISTIC_UUID, + BLECharacteristic::PROPERTY_READ + ); + + //set initial values + temperatureCharacteristic->setValue("NA"); + pressureCharacteristic->setValue("NA"); +} + +/** + * Method to start the Bluetooth server and enable advertising to allow other devices to connect + */ +void BluetoothServer::startServer() { + // Start the service + this->sensorService->start(); + + // Start advertising + BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); + pAdvertising->addServiceUUID(SERVICE_UUID); + this->bleServer->getAdvertising()->start(); + Serial.println("Started BLE Server."); +} + +/** + * TODO: Convert temperature to string somehow + * Publish a new temperature to the appropriate characteristic + * @param temperature the new temperature + */ +void BluetoothServer::setTemperature(float temperature) { + sensorService + ->getCharacteristic(TEMPERATURE_CHARACTERISTIC_UUID) + ->setValue(temperature); +} + +/** + * TODO: Convert pressure to string somehow + * Publish a new pressure to the appropriate characteristic + * @param pressure the new pressure + */ +void BluetoothServer::setPressure(float pressure) { + sensorService + ->getCharacteristic(PRESSURE_CHARACTERISTIC_UUID) + ->setValue(pressure); +} + + diff --git a/src/ble/BluetoothServer.h b/src/ble/BluetoothServer.h new file mode 100644 index 0000000..4afd1ec --- /dev/null +++ b/src/ble/BluetoothServer.h @@ -0,0 +1,25 @@ +#ifndef NEW_CLIMTE_GO_BLUETOOTHSERVER_H +#define NEW_CLIMTE_GO_BLUETOOTHSERVER_H + +#include +#include +#include +#include +#include + +#define temperatureCelsius + +class BluetoothServer { +private: + BLEService *sensorService; + BLEServer *bleServer; +public: + BluetoothServer(); + + void startServer(); + void setTemperature(float temperature); + void setPressure(float pressure); +}; + + +#endif //NEW_CLIMTE_GO_BLUETOOTHSERVER_H diff --git a/src/main.cpp b/src/main.cpp index 5dad5cb..38b5852 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,21 +1,28 @@ #include #include +#include #define SLEEP_TIME 2 #define BAUD_RATE 112500 +#define INTERNAL_LED_PIN 2 + Sensor *bmpSensor; +BluetoothServer *server; void setup() { Serial.begin(BAUD_RATE); + pinMode(INTERNAL_LED_PIN, OUTPUT); + bmpSensor = new BmpSensor(); + + server = new BluetoothServer(); + server->startServer(); } void loop() { sensor_data_t sample = ((BmpSensor *) bmpSensor)->sampleLowEnergy(); - Serial.printf("Temperature: %f | Pressure: %f \n", - sample.temperature, - sample.pressure - ); + server->setPressure(sample.pressure); + server->setTemperature(sample.temperature); delay(SLEEP_TIME * 1000); } \ No newline at end of file diff --git a/src/sensors/BmpSensor.cpp b/src/sensors/BmpSensor.cpp index 97dd6fb..7f68a25 100644 --- a/src/sensors/BmpSensor.cpp +++ b/src/sensors/BmpSensor.cpp @@ -74,7 +74,8 @@ sensor_data_t BmpSensor::sample() { } /** - * Read a sample and put sensor to standby mode + * Read a sample and put sensor to standby mode. + * !!! Do not use this if sampling time is <= 500ms !!! * @return the sample read */ sensor_data_t BmpSensor::sampleLowEnergy() {