aboutsummaryrefslogtreecommitdiff
path: root/Mussel
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2025-04-08 23:05:02 +0200
committerJonas Smedegaard <dr@jones.dk>2025-04-08 23:05:02 +0200
commit818dce2a0adeaf94c3e5b5f2b18c15107c78d35a (patch)
tree9f02848aad5a11e9422e60756cd160dfbfee5f6a /Mussel
parent8a1e160ba0dc6f8153f6ee4aa8566c2622cbe331 (diff)
add Bluetooth examples
Diffstat (limited to 'Mussel')
-rw-r--r--Mussel/examples/read_to_EddystoneTLM/EddystoneTLM_Beacon.md14
-rw-r--r--Mussel/examples/read_to_EddystoneTLM/ci.json6
-rw-r--r--Mussel/examples/read_to_EddystoneTLM/read_to_EddystoneTLM.ino54
-rw-r--r--Mussel/examples/voting_from_EddystoneTLM/Beacon_Scanner.md9
-rw-r--r--Mussel/examples/voting_from_EddystoneTLM/ci.json6
-rw-r--r--Mussel/examples/voting_from_EddystoneTLM/voting_from_EddystoneTLM.ino55
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);
+}