diff options
author | Jonas Smedegaard <dr@jones.dk> | 2025-04-08 23:05:02 +0200 |
---|---|---|
committer | Jonas Smedegaard <dr@jones.dk> | 2025-04-08 23:05:02 +0200 |
commit | 818dce2a0adeaf94c3e5b5f2b18c15107c78d35a (patch) | |
tree | 9f02848aad5a11e9422e60756cd160dfbfee5f6a /Mussel | |
parent | 8a1e160ba0dc6f8153f6ee4aa8566c2622cbe331 (diff) |
add Bluetooth examples
Diffstat (limited to 'Mussel')
6 files changed, 144 insertions, 0 deletions
diff --git a/Mussel/examples/read_to_EddystoneTLM/EddystoneTLM_Beacon.md b/Mussel/examples/read_to_EddystoneTLM/EddystoneTLM_Beacon.md new file mode 100644 index 0000000..2e34029 --- /dev/null +++ b/Mussel/examples/read_to_EddystoneTLM/EddystoneTLM_Beacon.md @@ -0,0 +1,14 @@ +## Eddystone TLM beacon +EddystoneTLM beacon by BeeGee based on +[pcbreflux ESP32 Eddystone TLM deepsleep](https://github.com/pcbreflux/espressif/blob/master/esp32/arduino/sketchbook/ESP32_Eddystone_TLM_deepsleep/ESP32_Eddystone_TLM_deepsleep.ino) + +[EddystoneTLM frame specification](https://github.com/google/eddystone/blob/master/eddystone-tlm/tlm-plain.md) + + Create a BLE server that will send periodic Eddystone TLM frames. + The design of creating the BLE server is: + 1. Create a BLE Server + 2. Create advertising data + 3. Start advertising. + 4. wait + 5. Stop advertising. + 6. deep sleep diff --git a/Mussel/examples/read_to_EddystoneTLM/ci.json b/Mussel/examples/read_to_EddystoneTLM/ci.json new file mode 100644 index 0000000..abe13a7 --- /dev/null +++ b/Mussel/examples/read_to_EddystoneTLM/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_BLE_SUPPORTED=y" + ] +} diff --git a/Mussel/examples/read_to_EddystoneTLM/read_to_EddystoneTLM.ino b/Mussel/examples/read_to_EddystoneTLM/read_to_EddystoneTLM.ino new file mode 100644 index 0000000..73e0966 --- /dev/null +++ b/Mussel/examples/read_to_EddystoneTLM/read_to_EddystoneTLM.ino @@ -0,0 +1,54 @@ +/* + EddystoneTLM beacon by BeeGee based on https://github.com/pcbreflux/espressif/blob/master/esp32/arduino/sketchbook/ESP32_Eddystone_TLM_deepsleep/ESP32_Eddystone_TLM_deepsleep.ino + EddystoneTLM frame specification https://github.com/google/eddystone/blob/master/eddystone-tlm/tlm-plain.md +*/ + +#include <Mussel.h> + +#include "BLEDevice.h" +#include "BLEBeacon.h" +#include "BLEAdvertising.h" +#include "BLEEddystoneTLM.h" + +Mussel mussel(2); + +#define BEACON_POWER ESP_PWR_LVL_N12 + +// See the following for generating UUIDs: +// https://www.uuidgenerator.net/ +BLEAdvertising *pAdvertising; + +#define BEACON_UUID "8ec76ea3-6668-48da-9866-75be8bc86f4d" // UUID 1 128-Bit (may use linux tool uuidgen or random numbers via https://www.uuidgenerator.net/) + +// Check +// https://github.com/google/eddystone/blob/master/eddystone-tlm/tlm-plain.md +// and http://www.hugi.scene.org/online/coding/hugi%2015%20-%20cmtadfix.htm +// for the temperature value. It is a 8.8 fixed-point notation +void setBeacon() { + BLEEddystoneTLM EddystoneTLM; + EddystoneTLM.setTemp(mussel.read()); // 3000 = 30.00 ˚C + Serial.printf("Temperature is %.2f°C\n", EddystoneTLM.getTemp()); + + BLEAdvertisementData oAdvertisementData = BLEAdvertisementData(); + BLEAdvertisementData oScanResponseData = BLEAdvertisementData(); + oScanResponseData.setServiceData(BLEUUID((uint16_t)0xFEAA), String(EddystoneTLM.getData().c_str(), EddystoneTLM.getData().length())); + + oAdvertisementData.setName("ESP32 TLM Beacon"); + pAdvertising->setAdvertisementData(oAdvertisementData); + pAdvertising->setScanResponseData(oScanResponseData); +} + +void setup() { + Serial.begin(115200); + mussel.begin(); + BLEDevice::init("TLMBeacon"); + BLEDevice::setPower(BEACON_POWER); + pAdvertising = BLEDevice::getAdvertising(); + setBeacon(); + pAdvertising->start(); +} + +void loop() { + setBeacon(); + delay(500); +} diff --git a/Mussel/examples/voting_from_EddystoneTLM/Beacon_Scanner.md b/Mussel/examples/voting_from_EddystoneTLM/Beacon_Scanner.md new file mode 100644 index 0000000..34101fe --- /dev/null +++ b/Mussel/examples/voting_from_EddystoneTLM/Beacon_Scanner.md @@ -0,0 +1,9 @@ +## BLE Beacon Scanner + +Initiates a BLE device scan. +Checks if the discovered devices are +- an iBeacon +- an Eddystone TLM beacon +- an Eddystone URL beacon + +and sends the decoded beacon information over Serial log diff --git a/Mussel/examples/voting_from_EddystoneTLM/ci.json b/Mussel/examples/voting_from_EddystoneTLM/ci.json new file mode 100644 index 0000000..abe13a7 --- /dev/null +++ b/Mussel/examples/voting_from_EddystoneTLM/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_BLE_SUPPORTED=y" + ] +} diff --git a/Mussel/examples/voting_from_EddystoneTLM/voting_from_EddystoneTLM.ino b/Mussel/examples/voting_from_EddystoneTLM/voting_from_EddystoneTLM.ino new file mode 100644 index 0000000..25c4720 --- /dev/null +++ b/Mussel/examples/voting_from_EddystoneTLM/voting_from_EddystoneTLM.ino @@ -0,0 +1,55 @@ +/* + Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp + Ported to Arduino ESP32 by Evandro Copercini + Changed to a beacon scanner to report iBeacon, EddystoneURL and EddystoneTLM beacons by beegee-tokyo + Upgraded Eddystone part by Tomas Pilny on Feb 20, 2023 +*/ + +#include <Mussel.h> +#include <Arduino.h> + +#include <BLEDevice.h> +#include <BLEScan.h> +#include <BLEAdvertisedDevice.h> +#include <BLEEddystoneTLM.h> +#include <BLEBeacon.h> + +Mussel mussel(10); + +int scanTime = 1; //In seconds +BLEScan *pBLEScan; + +class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { + void onResult(BLEAdvertisedDevice advertisedDevice) { + if (advertisedDevice.haveName() + && advertisedDevice.getFrameType() == BLE_EDDYSTONE_TLM_FRAME + ) { + BLEEddystoneTLM EddystoneTLM(&advertisedDevice); + mussel.push( + advertisedDevice.getName(), + millis(), + EddystoneTLM.getTemp() + ); + } + } +}; + +void setup() { + Serial.begin(115200); + mussel.begin(); + + BLEDevice::init(""); + pBLEScan = BLEDevice::getScan(); //create new scan + pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); + pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster + pBLEScan->setInterval(100); + pBLEScan->setWindow(99); // less or equal setInterval value +} + +void loop() { + // put your main code here, to run repeatedly: + BLEScanResults *foundDevices = pBLEScan->start(scanTime, false); + pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory + mussel.printStack(); + delay(500); +} |