This is my first project with Arduino Nano 33 BLE.
I have an Anemometer connected to an Arduino Nano 33 BLE REV2.
On my two Solar Panel I have, per panel, a Nano 33 BLE connected to move the panel with linear motors to the brightest point.
If we have to much wind, the panel should move to horizonal. For this I need the Data from the Anemometer (peripheral device) via BLE.
The Arduino on the Anemometer calculate the Windspeed and gives me the status back (true, if Windspeed is high, false, if Windspeed ist low). This are not sensitive data, they can broadcasted or what ever the best solution is.
I don't know how to subscribe from the two central devices and get only Data if the status changed (characteristic.valueUpdated()).
After three weeks of trial and error, I'm still not sure what the best approach is. I've done a lot of research online, but I'm not sure I fully understand the sequence I should be using.
For programing I use Visual Studio Code with PlatformIO.
Many thanks for any help in advance Gene
Code for the peripheral device
// Code for peripheral device
#include <Arduino.h>
#include <ArduinoBLE.h>
/*
* https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/Assigned_Numbers/out/en/Assigned_Numbers.pdf?v=1730037065143
* 1816 - "Cycling Speed and Cadence Service" - siehe Seite 66 (Kapitel 3.4 GATT Services - 3.4.1 Services by Name)
* 2A70 - "True Wind Speed" Characteristics - siehe Seite 94 (Kapitel 3.8 Characteristics - 3.8.1 Characteristics by Name)
*
* https://docs.arduino.cc/libraries/arduinoble/#BLECharacteristic%20Class
* https://reference.arduino.cc/reference/en/libraries/arduinoble/
*
* https://forum.arduino.cc/t/ble-notify-with-nano-33-ble/1077156/3
* https://github.com/Robocraze/Nano-33-BLE-Examples/blob/main/environment_sensor_ble/environment_sensor_ble.ino
* https://forum.arduino.cc/t/bluetooth-communications/902610
* https://forum.arduino.cc/t/arduino-nano-33-ble-2-way-communication/938251
* (*1) https://stackoverflow.com/questions/72626516/how-to-enable-notification-and-indications-on-arduino-nano-33-iot-ble-descriptor
* https://forum.arduino.cc/t/connecting-two-ble-peripheral-devices-to-one-central-device/1242915
*/
const char* BLE_Service_UUID_TrueWindSpeed = "181a"; // Service - Environmental Sensing Service
const char* BLE_Characeristics_UUDI_TrueWindSpeed = "2a70"; // Characteristics - True Wind Speed
BLEService environmentalService(BLE_Service_UUID_TrueWindSpeed); // Bluetoothยฎ Low Energy Binary Sensor Service
BLEIntCharacteristic windSpeedCharacteristic(BLE_Characeristics_UUDI_TrueWindSpeed, BLERead | BLENotify); // GATT
// BLEDescriptor Descriptor("beca6057-955c-4f8a-e1e3-56a1633f04b1","Descriptor");
bool oldWindSpeedLevel = 0; // last Wind Speed level reading from Anemometer
long previousMillis = 0; // last Wind Speed level was checked in before x millis
int checkWindCounter = 0;
const int mds = 5; // measure duration in seconds
const float mts = 2.5; // max Anemometer turns per second
int pauseAfterWindMeasure = 30 * 1000; // Pause after wind measurement in millis (sec * 1000 = msec)
const int pinReedSensor = 8 ; // REED Sensorport (Anemometer)
//โโโโโ Function declarations โโโโโ
// void updateWindLevel();
bool readAnemometer();
String iif(bool check, String rString1, String rString2);
void blePeripheralConnectHandler( BLEDevice central );
void blePeripheralDisconnectHandler( BLEDevice central );
void setupBLE_Environment(); // Setup Bluetooth Environment
void setup() {
Serial.begin(9600); // initialize serial communication
// while (!Serial);
pinMode(LED_BUILTIN, OUTPUT); // initialize the built-in LED pin to indicate when a central is connected
pinMode(pinReedSensor, INPUT_PULLDOWN);
setupBLE_Environment();
}
void loop()
{
Serial.print(timeSinceStart());Serial.print(" ");
BLE.advertise();
bool WindLevel = readAnemometer();
BLEDevice central = BLE.central(); // wait for a Bluetoothยฎ Low Energy central
Serial.print(" windSpeedCharacteristic is ");
if (windSpeedCharacteristic.subscribed())
{ // set a new value , that well be pushed to subscribed Bluetoothยฎ Low Energy devices
Serial.println("subscribed");
windSpeedCharacteristic.writeValue(WindLevel);
}
else
{
Serial.println("not subscribed");
}
if (central) // if a central is connected to the peripheral:
{
// while (central.connected()) // while the central is connected:
// {
// long currentMillis = millis();
if(oldWindSpeedLevel != WindLevel)
{
Serial.print("change characteristics from ");Serial.print(oldWindSpeedLevel);Serial.print(" to ");Serial.println(WindLevel);
windSpeedCharacteristic.writeValue(WindLevel);
}
// }
oldWindSpeedLevel = WindLevel;
delay(500);
if(WindLevel)
{
Serial.print("wait ");Serial.print(pauseAfterWindMeasure/1000);Serial.println(" seconds");
delay (pauseAfterWindMeasure);
}
}
}
bool readAnemometer()
{
int newState = LOW;
int oldState = LOW;
int windCounter = 0;
bool WindSpeedLevel = LOW; // or HIGH
unsigned long endTime = millis() + (mds * 1000);
while (endTime > millis() ) // Anemometer mds-Sekunden abfragen
{
newState = digitalRead(pinReedSensor);
if(oldState == LOW && newState == HIGH) // Bei jeder Umdrehung wird newState auf HIGH gesetzt, wenn der REED-Sensor aktiviert wird.
{ windCounter++; }
// Serial.print(endTime);Serial.print(" - ");Serial.print(millis()); Serial.print(" newState = ");Serial.print(newState); Serial.print(" oldState = ");Serial.print(oldState); Serial.print(" WindCounter = "); Serial.println(windCounter);
oldState = newState;
}
WindSpeedLevel = windCounter > (mts * mds);
Serial.print(checkWindCounter); Serial.print(") Wind Speed is ");Serial.println(iif(WindSpeedLevel,"HIGH","LOW"));
if(WindSpeedLevel) // Wenn zuviel Wind - max erlaubte Umdrehungen pro Sekunde * Messdauer
{
checkWindCounter = 0;
}
else
{
checkWindCounter++;
}
return WindSpeedLevel;
}
String iif(bool check, String rString1, String rString2)
{
String rValue = rString2;
if (check)
{
rValue = rString1;
}
return rValue;
}
void blePeripheralConnectHandler( BLEDevice central )
{
digitalWrite( LED_BUILTIN, HIGH );
Serial.print( F ( "Connected to central: " ) );
Serial.println( central.address() );
}
void blePeripheralDisconnectHandler( BLEDevice central )
{
digitalWrite( LED_BUILTIN, LOW );
Serial.print( F( "Disconnected from central: " ) );
Serial.println( central.address() );
}
void setupBLE_Environment()
{
/*โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 1. Bluetooth starten โ
โ 2. Bluetooth konfigurieren โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ*/
// begin initialization
while (!BLE.begin()) {
// Serial.println("starting BLE failed!");
digitalWrite(LED_BUILTIN,HIGH);
delay(200);
digitalWrite(LED_BUILTIN,LOW);
// while (1);
}
BLE.setLocalName("Anemometer");
BLE.setDeviceName("Anemometer");
BLE.setAdvertisedService(environmentalService); // add the service UUID
environmentalService.addCharacteristic(windSpeedCharacteristic); // add the Windlevel characteristic
// windSpeedCharacteristic.addDescriptor(Descriptor);
// BLE_Characeristics_UUDI_TrueWindSpeed.addDescriptor(Descriptor); // siehe Link (*1)
// echoService.addCharacteristic(charac);
BLE.addService(environmentalService); // Add the Enviromental service
// set BLE event handlers
BLE.setEventHandler( BLEConnected, blePeripheralConnectHandler );
BLE.setEventHandler( BLEDisconnected, blePeripheralDisconnectHandler );
windSpeedCharacteristic.writeValue(oldWindSpeedLevel); // set initial value for this characteristic
BLE.advertise(); // start advertising
Serial.println("Bluetoothยฎ device active, waiting for connections...");
}
Code for the central device
// Code for central device
#include <Arduino.h>
#include "Arduino_BMI270_BMM150.h" // Modul fรผr Gyro laden
#include <ArduinoBLE.h> // Bluetooth-Modul laden
// โโโโโ BlueTooth โโโโโโโโโโโโโโโโโโโโโโโโโ
const char* BLE_Service_UUID_TrueWindSpeed = "181a"; // Service - Environmental Sensing Service
const char* BLE_Characeristics_UUDI_TrueWindSpeed = "2a70"; // Characteristics - True Wind Speed
byte oldCommand = 0;
// โโโโโ Photoresistor Pins โโโโโโโโโโโโโโโโโโโโโโโโโ
int pinServoToSouth = 4; // gelb zu gelb
int pinLdrSouth = A0;
int pinServoToNorth = 5; // braun zu braun
int pinLdrNorth = A1;
int pinServoToWest = 6; // orange zu gelb
int pinLdrWest = A2;
int pinServoToEast = 7; // grau zu grรผn
int pinLdrEast = A3;
int minLDR_Lux = 5; // minum Licht das auf LDR fรคllt
int maxError = 40; // ein gerade Zahl > 2 verwenden
int maxEndStopLoop = 400; // Anzahl Loops
//Difference between the opposite photoresistors
int lastNorthSouth_error = 0;
int lastWestEast_error = 0;
int eStopCounterNS = 0;
int eStopCounterWE = 0;
int x = 0; // temporarly defined
// โโโโโ Acceleration Sensor โโโโโโโโโโโโโโโโโโโโโโโโโ
// float x, y, z;
int degreesX = 0;
int degreesY = 0;
int accelerationX = 0;
int accelerationY = 0;
int xAxis = 0; // fรผr Array
int yAxis = 1; // fรผr Array
int zAxis = 2; // fรผr Array
int accelerationValue[2] = {0,0};
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
int dirPin = pinServoToSouth; // Vorbelegen, damit im WHILE-Loop alles funktioniert
int initDirPin = pinServoToSouth;
bool hitEndStopWE = false;
bool hitEndStopNS = false;
void movePanel(int &r_Pin_A, int &r_Pin_B, bool &r_HitEndStop, int &r_LastDirError, int &r_Pin_Up, int &r_Pin_Down,int &r_eStopCounter, String axis);
int iif(bool booleanValue,int returnValue1, int returnValue2);
int getLDR_Div(int pin_a, int pin_b, String Txta);
void debug(String moveDirection,int ldrDiff);
void printV_Error(int west_LDR, int east_LDR, int error);
void moveToHorizontalPos(String geoPos ,String reason);
void readAcc(int *lAccelerationValue);
void connectToCentral();
void connectToPeripheral();
void controlPeripheral(BLEDevice peripheral);
int gestureDetectection() ;
void writeGesture(int gesture) ;
void getDataPeripheral(BLEDevice peripheral);
void setup()
{
Serial.begin(9600);
if (!BLE.begin())
{
Serial.println("* Starting Bluetoothยฎ Low Energy module failed!");
while (1);
}
else
{
Serial.println("* Starting Bluetoothยฎ");
}
if (!IMU.begin()) // Lagesensor initialisieren
{
Serial.println("Failed to initialize IMU!");
while (1);
}
BLE.setLocalName("Nano 33 BLE (Central)");
BLE.setDeviceName("Arduino Central");
Serial.println("Arduino Nano 33 BLE Sense (Central Device)");
BLE.scanForUuid(BLE_Service_UUID_TrueWindSpeed);
// BLE.scan(); // scan for all devices
BLEUnsignedCharCharacteristic windSpeedCharacteristic(BLE_Characeristics_UUDI_TrueWindSpeed, BLERead | BLENotify); // remote clients will be able to get notifications if this characteristic changes
pinMode(pinServoToWest, OUTPUT);
pinMode(pinServoToEast, OUTPUT);
pinMode(pinServoToSouth, OUTPUT);
pinMode(pinServoToNorth, OUTPUT);
}
void loop()
{
Serial.print(timeSinceStart());Serial.print(" ");
Serial.println("* starting ");
connectToPeripheral();
}
void connectToPeripheral()
{
BLEDevice peripheral;
// Serial.print(x++);
int loopCounter = 0;
do
{
BLE.scanForUuid(BLE_Service_UUID_TrueWindSpeed); // start scanning for peripherals
peripheral = BLE.available();
delay(50);
Serial.print("~");Serial.print(peripheral);Serial.print("");
} while (!peripheral && (loopCounter++ < 100));
if (peripheral)
{
// discovered a peripheral, print out address, local name, and advertised service
Serial.println();
Serial.print("Found ");
Serial.print(peripheral.address());
Serial.print(" '");
Serial.print(peripheral.localName());
Serial.print("' Characteristics Count = ");
Serial.print(peripheral.characteristicCount());
Serial.print(" ");
Serial.print(peripheral.advertisedServiceUuid());
Serial.println();
BLE.stopScan(); // stop scanning
getDataPeripheral(peripheral);
}
}
void getDataPeripheral(BLEDevice peripheral) {
if (peripheral.connect()) {
Serial.println("Connected");
} else {
Serial.println("Failed to connect!");
return;
}
// discover peripheral attributes
Serial.println("Discovering attributes ...");
if (peripheral.discoverAttributes()) {
Serial.println("Attributes discovered");
} else {
Serial.println("Attribute discovery failed!");
peripheral.disconnect();
return;
}
BLECharacteristic windCharacteristic = peripheral.characteristic(BLE_Characeristics_UUDI_TrueWindSpeed);
if(windCharacteristic.subscribe())
Serial.println("โ โ โ โ Subscribed โ โ โ โ ");
Serial.print(BLE_Characeristics_UUDI_TrueWindSpeed);Serial.print("` ... ");
if (!windCharacteristic)
{
Serial.println("no Wind characteristic found!");
peripheral.disconnect();
return;
} else if (!windCharacteristic.canSubscribe()) {
Serial.println("Wind characteristic is not subscribable!");
peripheral.disconnect();
return;
} else if (!windCharacteristic.subscribe()) {
Serial.println("subscription failed!");
peripheral.disconnect();
return;
} else {
Serial.println("Subscribed");
}
while (peripheral.connected()) { // while the peripheral is connected
if (windCharacteristic.valueUpdated()) { // check if the value of the gesture characteristic has been updated
byte command;
windCharacteristic.readValue(command);
if (oldCommand == command)
{
continue;
}
oldCommand = command;
Serial.print(":");
continue;
}
peripheral.disconnect();
delay(50);
}
}
I've modifyed the code, to get some output in the Terminal.
The central-device reports often "Attribute discovery failed!"
As you can see in the attached output at arround 0:41 Seconds the "Attributes discovered" and the subscription was established. But in the next loop right after it could not found "Attribute".
After a few minutes (~10 Minutes), the central device can't find the peripheral device anymore.
Output from peripheral-device
--- Terminal on COM23 | 9600 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
2) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:16 advertise 3) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:21 Disconnected from central: 86:32:11:35:ad:2b
advertise 4) Wind Speed is LOW
Connected to central: 86:32:11:35:ad:2b
windSpeedCharacteristic is not subscribed
0:27 advertise 5) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:32 Disconnected from central: 86:32:11:35:ad:2b
Connected to central: 86:32:11:35:ad:2b
advertise 6) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:38 Disconnected from central: 86:32:11:35:ad:2b
Connected to central: 86:32:11:35:ad:2b
advertise 7) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:43 Disconnected from central: 86:32:11:35:ad:2b
Connected to central: 86:32:11:35:ad:2b
Disconnected from central: 86:32:11:35:ad:2b
Connected to central: 86:32:11:35:ad:2b
advertise 8) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:50 Disconnected from central: 86:32:11:35:ad:2b
advertise 9) Wind Speed is LOW
Connected to central: 86:32:11:35:ad:2b
windSpeedCharacteristic is not subscribed
0:56 advertise 10) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
1:01 advertise 11) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
1:07 advertise 12) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
1:12 Disconnected from central: 86:32:11:35:ad:2b
Connected to central: 86:32:11:35:ad:2b
advertise 13) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
1:18 advertise 14) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
1:23 Disconnected from central: 86:32:11:35:ad:2b
Connected to central: 86:32:11:35:ad:2b
Disconnected from central: 86:32:11:35:ad:2b
advertise 15) Wind Speed is LOW
Connected to central: 86:32:11:35:ad:2b
windSpeedCharacteristic is not subscribed
1:30 advertise 16) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
1:35 Disconnected from central: 86:32:11:35:ad:2b
Connected to central: 86:32:11:35:ad:2b
advertise 17) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
1:41 Disconnected from central: 86:32:11:35:ad:2b
advertise 18) Wind Speed is LOW
Connected to central: 86:32:11:35:ad:2b
:
:
10:29 advertise 112) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
10:34 Disconnected from central: 86:32:11:35:ad:2b
advertise 113) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
10:40 advertise 114) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
10:45 advertise 115) Wind Speed is LOW
Connected to central: 86:32:11:35:ad:2b
Disconnected from central: 86:32:11:35:ad:2b
windSpeedCharacteristic is not subscribed
10:51 advertise 116) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
10:56 advertise 117) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
11:02 advertise 118) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
11:07 advertise 119) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
11:13 advertise 120) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
11:18 advertise 121) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
Output from central-device
Output from peripheral-device
It looks like you have attributed the outputs to the wrong device.
My suggestion is to get the peripheral device sending the windspeed working in a solid fashion with a BLE app on a phone like LightBlue or nrfConnect before implementing custom central code on another Nano 33 BLE.
Thanks for your reply.
You are right. I've updated the description.
I've installed nRF Connect on my iPad. When I open the app and connect the peripheral-device (Anemometer) and press the subscription button, the peripheral-device shows that it's subscribed to the windSpeedCharacteristic. Then I turn on the fan to rotate the anemometer. On nRF the value "True Wind Speed" changes from 0 to 1 and back to 0 if I turn off the fan. It seems to work.
Here are the ouput on the peripheral-device terminal.
0:30 advertise 6) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:35 advertise 7) Wind Speed is LOW
Connected to central: 4e:82:5b:42:2b:4a
windSpeedCharacteristic is not subscribed
0:40 advertise 8) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:46 advertise 9) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:52 advertise 10) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:57 advertise 11) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
1:03 advertise 12) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
1:08 advertise 13) Wind Speed is LOW
windSpeedCharacteristic is subscribed
1:14 advertise 14) Wind Speed is LOW
windSpeedCharacteristic is subscribed
1:19 advertise 15) Wind Speed is LOW
windSpeedCharacteristic is subscribed
1:25 advertise 16) Wind Speed is LOW
windSpeedCharacteristic is subscribed
1:30 advertise 17) Wind Speed is LOW
windSpeedCharacteristic is subscribed
1:36 advertise 18) Wind Speed is HIGH
windSpeedCharacteristic is subscribed
change characteristics from 0 to 1
wait 30 seconds
2:11 advertise 0) Wind Speed is HIGH
windSpeedCharacteristic is subscribed
wait 30 seconds
2:47 advertise 0) Wind Speed is LOW
windSpeedCharacteristic is subscribed
change characteristics from 1 to 0
2:53 advertise 1) Wind Speed is LOW
windSpeedCharacteristic is subscribed
2:58 advertise 2) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
3:04 advertise 3) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
Yes. The output is as expected, although I'm not clear about what is printing the word "advertise" before the checkWindCounter value. Is it part of the missing function timeSinceStart( )?
I'm not clear about the switch from subscribed to not subscribed as the end off the print out
2:53 advertise 1) Wind Speed is LOW
windSpeedCharacteristic is subscribed
2:58 advertise 2) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
3:04 advertise 3) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
With the code looking good on the peripheral side, you can concentrate on the Central. I would recommend removing all the IMU and other things from the central code until you have the BLE connection working. Can you please post some simplified central code.
I'm not certain you want to be disconnecting the peripheral in this block after an updated reading
while (peripheral.connected()) { // while the peripheral is connected
if (windCharacteristic.valueUpdated()) { // check if the value of the gesture characteristic has been updated
byte command;
windCharacteristic.readValue(command);
if (oldCommand == command)
{
continue;
}
oldCommand = command;
Serial.print(":");
continue;
}
peripheral.disconnect();
delay(50);
}
I'll try and get a pair of Nano 33 BLE's set up to match your environment.
I got a "windSpeedCharacteristic is not subscribed" message because I closed the app on the iPad.
Later on, the second central Nano should also get the data from the peripheral device. I think the first Nano has to be disconnected before the second one can connect, but I could be wrong.
I'll clean up the central code and will then post it.
I've removed all the unnecessary code and added some Serial.print statements to make the terminal output easier to read.
I tested it with the Arduino (central device), but it didn't work. It loops after Line 117
} else {
Serial.println(" โโโโโโฃSubscribedโ โโโโโ");
}
while (peripheral) { // while the peripheral is connected
if (windCharacteristic.valueUpdated()) { // check if the value of the gesture characteristic has been updated
because there is no peripheral available.
Then I also tested with "nRF Connect" and this test was successful. Below you'll find the output from the terminal with additional comments.
Peripheral device code
#include <Arduino.h>
#include <ArduinoBLE.h>
const char* BLE_Service_UUID_TrueWindSpeed = "181a"; // Service - Environmental Sensing Service
const char* BLE_Characteristics_UUDI_TrueWindSpeed = "2a70"; // Characteristics - True Wind Speed
BLEService environmentalService(BLE_Service_UUID_TrueWindSpeed); // Bluetoothยฎ Low Energy Binary Sensor Service
BLEBoolCharacteristic windSpeedCharacteristic(BLE_Characteristics_UUDI_TrueWindSpeed, BLERead | BLENotify); // GATT
// BLEDescriptor Descriptor("beca6057-955c-4f8a-e1e3-56a1633f04b1","Descriptor");
bool oldWindSpeedLevel = 0; // last Wind Speed level reading from Anemometer
long previousMillis = 0; // last Wind Speed level was checked in before x millis
int checkWindCounter = 0;
const int mds = 5; // measure duration in seconds
const float mts = 2.5; // max Anemometer turns per second
int pauseAfterWindMeasure = 30 * 1000; // Pause after wind measurement in millis (sec * 1000 = msec)
const int pinReedSensor = 8 ; // REED Sensorport (Anemometer)
//โโโโโ Function declarations โโโโโ
// void updateWindLevel();
bool readAnemometer();
String iif(bool check, String rString1, String rString2);
void blePeripheralConnectHandler( BLEDevice central );
void blePeripheralDisconnectHandler( BLEDevice central );
void setupBLE_Environment(); // Setup Bluetooth Environment
String timeSinceStart()
{
char text[20];
unsigned int secondsSinceStart = millis()/1000;
// Serial.println("currentMillis");Serial.println(secondsSinceStart);
unsigned int seconds = secondsSinceStart % 60;
unsigned int minutes = (secondsSinceStart - seconds) / 60;
sprintf(text, "%d:%02d", minutes,seconds);
return text;
}
void setup() {
Serial.begin(9600); // initialize serial communication
// while (!Serial);
pinMode(LED_BUILTIN, OUTPUT); // initialize the built-in LED pin to indicate when a central is connected
pinMode(pinReedSensor, INPUT_PULLDOWN);
setupBLE_Environment();
}
void loop()
{
Serial.print(timeSinceStart());Serial.print(" ");
BLE.advertise(); Serial.print("advertise "); // start advertising nochmals
bool WindLevel = readAnemometer();
BLEDevice central = BLE.central(); // wait for a Bluetoothยฎ Low Energy central
Serial.print(" windSpeedCharacteristic is ");
if (windSpeedCharacteristic.subscribed())
{ // set a new value , that well be pushed to subscribed Bluetoothยฎ Low Energy devices
Serial.println(" SUBSCRIBED");
windSpeedCharacteristic.writeValue(WindLevel);
}
else
{
Serial.println("not subscribed");
}
if (central) // if a central is connected to the peripheral:
{
// while (central.connected()) // while the central is connected:
// {
// long currentMillis = millis();
if(oldWindSpeedLevel != WindLevel)
{
Serial.print("change characteristics from ");Serial.print(oldWindSpeedLevel);Serial.print(" to ");Serial.println(WindLevel);
windSpeedCharacteristic.writeValue(WindLevel);
}
// }
oldWindSpeedLevel = WindLevel;
delay(500);
// If WindLevel is HIGH (stormy weather), it'll be HIGH for longer Time
// - Wait some time and then check Wind again.
if(WindLevel)
{
Serial.print("wait ");Serial.print(pauseAfterWindMeasure/1000);Serial.println(" seconds");
delay (pauseAfterWindMeasure);
}
}
}
bool readAnemometer()
{
int newState = LOW;
int oldState = LOW;
int windCounter = 0;
bool WindSpeedLevel = LOW; // or HIGH
unsigned long endTime = millis() + (mds * 1000);
while (endTime > millis() ) // Anemometer mds-Sekunden abfragen
{
newState = digitalRead(pinReedSensor);
if(oldState == LOW && newState == HIGH) // Bei jeder Umdrehung wird newState auf HIGH gesetzt, wenn der REED-Sensor aktiviert wird.
{ windCounter++; }
// Serial.print(endTime);Serial.print(" - ");Serial.print(millis()); Serial.print(" newState = ");Serial.print(newState); Serial.print(" oldState = ");Serial.print(oldState); Serial.print(" WindCounter = "); Serial.println(windCounter);
oldState = newState;
}
WindSpeedLevel = windCounter > (mts * mds);
Serial.print(checkWindCounter); Serial.print(") Wind Speed is ");Serial.println(iif(WindSpeedLevel,"HIGH","LOW"));
if(WindSpeedLevel) // Wenn zuviel Wind - max erlaubte Umdrehungen pro Sekunde * Messdauer
{
checkWindCounter = 0;
}
else
{
checkWindCounter++;
}
return WindSpeedLevel;
}
String iif(bool check, String rString1, String rString2)
{
String rValue = rString2;
if (check)
{
rValue = rString1;
}
return rValue;
}
void blePeripheralConnectHandler( BLEDevice central )
{
// digitalWrite( LED_BUILTIN, HIGH );
digitalWrite(LEDB,HIGH);
Serial.print( F ( "Connected to central: " ) );
Serial.println( central.address() );
}
void blePeripheralDisconnectHandler( BLEDevice central )
{
// digitalWrite( LED_BUILTIN, LOW );
digitalWrite(LEDB,LOW);
Serial.print( F( "Disconnected from central: " ) );
Serial.println( central.address() );
}
void setupBLE_Environment()
{
/*โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 1. Bluetooth starten โ
โ 2. Bluetooth konfigurieren โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ*/
// begin initialization
while (!BLE.begin()) {
// Serial.println("starting BLE failed!");
digitalWrite(LED_BUILTIN,HIGH);
delay(200);
digitalWrite(LED_BUILTIN,LOW);
// while (1);
}
/* Set a local name for the Bluetoothยฎ Low Energy device
This name will appear in advertising packets
and can be used by remote devices to identify this Bluetoothยฎ Low Energy device
The name can be changed but maybe be truncated based on space left in advertisement packet
*/
BLE.setLocalName("Anemometer");
BLE.setDeviceName("Anemometer");
BLE.setAdvertisedService(environmentalService); // add the service UUID
environmentalService.addCharacteristic(windSpeedCharacteristic); // add the Windlevel characteristic
// windSpeedCharacteristic.addDescriptor(Descriptor);
// BLE_Characteristics_UUDI_TrueWindSpeed.addDescriptor(Descriptor); // siehe Link (*1)
// echoService.addCharacteristic(charac);
BLE.addService(environmentalService); // Add the Enviromental service
// set BLE event handlers
BLE.setEventHandler( BLEConnected, blePeripheralConnectHandler );
BLE.setEventHandler( BLEDisconnected, blePeripheralDisconnectHandler );
windSpeedCharacteristic.writeValue(oldWindSpeedLevel); // set initial value for this characteristic
/*
* Start advertising Bluetoothยฎ Low Energy.
* It will start continuously transmitting Bluetoothยฎ Low Energy
* advertising packets and will be visible to remote Bluetoothยฎ Low Energy central devices
* until it receives a new connection
*/
BLE.advertise(); // start advertising
Serial.println("Bluetoothยฎ device active, waiting for connections...");
}
Central device code
#include <Arduino.h>
#include <ArduinoBLE.h> // Bluetooth-Library laden
// โโโโโ BlueTooth โโโโโโโโโโโโโโโโโโโโโโโโโ
const char* BLE_Service_UUID_TrueWindSpeed = "181a"; // Service - Environmental Sensing Service
const char* BLE_Characteristics_UUDI_TrueWindSpeed = "2a70"; // Characteristics - True Wind Speed
byte oldCommand = 0;
String iif(bool check, String rString1, String rString2);
void connectToPeripheral();
void getPeripheralData(BLEDevice peripheral);
String timeSinceStart(); // Create Timestring min:Sec (only for debugging)
void setup()
{
Serial.begin(9600); // Kommunikation mit Serial Interface starten
if (!BLE.begin()) { // Bluetooth initialisieren
Serial.println("* Starting Bluetoothยฎ Low Energy module failed!");
while (1);
} else {
Serial.println("* Starting Bluetoothยฎ");
}
BLE.setLocalName("Nano 33 BLE (Central)");
BLE.setDeviceName("Arduino Central");
Serial.println("Arduino Nano 33 BLE Sense (Central Device)");
BLE.scanForUuid(BLE_Service_UUID_TrueWindSpeed);
BLEUnsignedCharCharacteristic windSpeedCharacteristic(BLE_Characteristics_UUDI_TrueWindSpeed, BLERead | BLENotify); // remote clients will be able to get notifications if this characteristic changes
}
void loop() {
Serial.print(timeSinceStart());Serial.print(" ");
Serial.println("* starting ");
connectToPeripheral();
}
// โโโโโโโโ function connectToPeripheral() โโโโโโโโ
void connectToPeripheral() {
Serial.println("โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ");
BLEDevice peripheral;
int loopCounter = 0;
do {
loopCounter++;
BLE.scanForUuid(BLE_Service_UUID_TrueWindSpeed); // start scanning for peripherals
peripheral = BLE.available();
delay(50);
} while (!peripheral && (loopCounter < 100));
if(peripheral) {
Serial.print("+ + + + + + ");Serial.print(loopCounter);Serial.println(iif(loopCounter == 1," try"," tries") + " to find Peripheral");
} else {
Serial.print("โ โ โ โ โ โ Peripheral not found after ");Serial.print(loopCounter);Serial.println(iif(loopCounter == 1," try"," tries "));
}
if (peripheral) {
// discovered a peripheral, print out address, local name, and advertised service
Serial.println();
Serial.print("Found ");
Serial.print(peripheral.address());
Serial.print(" '");
Serial.print(peripheral.localName());
Serial.print("' Characteristics Count = ");
Serial.print(peripheral.characteristicCount());
Serial.print(" ");
Serial.print(peripheral.advertisedServiceUuid());
Serial.println();
BLE.stopScan(); // stop scanning
getPeripheralData(peripheral);
}
}
// โโโโโโโโ function getPeripheralData() โโโโโโโโ
void getPeripheralData(BLEDevice peripheral) {
if (peripheral.connect()) {
Serial.println("+ + + + + + Connected");
} else {
Serial.println("โ โ โ โ โ โ Failed to connect! ");
return;
}
// discover peripheral attributes
Serial.println("Discovering attributes ...");
if (peripheral.discoverAttributes()) {
Serial.println("+ + + + + + Attributes discovered");
} else {
Serial.println("โ โ โ โ โ โ Attribute discovery failed!");
peripheral.disconnect();
return;
}
BLECharacteristic windCharacteristic = peripheral.characteristic(BLE_Characteristics_UUDI_TrueWindSpeed);
// if(windCharacteristic.subscribe())
// Serial.println("โ โ โ โ Subscribed โ โ โ โ ");
Serial.print("Characteristics ");Serial.print(BLE_Characteristics_UUDI_TrueWindSpeed);Serial.print("` ... ");
if (!windCharacteristic) {
Serial.println("no Wind characteristic found!");
peripheral.disconnect();
return;
} else if (!windCharacteristic.canSubscribe()) {
Serial.println("Wind characteristic is not subscribable!");
peripheral.disconnect();
return;
} else if (!windCharacteristic.subscribe()) {
Serial.println("subscription failed!");
peripheral.disconnect();
return;
} else {
Serial.println(" โโโโโโฃSubscribedโ โโโโโ");
}
while (peripheral) { // while the peripheral is connected
if (windCharacteristic.valueUpdated()) { // check if the value of the gesture characteristic has been updated
byte command;
windCharacteristic.readValue(command);
if (oldCommand == command) {
continue;
}
oldCommand = command;
Serial.print(":");
continue;
}
Serial.print(" no way out ");
peripheral.disconnect();
delay(50);
}
}
// โโโโโโโโ function iif() โโโโโโโโ
String iif(bool check, String rString1, String rString2) {
String rValue = rString2;
if (check) {
rValue = rString1;
}
return rValue;
}
// โโโโโโโโ function timeSinceStart() โโโโโโโโ
String timeSinceStart() {
char text[20];
unsigned int secondsSinceStart = millis()/1000;
// Serial.println("currentMillis");Serial.println(secondsSinceStart);
unsigned int seconds = secondsSinceStart % 60;
unsigned int minutes = (secondsSinceStart - seconds) / 60;
sprintf(text, "%d:%02d", minutes,seconds);
return text;
}
Test with nRF Connect - Terminal output from peripheral device.
--- Terminal on COM23 | 9600 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
0) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:05 advertise 1) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:10 advertise 2) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:15 advertise 3) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
======> Here I have the "nRF Connect" APP started
0:20 advertise 4) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:25 advertise 5) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:30 advertise 6) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
======> In the APP [Connect] button pressed
0:35 advertise 7) Wind Speed is LOW
Connected to central: 63:95:b9:2f:5b:29
windSpeedCharacteristic is not subscribed
0:41 advertise 8) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:46 advertise 9) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:52 advertise 10) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
0:57 advertise 11) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
======> In the APP [subscribe] button pressed (Arrow with underline)
1:03 advertise 12) Wind Speed is LOW
windSpeedCharacteristic is SUBSCRIBED
1:08 advertise 13) Wind Speed is LOW
windSpeedCharacteristic is SUBSCRIBED
1:14 advertise 14) Wind Speed is LOW
windSpeedCharacteristic is SUBSCRIBED
1:19 advertise 15) Wind Speed is LOW
windSpeedCharacteristic is SUBSCRIBED
======> Fan started
1:25 advertise 16) Wind Speed is LOW
windSpeedCharacteristic is SUBSCRIBED
1:30 advertise 17) Wind Speed is HIGH
windSpeedCharacteristic is SUBSCRIBED
change characteristics from 0 to 1
wait 30 seconds
2:06 advertise 0) Wind Speed is HIGH
windSpeedCharacteristic is SUBSCRIBED
wait 30 seconds
======> Fan stopped
2:42 advertise 0) Wind Speed is LOW
windSpeedCharacteristic is SUBSCRIBED
change characteristics from 1 to 0
2:47 advertise 1) Wind Speed is LOW
windSpeedCharacteristic is SUBSCRIBED
======> to unsubscribe, in the APP [subscribe] button pressed
2:53 advertise 2) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
2:58 advertise 3) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
3:04 advertise 4) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
======> APP closed
3:09 advertise 5) Wind Speed is LOW
Disconnected from central: 63:95:b9:2f:5b:29
windSpeedCharacteristic is not subscribed
3:14 advertise 6) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
3:19 advertise 7) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
3:24 advertise 8) Wind Speed is LOW
windSpeedCharacteristic is not subscribed
Test central device - Terminal output on the central
--- Terminal on COM7 | 9600 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
โ โ โ โ โ โ Attribute discovery failed!
0:09 * starting
โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ + + + + + 2 tries to find Peripheral
Found d8:3f:78:15:d5:64 'Anemometer' Characteristics Count = 0 181a
+ + + + + + Connected
Discovering attributes ...
โ โ โ โ โ โ Attribute discovery failed!
0:25 * starting
โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ + + + + + 2 tries to find Peripheral
Found d8:3f:78:15:d5:64 'Anemometer' Characteristics Count = 0 181a
+ + + + + + Connected
Discovering attributes ...
โ โ โ โ โ โ Attribute discovery failed!
0:36 * starting
โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ + + + + + 2 tries to find Peripheral
Found d8:3f:78:15:d5:64 'Anemometer' Characteristics Count = 0 181a
+ + + + + + Connected
Discovering attributes ...
โ โ โ โ โ โ Attribute discovery failed!
0:47 * starting
โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ + + + + + 2 tries to find Peripheral
Found d8:3f:78:15:d5:64 'Anemometer' Characteristics Count = 0 181a
+ + + + + + Connected
Discovering attributes ...
โ โ โ โ โ โ Attribute discovery failed!
0:53 * starting
โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ + + + + + 2 tries to find Peripheral
Found d8:3f:78:15:d5:64 'Anemometer' Characteristics Count = 0 181a
+ + + + + + Connected
Discovering attributes ...
+ + + + + + Attributes discovered
Characteristics 2a70` ... โโโโโโฃSubscribedโ โโโโโ
no way out no way out no way out no way out no way out no way out no way out no way out no way out no way out no way out no way out no way out no way out no way
out no way out
I figured out, if I remove "if (windCharacteristic.valueUpdated()"
while (peripheral1) { // while the peripheral is connected
// if (windCharacteristic.valueUpdated()) { // check if the value of the gesture characteristic has been updated
byte command;
Serial.println();Serial.print(timeSinceStart());Serial.print(" readValue ");
windCharacteristic.readValue(command);
if (oldCommand == command) {
continue;
}
oldCommand = command;
Serial.print(":");Serial.println(command);
continue;
// }
peripheral1.disconnect();
delay(50);
}
the readValue() does its job and give me the changed value back.
But this could not be the sollution at all.
I have to investigate more.
These two pieces of code seem to play well together. I've added some additional printouts to help see what's going on when the old command == command in the Central. I've managed to have my phone and the Nano33BLE central connected to the peripheral at the same time, so I don't think you will have an issue with that part of the project.
Peripheral Sketch
#include <Arduino.h>
#include <ArduinoBLE.h>
const char* BLE_Service_UUID_TrueWindSpeed = "181a"; // Service - Environmental Sensing Service
const char* BLE_Characteristics_UUDI_TrueWindSpeed = "2a70"; // Characteristics - True Wind Speed
BLEService environmentalService(BLE_Service_UUID_TrueWindSpeed); // Bluetoothยฎ Low Energy Binary Sensor Service
BLEBoolCharacteristic windSpeedCharacteristic(BLE_Characteristics_UUDI_TrueWindSpeed, BLERead | BLENotify); // GATT
// BLEDescriptor Descriptor("beca6057-955c-4f8a-e1e3-56a1633f04b1","Descriptor");
bool oldWindSpeedLevel = 0; // last Wind Speed level reading from Anemometer
long previousMillis = 0; // last Wind Speed level was checked in before x millis
int checkWindCounter = 0;
const int mds = 5; // measure duration in seconds
const float mts = 2.5; // max Anemometer turns per second
int pauseAfterWindMeasure = 30 * 1000; // Pause after wind measurement in millis (sec * 1000 = msec)
const int pinReedSensor = 8 ; // REED Sensorport (Anemometer)
//โโโโโ Function declarations โโโโโ
// void updateWindLevel();
bool readAnemometer();
String iif(bool check, String rString1, String rString2);
void blePeripheralConnectHandler( BLEDevice central );
void blePeripheralDisconnectHandler( BLEDevice central );
void setupBLE_Environment(); // Setup Bluetooth Environment
String timeSinceStart()
{
char text[20];
unsigned int secondsSinceStart = millis()/1000;
// Serial.println("currentMillis");Serial.println(secondsSinceStart);
unsigned int seconds = secondsSinceStart % 60;
unsigned int minutes = (secondsSinceStart - seconds) / 60;
sprintf(text, "%d:%02d", minutes,seconds);
return text;
}
void setup() {
Serial.begin(9600); // initialize serial communication
// while (!Serial);
pinMode(LED_BUILTIN, OUTPUT); // initialize the built-in LED pin to indicate when a central is connected
pinMode(pinReedSensor, INPUT_PULLDOWN);
setupBLE_Environment();
}
void loop()
{
Serial.print(timeSinceStart());Serial.print(" ");
BLE.advertise(); Serial.print("advertise "); // start advertising nochmals
bool WindLevel = readAnemometer();
BLEDevice central = BLE.central(); // wait for a Bluetoothยฎ Low Energy central
Serial.print(" windSpeedCharacteristic is ");
if (windSpeedCharacteristic.subscribed())
{ // set a new value , that well be pushed to subscribed Bluetoothยฎ Low Energy devices
Serial.println(" SUBSCRIBED");
windSpeedCharacteristic.writeValue(WindLevel);
}
else
{
Serial.println("not subscribed");
}
if (central) // if a central is connected to the peripheral:
{
// while (central.connected()) // while the central is connected:
// {
// long currentMillis = millis();
if(oldWindSpeedLevel != WindLevel)
{
Serial.print("change characteristics from ");Serial.print(oldWindSpeedLevel);Serial.print(" to ");Serial.println(WindLevel);
windSpeedCharacteristic.writeValue(WindLevel);
}
// }
oldWindSpeedLevel = WindLevel;
delay(500);
// If WindLevel is HIGH (stormy weather), it'll be HIGH for longer Time
// - Wait some time and then check Wind again.
if(WindLevel)
{
Serial.print("wait ");Serial.print(pauseAfterWindMeasure/1000);Serial.println(" seconds");
delay (pauseAfterWindMeasure);
}
}
}
bool readAnemometer()
{
int newState = LOW;
int oldState = LOW;
int windCounter = 0;
bool WindSpeedLevel = LOW; // or HIGH
unsigned long endTime = millis() + (mds * 1000);
while (endTime > millis() ) // Anemometer mds-Sekunden abfragen
{
newState = digitalRead(pinReedSensor);
if(oldState == LOW && newState == HIGH) // Bei jeder Umdrehung wird newState auf HIGH gesetzt, wenn der REED-Sensor aktiviert wird.
{ windCounter++; }
// Serial.print(endTime);Serial.print(" - ");Serial.print(millis()); Serial.print(" newState = ");Serial.print(newState); Serial.print(" oldState = ");Serial.print(oldState); Serial.print(" WindCounter = "); Serial.println(windCounter);
oldState = newState;
}
WindSpeedLevel = windCounter > (mts * mds);
Serial.print(checkWindCounter); Serial.print(") Wind Speed is ");Serial.println(iif(WindSpeedLevel,"HIGH","LOW"));
if(WindSpeedLevel) // Wenn zuviel Wind - max erlaubte Umdrehungen pro Sekunde * Messdauer
{
checkWindCounter = 0;
}
else
{
checkWindCounter++;
}
return WindSpeedLevel;
}
String iif(bool check, String rString1, String rString2)
{
String rValue = rString2;
if (check)
{
rValue = rString1;
}
return rValue;
}
void blePeripheralConnectHandler( BLEDevice central )
{
// digitalWrite( LED_BUILTIN, HIGH );
digitalWrite(LEDB,HIGH);
Serial.print( F ( "Connected to central: " ) );
Serial.println( central.address() );
}
void blePeripheralDisconnectHandler( BLEDevice central )
{
// digitalWrite( LED_BUILTIN, LOW );
digitalWrite(LEDB,LOW);
Serial.print( F( "Disconnected from central: " ) );
Serial.println( central.address() );
}
void setupBLE_Environment()
{
/*โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 1. Bluetooth starten โ
โ 2. Bluetooth konfigurieren โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ*/
// begin initialization
while (!BLE.begin()) {
// Serial.println("starting BLE failed!");
digitalWrite(LED_BUILTIN,HIGH);
delay(200);
digitalWrite(LED_BUILTIN,LOW);
// while (1);
}
/* Set a local name for the Bluetoothยฎ Low Energy device
This name will appear in advertising packets
and can be used by remote devices to identify this Bluetoothยฎ Low Energy device
The name can be changed but maybe be truncated based on space left in advertisement packet
*/
BLE.setLocalName("Anemometer");
BLE.setDeviceName("Anemometer");
BLE.setAdvertisedService(environmentalService); // add the service UUID
environmentalService.addCharacteristic(windSpeedCharacteristic); // add the Windlevel characteristic
// windSpeedCharacteristic.addDescriptor(Descriptor);
// BLE_Characteristics_UUDI_TrueWindSpeed.addDescriptor(Descriptor); // siehe Link (*1)
// echoService.addCharacteristic(charac);
BLE.addService(environmentalService); // Add the Enviromental service
// set BLE event handlers
BLE.setEventHandler( BLEConnected, blePeripheralConnectHandler );
BLE.setEventHandler( BLEDisconnected, blePeripheralDisconnectHandler );
windSpeedCharacteristic.writeValue(oldWindSpeedLevel); // set initial value for this characteristic
/*
* Start advertising Bluetoothยฎ Low Energy.
* It will start continuously transmitting Bluetoothยฎ Low Energy
* advertising packets and will be visible to remote Bluetoothยฎ Low Energy central devices
* until it receives a new connection
*/
BLE.advertise(); // start advertising
Serial.println("Bluetoothยฎ device active, waiting for connections...");
}
Central
#include <Arduino.h>
#include <ArduinoBLE.h> // Bluetooth-Library laden
// โโโโโ BlueTooth โโโโโโโโโโโโโโโโโโโโโโโโโ
const char* BLE_Service_UUID_TrueWindSpeed = "181a"; // Service - Environmental Sensing Service
const char* BLE_Characteristics_UUDI_TrueWindSpeed = "2a70"; // Characteristics - True Wind Speed
byte oldCommand = 0;
String iif(bool check, String rString1, String rString2);
void connectToPeripheral();
void getPeripheralData(BLEDevice peripheral);
String timeSinceStart(); // Create Timestring min:Sec (only for debugging)
void setup()
{
Serial.begin(9600); // Kommunikation mit Serial Interface starten
while (!Serial);
if (!BLE.begin()) { // Bluetooth initialisieren
Serial.println("* Starting Bluetoothยฎ Low Energy module failed!");
while (1);
} else {
Serial.println("* Starting Bluetoothยฎ");
}
BLE.setLocalName("Nano 33 BLE (Central)");
BLE.setDeviceName("Arduino Central");
Serial.println("Arduino Nano 33 BLE Sense (Central Device)");
BLE.scanForUuid(BLE_Service_UUID_TrueWindSpeed);
BLEUnsignedCharCharacteristic windSpeedCharacteristic(BLE_Characteristics_UUDI_TrueWindSpeed, BLERead | BLENotify); // remote clients will be able to get notifications if this characteristic changes
}
void loop() {
Serial.print(timeSinceStart()); Serial.print(" ");
Serial.println("* starting ");
connectToPeripheral();
}
// โโโโโโโโ function connectToPeripheral() โโโโโโโโ
void connectToPeripheral() {
Serial.println("โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ");
BLEDevice peripheral;
int loopCounter = 0;
do {
loopCounter++;
BLE.scanForUuid(BLE_Service_UUID_TrueWindSpeed); // start scanning for peripherals
peripheral = BLE.available();
delay(50);
} while (!peripheral && (loopCounter < 100));
if (peripheral) {
Serial.print("+ + + + + + "); Serial.print(loopCounter); Serial.println(iif(loopCounter == 1, " try", " tries") + " to find Peripheral");
} else {
Serial.print("โ โ โ โ โ โ Peripheral not found after "); Serial.print(loopCounter); Serial.println(iif(loopCounter == 1, " try", " tries "));
}
if (peripheral) {
// discovered a peripheral, print out address, local name, and advertised service
Serial.println();
Serial.print("Found ");
Serial.print(peripheral.address());
Serial.print(" '");
Serial.print(peripheral.localName());
Serial.print("' Characteristics Count = ");
Serial.print(peripheral.characteristicCount());
Serial.print(" ");
Serial.print(peripheral.advertisedServiceUuid());
Serial.println();
BLE.stopScan(); // stop scanning
getPeripheralData(peripheral);
}
}
// โโโโโโโโ function getPeripheralData() โโโโโโโโ
void getPeripheralData(BLEDevice peripheral) {
if (peripheral.connect()) {
Serial.println("+ + + + + + Connected");
} else {
Serial.println("โ โ โ โ โ โ Failed to connect! ");
return;
}
// discover peripheral attributes
Serial.println("Discovering attributes ...");
if (peripheral.discoverAttributes()) {
Serial.println("+ + + + + + Attributes discovered");
} else {
Serial.println("โ โ โ โ โ โ Attribute discovery failed!");
peripheral.disconnect();
return;
}
BLECharacteristic windCharacteristic = peripheral.characteristic(BLE_Characteristics_UUDI_TrueWindSpeed);
if(windCharacteristic.subscribe())
Serial.println("โ โ โ โ Subscribed โ โ โ โ ");
Serial.print("Characteristics "); Serial.print(BLE_Characteristics_UUDI_TrueWindSpeed); Serial.print("` ... ");
if (!windCharacteristic) {
Serial.println("no Wind characteristic found!");
peripheral.disconnect();
return;
} else if (!windCharacteristic.canSubscribe()) {
Serial.println("Wind characteristic is not subscribable!");
peripheral.disconnect();
return;
} else if (!windCharacteristic.subscribe()) {
Serial.println("subscription failed!");
peripheral.disconnect();
return;
} else {
Serial.println(" โโโโโโฃSubscribedโ โโโโโ");
}
while (peripheral) {// while the peripheral is connected
if (windCharacteristic.valueUpdated()) { // check if the value of the gesture characteristic has been updated
byte command;
windCharacteristic.readValue(command);
if (oldCommand == command) {
//continue;
Serial.print(oldCommand);
Serial.print(' ');
static byte sameCnt = 0;
sameCnt++;
if(sameCnt == 10)
{
sameCnt = 0;
Serial.println();
}
}
else
{
Serial.println();
Serial.print("Command Updated New Value: ");
Serial.println(command);
//take actions based on changed command
}
oldCommand = command;
}
delay(50);
}
}
// โโโโโโโโ function iif() โโโโโโโโ
String iif(bool check, String rString1, String rString2) {
String rValue = rString2;
if (check) {
rValue = rString1;
}
return rValue;
}
// โโโโโโโโ function timeSinceStart() โโโโโโโโ
String timeSinceStart() {
char text[20];
unsigned int secondsSinceStart = millis() / 1000;
// Serial.println("currentMillis");Serial.println(secondsSinceStart);
unsigned int seconds = secondsSinceStart % 60;
unsigned int minutes = (secondsSinceStart - seconds) / 60;
sprintf(text, "%d:%02d", minutes, seconds);
return text;
}
It was just the 'continue' command?
Thank you for your help @cattledog.
I uploaded the code and the test was successful.
Now I can try to get out of the "while loop" and put the other stuff for moving the solar panel back into the code.
โโโโโโ> Central device <===== โโโโโโโ> Peripheral device
* Starting Bluetoothยฎ โ
Arduino Nano 33 BLE Sense (Central Device) โ
0:09 * starting โ2) Wind Speed is LOW
โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ โConnected to central: 86:32:11:35:ad:2b
+ + + + + + 1 try to find Peripheral โ windSpeedCharacteristic is not subscribed
โ0:15 advertise 3) Wind Speed is LOW
Found d8:3f:78:15:d5:64 'Anemometer' Characteristics Count = 0 181a โ windSpeedCharacteristic is not subscribed
+ + + + + + Connected โ0:21 advertise 4) Wind Speed is LOW
Discovering attributes ... โ windSpeedCharacteristic is not subscribed
โ โ โ โ โ โ Attribute discovery failed! โ
0:25 * starting โ0:26 Disconnected from central: 86:32:11:35:ad:2b
โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ โConnected to central: 86:32:11:35:ad:2b
+ + + + + + 2 tries to find Peripheral โadvertise 5) Wind Speed is LOW
โ windSpeedCharacteristic is not subscribed
Found d8:3f:78:15:d5:64 'Anemometer' Characteristics Count = 0 181a โ
+ + + + + + Connected โ
Discovering attributes ... โ
โ โ โ โ โ โ Attribute discovery failed! โ
0:31 * starting โ
โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ0:32 Disconnected from central: 86:32:11:35:ad:2b
+ + + + + + 4 tries to find Peripheral โConnected to central: 86:32:11:35:ad:2b
โadvertise 6) Wind Speed is LOW
Found d8:3f:78:15:d5:64 'Anemometer' Characteristics Count = 0 181a โ windSpeedCharacteristic is not subscribed
+ + + + + + Connected โ
Discovering attributes ... โ
โ โ โ โ โ โ Attribute discovery failed! โ
0:36 * starting โ
โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ0:37 Disconnected from central: 86:32:11:35:ad:2b
+ + + + + + 2 tries to find Peripheral โConnected to central: 86:32:11:35:ad:2b
โadvertise 7) Wind Speed is LOW
Found d8:3f:78:15:d5:64 'Anemometer' Characteristics Count = 0 181a โ windSpeedCharacteristic is SUBSCRIBED
+ + + + + + Connected โ0:44 advertise 8) Wind Speed is LOW
Discovering attributes ... โ windSpeedCharacteristic is SUBSCRIBED
+ + + + + + Attributes discovered โ0:49 advertise 9) Wind Speed is LOW
โ โ โ โ Subscribed โ โ โ โ โ windSpeedCharacteristic is SUBSCRIBED
Characteristics 2a70` ... โโโโโโฃSubscribedโ โโโโโ โ0:55 advertise 10) Wind Speed is LOW
0 0 0 0 0 0 0 0 โ windSpeedCharacteristic is SUBSCRIBED
โ1:01 advertise 11) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ1:06 advertise 12) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ1:12 advertise 13) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ1:17 advertise 14) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โโโโโโโโโโโโโโโโโโโโโโ> Fan started <โโโโโโโโโโโโโโโโโโโโโโ
โ1:23 advertise 15) Wind Speed is HIGH
1:27 Command Updated New Value: 1 โ windSpeedCharacteristic is SUBSCRIBED
1 1 โchange characteristics from 0 to 1
โwait 30 seconds
โ1:58 advertise 0) Wind Speed is HIGH
โ windSpeedCharacteristic is SUBSCRIBED
โwait 30 seconds
โ2:34 advertise 0) Wind Speed is HIGH
โ windSpeedCharacteristic is SUBSCRIBED
โโโโโโโโโโโโโโโโโโโโโโ> Fan stoped <โโโโโโโโโโโโโโโโโโโโโโ
โ wait 30 seconds
โ 3:09 advertise 0) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ change characteristics from 1 to 0
3:14 Command Updated New Value: 0 โ 3:15 advertise 1) Wind Speed is LOW
0 0 0 0 0 0 0 0 0 0 โ windSpeedCharacteristic is SUBSCRIBED
โ 3:21 advertise 2) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 3:26 advertise 3) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 3:32 advertise 4) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 3:37 advertise 5) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 3:43 advertise 6) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 3:48 advertise 7) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 3:54 advertise 8) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 3:59 advertise 9) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 4:05 advertise 10) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 4:10 advertise 11) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 4:16 advertise 12) Wind Speed is LOW
โ windSpeedCharacteristic is SUBSCRIBED
โ 4:21 advertise 13) Wind Speed is LOW
Hello
I give up the project I described at the beginning.
After another two weeks of searching, and this day after day, I found no solution. I have only found references that want to connect two peripheral devices to several central devices. I have found similar entries before, but they did not contain a solution that I could use or I don't anderstand it. Some of them didn't even get an answer, which leads me to believe that a solution is not so easy to realise.
As the anemometer is to be powered by batteries or button cells, my intention was to find the most efficient and power-saving solution. I think, if the central devices have periodicaly to reconnect, that's not energy saving.
I probably misunderstood the term "subcribe". I thought I could permanently connect (subscribe) the two solar panels (Arduino Nano 33 BLE) to the anemometer (Arduino Nano 33 IoT or Arduino Nano 33 BLE) and then, when the anemometer reports strong wind via Notify (changing the characteristics value from 0 to 1), react directly to it and move the panels to the horizontal position. The two central devices have the main task of following the sun and aligning the panels, which works well so far.
Thanks for the help.
PS: Sorry, if my description is not clear enough but my native language is german.
After another two weeks of searching, and this day after day, I found no solution.
I'm sorry to hear that you are having difficulties, but I'm not certain that I understand your issues.
In my previous testing I could have two central devices(one phone, one Nano 33 BLE) connected and subscribed to one peripheral. Can you replicate that with two Nano33 BLE centrals?
It's possible that there may be a different architecture which will work better for you than the two subscriptions. You may be able to place the anerometer date in the manufacturer data section of the advertising of the peripheral and extract it in two centrals without the connection and subscription.
As the anemometer is to be powered by batteries or button cells, my intention was to find the most efficient and power-saving solution. I think, if the central devices have periodically to reconnect, that's not energy saving.
BLE is designed for low energy, and battery powered operation. I'm not clear if the power used by the peripheral is dependent upon centrals being connected or not, the energy cost of reconnection by the central, and the data being read by the central after subscription/notification. Have you taken measurements of the current draw of the peripheral under different scenarios. How much is used by advertising? Have you compared notification to just being read periodically?
If you don't use BLE to send the data from the anerometer, is there a different methodology which will work to tell you that you need to level the panels in the wind?
One question I have is do you really need two centrals to control the panel positions? Could one Nano33 BLE do the job?
I naturally had tunnel vision on my intended solution. Thanks for the tip.
I will try to get the data in another way.
One possibility would be to connect just one Arduino Nano 33 BLE to the anemometer and configure the second one to get the data from the first one.
No, I haven't tested that, I once connected it to a power bank, but due to the low power consumption, it switched off after a short time. I had actually planned to test it with batteries when everything is working and then decide about the capacity and size. Perhaps this is a bad idee.
At the moment I haven't think about another solution but perhaps it is possible to establish a connection to HomeMatic and Home Assistant. But I don't know how Homeassistant and BLE work together.
The solar panels are moved into the appropriate position using linear motors. As the motors are not synchronised and they are from different manufacturers, this is not really possible. Even a slight deviation in the power supply changes the speed of the motors. I was able to purchase these motors at a favourable price and so, one of them has as peed from ~5mm/s and another has ~14mm/s.
Here are the result of the test did today:
I switch on the peripheral device.
Then I start the first Nano.
It establishes the connection, then disconnects again, only to re-establish it seconds later, which happens continuously.
Now I start the second Nano.
This also immediately establishes the connection, only to immediately disconnect and re-establish it again.
Both are now in the loop establish / disconnect / establish . . .
In my opinion, this behaviour is caused by the attribute discovery, which fails.
But what is the reason for the attribute discovery failing? I could not figure out what the reason is.
(00:15:00) I connect the iPad with nRF Connect to the peripheral device - The connection has been established, but I do not receive a message on the serial monitor (blePeripheralConnectHandler Connected to central: xx:xx:xx:xx:xx:xx:xx), and the loops described above are no longer present.
(00:21:00) After starting, I switch on subscription on the iPad, which is immediately confirmed with the message "21:06 windSpeedCharacteristic is SUBSCRIBED". - that's OK
(00:23:00) I switch off subscription again - message: "23:07 windSpeedCharacteristic is not subscribed" - that's OK
(00:24:00) I disconnect from the iPad "24:02 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64" - Strange; Why this one? This is the address form peripheral device 1?
(00:27:00) Establishing a connection to the Android phone - No message about a successful connection. Establishing the connection no longer seems to work, as the phone immediately switches back to the Disconnected status.
(00:34:00) Establishing the connection to the iPad - Again, no message that the connection could be established and the iPad cancels the connection establishment.
On a second attempt, the connection was re-established, but here too I no longer receive any indication (from the serial monitor of the peripheral device) of a functioning connection. Subscribe no longer supplies any data.
(00:43:00) Starting Serial Monitor on PC for central device.
--- Terminal on COM9 | 9600 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
โ โ โ โ โ โ Attribute discovery failed!
42:11 * starting
โโโโโโโโโโ connectToPeripheral() โโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ + + + + + 2 tries to find Peripheral
Found d4:d4:da:4e:7b:8e 'Anemometer' Characteristics Count = 0 181a
+ + + + + + Connected
Discovering attributes ...
โ โ โ โ โ โ Attribute discovery failed!
42:22 * starting
:
:
:
This is the output from the peripheral device
--- Terminal on COM26 | 9600 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
0:10 1) Wind Speed is LOW
0:10 windSpeedCharacteristic is not subscribed
0:10 advertise
0:15 2) Wind Speed is LOW
0:15 windSpeedCharacteristic is not subscribed
0:15 advertise
:
: same message as above several times
:
0:56 10) Wind Speed is LOW
0:56 windSpeedCharacteristic is not subscribed
0:56 advertise
1:01 11) Wind Speed is LOW
1:01 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
1:01 windSpeedCharacteristic is not subscribed
1:01 advertise
1:06 12) Wind Speed is LOW
1:06 windSpeedCharacteristic is not subscribed
1:07 advertise
1:07 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
1:12 13) Wind Speed is LOW
1:12 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
1:12 windSpeedCharacteristic is not subscribed
1:12 advertise
1:17 14) Wind Speed is LOW
1:17 windSpeedCharacteristic is not subscribed
1:18 advertise
1:23 15) Wind Speed is LOW
1:23 windSpeedCharacteristic is not subscribed
1:23 advertise
1:28 16) Wind Speed is LOW
1:28 windSpeedCharacteristic is not subscribed
1:29 advertise
1:29 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
1:29 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
1:34 17) Wind Speed is LOW
1:34 windSpeedCharacteristic is not subscribed
1:34 advertise
1:39 18) Wind Speed is LOW
1:39 windSpeedCharacteristic is not subscribed
1:40 advertise
1:40 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
1:40 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
1:45 19) Wind Speed is LOW
1:45 windSpeedCharacteristic is not subscribed
1:45 advertise
1:45 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
1:45 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
1:50 20) Wind Speed is LOW
1:50 windSpeedCharacteristic is not subscribed
1:51 advertise
1:56 21) Wind Speed is LOW
1:56 windSpeedCharacteristic is not subscribed
1:56 advertise
1:56 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
2:01 22) Wind Speed is LOW
2:01 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
2:01 windSpeedCharacteristic is not subscribed
2:02 advertise
2:07 23) Wind Speed is LOW
2:07 windSpeedCharacteristic is not subscribed
2:07 advertise
2:07 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
2:12 24) Wind Speed is LOW
2:12 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
2:12 windSpeedCharacteristic is not subscribed
2:13 advertise
2:18 25) Wind Speed is LOW
2:18 windSpeedCharacteristic is not subscribed
2:18 advertise
2:23 26) Wind Speed is LOW
2:23 windSpeedCharacteristic is not subscribed
2:24 advertise
2:24 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
2:24 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
2:29 27) Wind Speed is LOW
2:29 windSpeedCharacteristic is not subscribed
2:29 advertise
2:34 28) Wind Speed is LOW
2:34 windSpeedCharacteristic is not subscribed
2:35 advertise
2:40 29) Wind Speed is LOW
2:40 windSpeedCharacteristic is not subscribed
2:40 advertise
2:40 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
2:40 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
2:45 30) Wind Speed is LOW
2:45 windSpeedCharacteristic is not subscribed
2:46 advertise
2:46 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
2:46 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
2:51 31) Wind Speed is LOW
2:51 windSpeedCharacteristic is not subscribed
2:51 advertise
2:56 32) Wind Speed is LOW
2:56 windSpeedCharacteristic is not subscribed
2:57 advertise
2:57 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
2:57 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
3:02 33) Wind Speed is LOW
3:02 windSpeedCharacteristic is not subscribed
3:02 advertise
3:02 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
3:02 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
3:07 34) Wind Speed is LOW
3:07 windSpeedCharacteristic is not subscribed
3:08 advertise
3:08 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
3:08 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
3:13 35) Wind Speed is LOW
3:13 windSpeedCharacteristic is not subscribed
3:13 advertise
3:18 36) Wind Speed is LOW
3:18 windSpeedCharacteristic is not subscribed
3:19 advertise
3:24 37) Wind Speed is LOW
3:24 windSpeedCharacteristic is not subscribed
3:24 advertise
3:24 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
3:24 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
3:29 38) Wind Speed is LOW
3:29 windSpeedCharacteristic is not subscribed
3:30 advertise
3:35 39) Wind Speed is LOW
3:35 windSpeedCharacteristic is not subscribed
3:35 advertise
3:35 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
3:40 40) Wind Speed is LOW
3:40 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
3:40 windSpeedCharacteristic is not subscribed
3:41 advertise
3:41 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
3:46 41) Wind Speed is LOW
3:46 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
3:46 windSpeedCharacteristic is not subscribed
3:46 advertise
3:51 42) Wind Speed is LOW
3:51 windSpeedCharacteristic is not subscribed
3:52 advertise
3:57 43) Wind Speed is LOW
3:57 windSpeedCharacteristic is not subscribed
3:57 advertise
3:57 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
3:57 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
4:02 44) Wind Speed is LOW
4:02 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
4:02 windSpeedCharacteristic is not subscribed
4:03 advertise
4:03 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
4:08 45) Wind Speed is LOW
4:08 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
4:08 windSpeedCharacteristic is not subscribed
4:08 advertise
4:08 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
4:13 46) Wind Speed is LOW
4:13 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
4:13 windSpeedCharacteristic is not subscribed
4:14 advertise
4:19 47) Wind Speed is LOW
4:19 windSpeedCharacteristic is not subscribed
4:19 advertise
4:19 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
4:24 48) Wind Speed is LOW
4:24 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
4:24 windSpeedCharacteristic is not subscribed
4:25 advertise
4:30 49) Wind Speed is LOW
4:30 windSpeedCharacteristic is not subscribed
4:30 advertise
4:30 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
4:30 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
4:35 50) Wind Speed is LOW
4:35 windSpeedCharacteristic is not subscribed
4:36 advertise
4:36 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
4:36 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
4:41 51) Wind Speed is LOW
4:41 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
4:41 windSpeedCharacteristic is not subscribed
4:41 advertise
4:46 52) Wind Speed is LOW
4:46 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
4:46 windSpeedCharacteristic is not subscribed
4:47 advertise
4:52 53) Wind Speed is LOW
4:52 windSpeedCharacteristic is not subscribed
4:52 advertise
4:52 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
4:52 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
4:57 54) Wind Speed is LOW
4:57 windSpeedCharacteristic is not subscribed
4:58 advertise
4:58 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
4:58 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
4:58 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
5:03 55) Wind Speed is LOW
5:03 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
5:03 windSpeedCharacteristic is not subscribed
5:03 advertise
5:08 56) Wind Speed is LOW
5:08 windSpeedCharacteristic is not subscribed
5:09 advertise
5:09 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
5:09 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
5:14 57) Wind Speed is LOW
5:14 windSpeedCharacteristic is not subscribed
5:14 advertise
5:14 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
5:14 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
5:19 58) Wind Speed is LOW
5:19 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
5:19 windSpeedCharacteristic is not subscribed
5:20 advertise
5:25 59) Wind Speed is LOW
5:25 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
5:25 windSpeedCharacteristic is not subscribed
5:25 advertise
5:30 60) Wind Speed is LOW
5:30 windSpeedCharacteristic is not subscribed
5:31 advertise
5:31 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
5:31 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
5:31 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
5:36 61) Wind Speed is LOW
5:36 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
5:36 windSpeedCharacteristic is not subscribed
5:36 advertise
5:41 62) Wind Speed is LOW
5:41 windSpeedCharacteristic is not subscribed
5:42 advertise
5:42 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
5:42 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
5:42 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
5:47 63) Wind Speed is LOW
5:47 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
5:47 windSpeedCharacteristic is not subscribed
5:47 advertise
5:52 64) Wind Speed is LOW
5:52 windSpeedCharacteristic is not subscribed
5:53 advertise
5:53 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
5:53 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
5:53 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
5:58 65) Wind Speed is LOW
5:58 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
5:58 windSpeedCharacteristic is not subscribed
5:58 advertise
5:58 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
6:03 66) Wind Speed is LOW
6:03 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
6:03 windSpeedCharacteristic is not subscribed
6:04 advertise
6:04 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
6:09 67) Wind Speed is LOW
6:09 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
6:09 windSpeedCharacteristic is not subscribed
6:09 advertise
6:09 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
6:14 68) Wind Speed is LOW
6:14 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
6:14 windSpeedCharacteristic is not subscribed
6:15 advertise
6:15 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
6:20 69) Wind Speed is LOW
6:20 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
6:20 windSpeedCharacteristic is not subscribed
6:20 advertise
6:25 70) Wind Speed is LOW
6:25 windSpeedCharacteristic is not subscribed
6:26 advertise
6:26 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
6:26 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
6:31 71) Wind Speed is LOW
6:31 windSpeedCharacteristic is not subscribed
6:31 advertise
6:31 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
6:31 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
6:36 72) Wind Speed is LOW
6:36 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
6:36 windSpeedCharacteristic is not subscribed
6:37 advertise
6:42 73) Wind Speed is LOW
6:42 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
6:42 windSpeedCharacteristic is not subscribed
6:42 advertise
6:47 74) Wind Speed is LOW
6:47 windSpeedCharacteristic is not subscribed
6:48 advertise
6:48 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
6:48 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
6:53 75) Wind Speed is LOW
6:53 windSpeedCharacteristic is not subscribed
6:53 advertise
6:53 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
6:53 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
6:53 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
6:53 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
6:58 76) Wind Speed is LOW
6:58 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
6:58 windSpeedCharacteristic is not subscribed
6:59 advertise
7:04 77) Wind Speed is LOW
7:04 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
7:04 windSpeedCharacteristic is not subscribed
7:04 advertise
7:04 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
7:09 78) Wind Speed is LOW
7:09 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
7:09 windSpeedCharacteristic is not subscribed
7:10 advertise
7:15 79) Wind Speed is LOW
7:15 windSpeedCharacteristic is not subscribed
7:15 advertise
7:15 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
7:15 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
7:20 80) Wind Speed is LOW
7:20 windSpeedCharacteristic is not subscribed
7:21 advertise
7:21 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
7:21 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
7:21 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
7:26 81) Wind Speed is LOW
7:26 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
7:26 windSpeedCharacteristic is not subscribed
7:26 advertise
7:26 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
7:31 82) Wind Speed is LOW
7:31 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
7:31 windSpeedCharacteristic is not subscribed
7:32 advertise
7:32 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
7:37 83) Wind Speed is LOW
7:37 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
7:37 windSpeedCharacteristic is not subscribed
7:37 advertise
7:37 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
7:42 84) Wind Speed is LOW
7:42 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
7:42 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
7:42 windSpeedCharacteristic is not subscribed
7:43 advertise
7:43 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
7:48 85) Wind Speed is LOW
7:48 windSpeedCharacteristic is not subscribed
7:48 advertise
7:53 86) Wind Speed is LOW
7:53 windSpeedCharacteristic is not subscribed
7:54 advertise
7:59 87) Wind Speed is LOW
7:59 windSpeedCharacteristic is not subscribed
7:59 advertise
8:04 88) Wind Speed is LOW
8:04 windSpeedCharacteristic is not subscribed
8:05 advertise
8:05 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
8:10 89) Wind Speed is LOW
8:10 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
8:10 windSpeedCharacteristic is not subscribed
8:10 advertise
8:10 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
8:15 90) Wind Speed is LOW
8:15 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
8:15 windSpeedCharacteristic is not subscribed
8:16 advertise
8:21 91) Wind Speed is LOW
8:21 windSpeedCharacteristic is not subscribed
8:21 advertise
8:21 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
8:21 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
8:21 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
8:26 92) Wind Speed is LOW
8:26 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
8:26 windSpeedCharacteristic is not subscribed
8:27 advertise
8:27 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
8:32 93) Wind Speed is LOW
8:32 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
8:32 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
8:32 windSpeedCharacteristic is not subscribed
8:32 advertise
8:32 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
8:37 94) Wind Speed is LOW
8:37 windSpeedCharacteristic is not subscribed
8:38 advertise
8:38 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
8:38 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
8:43 95) Wind Speed is LOW
8:43 windSpeedCharacteristic is not subscribed
8:43 advertise
8:43 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
8:43 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
8:48 96) Wind Speed is LOW
8:48 windSpeedCharacteristic is not subscribed
8:49 advertise
8:54 97) Wind Speed is LOW
8:54 windSpeedCharacteristic is not subscribed
8:54 advertise
8:54 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
8:54 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
8:59 98) Wind Speed is LOW
8:59 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
8:59 windSpeedCharacteristic is not subscribed
9:00 advertise
9:05 99) Wind Speed is LOW
9:05 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
9:05 windSpeedCharacteristic is not subscribed
9:05 advertise
9:10 100) Wind Speed is LOW
9:10 windSpeedCharacteristic is not subscribed
9:11 advertise
9:16 101) Wind Speed is LOW
9:16 windSpeedCharacteristic is not subscribed
9:17 advertise
9:17 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
9:17 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
9:17 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
9:22 102) Wind Speed is LOW
9:22 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
9:22 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
9:22 windSpeedCharacteristic is not subscribed
9:22 advertise
9:27 103) Wind Speed is LOW
9:27 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
9:27 windSpeedCharacteristic is not subscribed
9:28 advertise
9:33 104) Wind Speed is LOW
9:33 windSpeedCharacteristic is not subscribed
9:33 advertise
9:33 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
9:33 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
9:38 105) Wind Speed is LOW
9:38 windSpeedCharacteristic is not subscribed
9:39 advertise
9:39 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
9:39 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
9:39 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
9:44 106) Wind Speed is LOW
9:44 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
9:44 windSpeedCharacteristic is not subscribed
9:44 advertise
9:44 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
9:49 107) Wind Speed is LOW
9:49 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
9:49 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
9:49 windSpeedCharacteristic is not subscribed
9:50 advertise
9:50 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
9:50 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
9:55 108) Wind Speed is LOW
9:55 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
9:55 windSpeedCharacteristic is not subscribed
9:55 advertise
10:00 109) Wind Speed is LOW
10:00 windSpeedCharacteristic is not subscribed
10:01 advertise
10:01 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
10:01 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
10:06 110) Wind Speed is LOW
10:06 windSpeedCharacteristic is not subscribed
10:06 advertise
10:06 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
10:06 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
10:06 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
10:11 111) Wind Speed is LOW
10:11 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
10:11 windSpeedCharacteristic is not subscribed
10:12 advertise
10:17 112) Wind Speed is LOW
10:17 windSpeedCharacteristic is not subscribed
10:17 advertise
10:17 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
10:17 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
10:22 113) Wind Speed is LOW
10:22 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
10:22 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
10:22 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
10:22 windSpeedCharacteristic is not subscribed
10:23 advertise
10:23 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
10:28 114) Wind Speed is LOW
10:28 windSpeedCharacteristic is not subscribed
10:28 advertise
10:28 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
10:28 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
10:28 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
10:33 115) Wind Speed is LOW
10:33 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
10:33 windSpeedCharacteristic is not subscribed
10:34 advertise
10:39 116) Wind Speed is LOW
10:39 windSpeedCharacteristic is not subscribed
10:39 advertise
10:39 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
10:39 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
10:39 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
10:44 117) Wind Speed is LOW
10:44 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
10:44 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
10:44 windSpeedCharacteristic is not subscribed
10:45 advertise
10:45 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
10:45 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
10:50 118) Wind Speed is LOW
10:50 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
10:50 windSpeedCharacteristic is not subscribed
10:50 advertise
10:55 119) Wind Speed is LOW
10:55 windSpeedCharacteristic is not subscribed
10:56 advertise
11:01 120) Wind Speed is LOW
11:01 windSpeedCharacteristic is not subscribed
11:01 advertise
11:06 121) Wind Speed is LOW
11:06 windSpeedCharacteristic is not subscribed
11:07 advertise
11:07 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
11:07 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
11:12 122) Wind Speed is LOW
11:12 windSpeedCharacteristic is not subscribed
11:12 advertise
11:17 123) Wind Speed is LOW
11:17 windSpeedCharacteristic is not subscribed
11:18 advertise
11:18 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
11:18 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
11:18 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
11:23 124) Wind Speed is LOW
11:23 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
11:23 windSpeedCharacteristic is not subscribed
11:23 advertise
11:28 125) Wind Speed is LOW
11:28 windSpeedCharacteristic is not subscribed
11:29 advertise
11:29 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
11:29 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
11:29 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
11:34 126) Wind Speed is LOW
11:34 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
11:34 windSpeedCharacteristic is not subscribed
11:34 advertise
11:39 127) Wind Speed is LOW
11:39 windSpeedCharacteristic is not subscribed
11:40 advertise
11:40 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
11:40 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
11:40 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
11:40 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
11:45 128) Wind Speed is LOW
11:45 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
11:45 windSpeedCharacteristic is not subscribed
11:45 advertise
11:50 129) Wind Speed is LOW
11:50 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
11:50 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
11:50 windSpeedCharacteristic is not subscribed
11:51 advertise
11:51 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
11:51 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
11:56 130) Wind Speed is LOW
11:56 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
11:56 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
11:56 windSpeedCharacteristic is not subscribed
11:56 advertise
11:56 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
11:56 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
12:01 131) Wind Speed is LOW
12:01 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
12:01 windSpeedCharacteristic is not subscribed
12:02 advertise
12:02 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
12:02 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
12:07 132) Wind Speed is LOW
12:07 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
12:07 windSpeedCharacteristic is not subscribed
12:07 advertise
12:12 133) Wind Speed is LOW
12:12 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
12:12 windSpeedCharacteristic is not subscribed
12:13 advertise
12:13 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
12:18 134) Wind Speed is LOW
12:18 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
12:18 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
12:18 windSpeedCharacteristic is not subscribed
12:18 advertise
12:18 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
12:18 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
12:23 135) Wind Speed is LOW
12:23 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
12:23 windSpeedCharacteristic is not subscribed
12:24 advertise
12:29 136) Wind Speed is LOW
12:29 windSpeedCharacteristic is not subscribed
12:29 advertise
12:34 137) Wind Speed is LOW
12:34 windSpeedCharacteristic is not subscribed
12:35 advertise
12:40 138) Wind Speed is LOW
12:40 windSpeedCharacteristic is not subscribed
12:40 advertise
12:40 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
12:40 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
12:40 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
12:45 139) Wind Speed is LOW
12:45 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
12:45 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
12:45 windSpeedCharacteristic is not subscribed
12:46 advertise
12:46 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
12:46 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
12:51 140) Wind Speed is LOW
12:51 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
12:51 windSpeedCharacteristic is not subscribed
12:51 advertise
12:51 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
12:56 141) Wind Speed is LOW
12:56 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
12:56 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
12:56 windSpeedCharacteristic is not subscribed
12:57 advertise
12:57 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
12:57 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
13:02 142) Wind Speed is LOW
13:02 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
13:02 windSpeedCharacteristic is not subscribed
13:02 advertise
13:07 143) Wind Speed is LOW
13:07 windSpeedCharacteristic is not subscribed
13:08 advertise
13:08 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
13:08 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
13:08 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
13:08 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
13:13 144) Wind Speed is LOW
13:13 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
13:13 windSpeedCharacteristic is not subscribed
13:13 advertise
13:18 145) Wind Speed is LOW
13:18 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
13:18 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
13:18 windSpeedCharacteristic is not subscribed
13:19 advertise
13:19 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
13:19 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
13:24 146) Wind Speed is LOW
13:24 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
13:24 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
13:24 windSpeedCharacteristic is not subscribed
13:24 advertise
13:29 147) Wind Speed is LOW
13:29 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
13:29 windSpeedCharacteristic is not subscribed
13:30 advertise
13:35 148) Wind Speed is LOW
13:35 windSpeedCharacteristic is not subscribed
13:35 advertise
13:35 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
13:35 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
13:40 149) Wind Speed is LOW
13:40 windSpeedCharacteristic is not subscribed
13:41 advertise
13:46 150) Wind Speed is LOW
13:46 windSpeedCharacteristic is not subscribed
13:46 advertise
13:46 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
13:46 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
13:46 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
13:46 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
13:51 151) Wind Speed is LOW
13:51 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
13:51 windSpeedCharacteristic is not subscribed
13:52 advertise
13:57 152) Wind Speed is LOW
13:57 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
13:57 windSpeedCharacteristic is not subscribed
13:57 advertise
13:57 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
14:02 153) Wind Speed is LOW
14:02 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
14:02 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
14:02 windSpeedCharacteristic is not subscribed
14:03 advertise
14:03 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
14:03 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
14:08 154) Wind Speed is LOW
14:08 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
14:08 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
14:08 windSpeedCharacteristic is not subscribed
14:08 advertise
14:08 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
14:08 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
14:13 155) Wind Speed is LOW
14:13 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
14:13 windSpeedCharacteristic is not subscribed
14:14 advertise
14:14 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
14:19 156) Wind Speed is LOW
14:19 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
14:19 windSpeedCharacteristic is not subscribed
14:19 advertise
14:24 157) Wind Speed is LOW
14:24 windSpeedCharacteristic is not subscribed
14:25 advertise
14:25 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
14:25 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
14:30 158) Wind Speed is LOW
14:30 windSpeedCharacteristic is not subscribed
14:30 advertise
14:30 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
14:30 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
14:30 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
14:35 159) Wind Speed is LOW
14:35 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
14:35 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
14:35 windSpeedCharacteristic is not subscribed
14:36 advertise
14:36 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
14:36 blePeripheralConnectHandler Connected to central: 86:32:11:35:ad:2b
14:41 160) Wind Speed is LOW
14:41 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
14:41 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
14:41 windSpeedCharacteristic is not subscribed
14:41 advertise
14:41 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
14:41 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
14:46 161) Wind Speed is LOW
14:46 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
14:46 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
14:46 windSpeedCharacteristic is not subscribed
14:47 advertise
14:47 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
14:47 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
14:52 162) Wind Speed is LOW
14:52 blePeripheralConnectHandler Connected to central: d8:3f:78:15:d5:64
14:52 windSpeedCharacteristic is not subscribed
14:52 advertise
14:57 163) Wind Speed is LOW
14:57 windSpeedCharacteristic is not subscribed
14:58 advertise
15:03 164) Wind Speed is LOW
15:03 windSpeedCharacteristic is not subscribed
15:03 advertise
15:03 blePeripheralDisconnectHandler Disconnected from central: 86:32:11:35:ad:2b
15:08 165) Wind Speed is LOW
15:08 windSpeedCharacteristic is not subscribed
15:09 advertise
15:14 166) Wind Speed is LOW
15:14 windSpeedCharacteristic is not subscribed
:
: same message as above several times (~every 5 seconds)
:
20:56 advertise
21:01 229) Wind Speed is LOW
21:01 windSpeedCharacteristic is not subscribed
21:01 advertise
21:06 230) Wind Speed is LOW
21:06 windSpeedCharacteristic is SUBSCRIBED
:
: same message as above several times (~every 5 seconds)
:
22:57 advertise
23:02 251) Wind Speed is LOW
23:02 windSpeedCharacteristic is SUBSCRIBED
23:02 advertise
23:07 252) Wind Speed is LOW
23:07 windSpeedCharacteristic is not subscribed
23:08 advertise
23:13 253) Wind Speed is LOW
23:13 windSpeedCharacteristic is not subscribed
:
: same message as above several times (~every 5 seconds)
:
23:52 advertise
23:57 261) Wind Speed is LOW
23:57 windSpeedCharacteristic is not subscribed
23:57 advertise
24:02 262) Wind Speed is LOW
24:02 blePeripheralDisconnectHandler Disconnected from central: d8:3f:78:15:d5:64
24:02 windSpeedCharacteristic is not subscribed
24:02 advertise
24:07 263) Wind Speed is LOW
24:07 windSpeedCharacteristic is not subscribed
:
: same message as above several times (~every 5 seconds)
:
37:28 advertise
37:33 424) Wind Speed is LOW
37:33 windSpeedCharacteristic is not subscribed
37:33 advertise
Can you get the two linear motor controlling Arduinos connected by wires? How far apart are they? The Nano 33 BLE's have multiple serial uarts and can easily communicate over wires. If quite far apart, then perhaps RS232 could be used for a wired connection.
I had actually planned to test it with batteries when everything is working and then decide about the capacity and size. Perhaps this is a bad idea.
No, its a good idea. Leave the battery issue for later.
Have you done any research on placing the data in the advertising packet? The more I think about it, it is a very good way to go since you are only wanting to transmit a 1 or 0.
I haven't had time to review your findings from the tests, but clearly the full BLE implementation as compared to the testing in posts 9 and 10 is not going as expected.
For the test I used the same code as in your post 9, with minor changes for Serial.print().
This morning, after 20 minutes of trying, one of the Arduinos was able to connect to the peripheral device and the subscripting also worked. But further attempts have failed so far.
With version 1.1.4 arduino/ArduinoCore-nRF528x-mbedos@ and following, if the nano33ble board works as a central device, then it cannot connect to multiple peripherals. On the other hand, if it works as a peripheral device, then it is able to handle multiple central devices connected to it.
I have been investigating a change of course to use the advertised manufacturer data from the anerometer peripheral to carry the wind speed variable 0 or 1. This manufacturer data can be an array of bytes to carry more information if required.
I have also written a central which scans for the anerometer peripheral and reads and reports the manufacturer data. There are no connections required, and I have had a phone and central reading the wind data at the same time without issue.
I think for this approach to best work, the anerometer needs to be advertising continually, and the anerometer reading needs to be non blocking.
The current wind speed algorithm counts the number of pulses in 5 seconds, and then if that number is >(mds*mts) the condition is windy.
This is can be done in a non blocking manner without the while loop.
The lockout after a windy condition may be better placed in the central. I think that all the logic of what to do when its windy or not should be in the central moving the panel and not the peripheral measuring the wind.
// If WindLevel is HIGH (stormy weather), it'll be HIGH for longer Time
// - Wait some time and then check Wind again.
if(WindLevel)
{
Serial.print("wait ");Serial.print(pauseAfterWindMeasure/1000);Serial.println(" seconds");
delay (pauseAfterWindMeasure);
}
Here's some code I have been playing around with. The peripheral just changes the manufacturer data every 5 seconds, and the central reads and reports the value every second. Let me know if you think this approach has value.
Here's the peripheral advertiser's code
#include <ArduinoBLE.h>
const char* BLE_Service_UUID_TrueWindSpeed = "181a"; // Service - Environmental Sensing Service
const char* BLE_Characteristics_UUDI_TrueWindSpeed = "2a70"; // Characteristics - True Wind Speed
BLEService environmentalService(BLE_Service_UUID_TrueWindSpeed); // Bluetoothยฎ Low Energy Binary Sensor Service
BLEBoolCharacteristic windSpeedCharacteristic(BLE_Characteristics_UUDI_TrueWindSpeed, BLERead | BLENotify); // GATT
const int pinReedSensor = 8 ; // REED Sensorport (Anemometer)
byte windData = 1;//will be 0 or 1 depending on wind condition
void setup() {
Serial.begin(115200); // initialize serial communication
pinMode(pinReedSensor, INPUT_PULLDOWN);
pinMode(LED_BUILTIN, OUTPUT);
setupBLE_Environment();
}
void loop()
{
BLE.advertise();
static unsigned long lastTime = 0;
if (millis() - lastTime >= 5000)
{
lastTime = millis();
if (windData == 1)
windData = 0;
else
windData = 1;
BLE.setManufacturerData(&windData, 1);//function wants address of(or pointer to) windData
Serial.print("windData= ");
Serial.println(windData);
}
}
void setupBLE_Environment()
{
while (!BLE.begin()) {
// Serial.println("starting BLE failed!");
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
digitalWrite(LED_BUILTIN, LOW);
}
/* Set a local name for the Bluetoothยฎ Low Energy device
This name will appear in advertising packets
and can be used by remote devices to identify this Bluetoothยฎ Low Energy device
The name can be changed but maybe be truncated based on space left in advertisement packet
*/
BLE.setLocalName("Anemometer");
BLE.setDeviceName("Anemometer");
BLE.setAdvertisedService(environmentalService); // add the service UUID
environmentalService.addCharacteristic(windSpeedCharacteristic); // add the Windlevel characteristic
BLE.addService(environmentalService); // Add the Enviromental service
BLE.setManufacturerData(&windData, 1);
BLE.advertise(); // start advertising
}
Here's the code which scans and reports the manufacturer data of windData every second.
#include <ArduinoBLE.h>
void setup() {
Serial.begin(115200);
while (!Serial);
// begin initialization
if (!BLE.begin()) {
Serial.println("starting Bluetoothยฎ Low Energy module failed!");
while (1);
}
Serial.println("Bluetoothยฎ Low Energy Central - Peripheral Explorer");
}
void loop()
{
BLE.scanForUuid("181a");
BLEDevice peripheral = BLE.available();
static unsigned long lastPrint = 0;
if (peripheral and millis()-lastPrint >= 1000)
{
lastPrint = millis();
//discovered a peripheral, print out address, local name, and advertised service
Serial.print("Found ");
//Serial.print(peripheral.address());
Serial.print(" '");
Serial.print(peripheral.localName());
Serial.print("' ");
//Serial.print(peripheral.advertisedServiceUuid());
Serial.println();
// see if peripheral has manufacturing data
if (peripheral.hasManufacturerData())
{
Serial.println("Found manufacturer data");
int ManuDataLen = peripheral.manufacturerDataLength();
//Serial.println(ManuDataLen);
//retrieve the data.... using manufacturerData etc.
uint8_t manuDataBuffer[ManuDataLen];
if (peripheral.manufacturerData(manuDataBuffer, ManuDataLen))
{
Serial.print("Manufacturer Data: ");
for (int x = 0; x < ManuDataLen; x++) {
Serial.print(manuDataBuffer[x]);
}
Serial.println();
}
}
}
}
Here's a revision of the Anerometer code to set the manufacturer data 0 or 1 based on the pulse counts during a period of time. It should be apparent to you how to change the threshold number of counts or the mds time period if I didn't get it correct for what you have found to be "windy".
I think that what do do with a windy condition, how to check if its windy for a long period of time, when to move the panels, etc. should all be done in the code which reads the wind data.
#include <ArduinoBLE.h>
const char* BLE_Service_UUID_TrueWindSpeed = "181a"; // Service - Environmental Sensing Service
const char* BLE_Characteristics_UUDI_TrueWindSpeed = "2a70"; // Characteristics - True Wind Speed
BLEService environmentalService(BLE_Service_UUID_TrueWindSpeed); // Bluetoothยฎ Low Energy Binary Sensor Service
BLEBoolCharacteristic windSpeedCharacteristic(BLE_Characteristics_UUDI_TrueWindSpeed, BLERead | BLENotify); // GATT
const int pinReedSensor = 8 ;// REED Sensorport(Anemometer)
byte windCounter = 0;//pulse count on reed sensor pin
byte windData = 0;//will be 0 or 1 depending on windCounter in time period
const unsigned long mds = 5;// measure time duration in seconds
//const float mts = 2.5;
//wind counter greater than 2.5*5 =7.5 i.e. 8 or more
byte highThreshold = 8;
void setup() {
Serial.begin(115200); // initialize serial communication
pinMode(pinReedSensor, INPUT_PULLDOWN);
pinMode(LED_BUILTIN, OUTPUT);
setupBLE_Environment();
}
void loop()
{
BLE.advertise();
readAnemometer();//counts pulses
//check for number of anerometer pulses in timed period
static unsigned long lastTime = 0;
if (millis() - lastTime >= mds * 1000)
{
lastTime = millis();
Serial.print("windCounter = ");
Serial.println(windCounter);
if (windCounter >= highThreshold)
{
windData = 1;
}
else
{
windData = 0;
}
windCounter = 0; //reset counter
BLE.setManufacturerData(&windData, 1);//function wants address of(or pointer to) windData
Serial.print("windData= ");
Serial.println(windData);
}
}
void setupBLE_Environment()
{
while (!BLE.begin()) {
// Serial.println("starting BLE failed!");
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
digitalWrite(LED_BUILTIN, LOW);
}
/* Set a local name for the Bluetoothยฎ Low Energy device
This name will appear in advertising packets
and can be used by remote devices to identify this Bluetoothยฎ Low Energy device
The name can be changed but maybe be truncated based on space left in advertisement packet
*/
BLE.setLocalName("Anemometer");
BLE.setDeviceName("Anemometer");
BLE.setAdvertisedService(environmentalService); // add the service UUID
environmentalService.addCharacteristic(windSpeedCharacteristic); // add the Windlevel characteristic
BLE.addService(environmentalService); // Add the Enviromental service
BLE.setManufacturerData(&windData, 1);
BLE.advertise(); // start advertising
}
void readAnemometer()
{
static byte newState = LOW;
static byte oldState = LOW;
newState = digitalRead(pinReedSensor);
if (oldState == LOW && newState == HIGH) // Bei jeder Umdrehung wird newState auf HIGH gesetzt, wenn der REED-Sensor aktiviert wird.
{
windCounter++;
}
oldState = newState;
}
Thank you @cattledog
Your approach seems to working. But it looks like the main problem is in my environment. Sometimes it can find the peripheral device but often not. I added a Serial.print statement to see, how long it takes to find the peripheral. Below you can see the output from each central device.
Bluetoothยฎ Low Energy Central d8:3f:78:15:d5:64 - Peripheral Explorer
61 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 1
106 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 1
451 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 0
1026 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 1
1111 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 1
1912 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 1
2322 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 0
2732 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 0
3172 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 0
3697 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 0
Bluetoothยฎ Low Energy Central 86:32:11:35:ad:2b - Peripheral Explorer
541 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 0
1736 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 1
2041 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 1
2126 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 1
2376 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 0
2611 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 0
2681 seconds - Found 'Anemometer'
Found manufacturer data
Manufacturer Data: 0