aboutsummaryrefslogtreecommitdiff
path: root/Mussel/examples/vote
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2025-04-13 13:03:53 +0200
committerJonas Smedegaard <dr@jones.dk>2025-04-13 13:03:53 +0200
commited3ac0eb11a04630f7f08124a484a854eea13569 (patch)
treedb1abdc77f1bca0d757d9f14d73830ff8509c400 /Mussel/examples/vote
parent9c84a009850a06e090b258b6b160ca2cdb41706e (diff)
rename and describe bluetooth examples
Diffstat (limited to 'Mussel/examples/vote')
-rw-r--r--Mussel/examples/vote/Mussel_Beacon_Voting.md20
-rw-r--r--Mussel/examples/vote/vote.ino55
-rw-r--r--Mussel/examples/vote/vote.puml27
3 files changed, 102 insertions, 0 deletions
diff --git a/Mussel/examples/vote/Mussel_Beacon_Voting.md b/Mussel/examples/vote/Mussel_Beacon_Voting.md
new file mode 100644
index 0000000..33a0893
--- /dev/null
+++ b/Mussel/examples/vote/Mussel_Beacon_Voting.md
@@ -0,0 +1,20 @@
+## Mussel Beacon Voting
+
+1. Scans bluetooth network for beacons.
+
+2. Collects mussel name and gape angle
+as decoded from each detected beacon,
+together with the time of detection in milliseconds since boot.
+
+3. Aligns the collected data
+to the format of ballots for a water quality vote.
+
+4. Qualifies the ballots for criteria of the water quality vote
+(e.g. timeliness and sanity of gape angles).
+
+5. Concludes a vote based on collected, aligned and qualified ballots.
+
+6. Acts on the voting result,
+e.g. turns on a steady light for "code green"
+or a blinking light for "code yellow",
+or turns on a blinking light and shuts off a valve for "code red".
diff --git a/Mussel/examples/vote/vote.ino b/Mussel/examples/vote/vote.ino
new file mode 100644
index 0000000..25c4720
--- /dev/null
+++ b/Mussel/examples/vote/vote.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);
+}
diff --git a/Mussel/examples/vote/vote.puml b/Mussel/examples/vote/vote.puml
new file mode 100644
index 0000000..a4958f7
--- /dev/null
+++ b/Mussel/examples/vote/vote.puml
@@ -0,0 +1,27 @@
+@startuml
+:instantiate mussel object;
+:instantiate bluetooth object;
+group init
+:setup mussel voting;
+:setup bluetooth scanner;
+end group
+split
+while (each beacon detected)
+group "bluetooth callback" {
+:collect beacon data;
+end group
+endwhile
+-[hidden]->
+kill
+split again
+while (each 500ms)
+group loop {
+:allign beacon data as ballots;
+:qualify ballots for a vote;
+:conclude vote result;
+:act on vote result;
+end group
+endwhile
+-[hidden]->
+kill
+@enduml