#arduino #bluetooth #bluetooth-lowenergy
Вопрос:
У меня есть проект для школы: похититель для боксера. Мне придется подключить Arduino nano 33 ble Sense к Bluetooth. Идея состоит в том, чтобы перенести данные акселерометра на смартфон с приложением (возможно, сделанным с помощью MIT app Inventor). И так покажите спортсмену силу его удара с применением (ускорения -) силы — — -) силы). Но мне не удалось подключить свой arduino к смартфону. Действительно, я следую за туто, чтобы подключить его. На самом деле, мне удается подключить arduino с помощью nFr connect, но я ничего не могу сделать.
код (для подключения Bluetooth nFr), о котором идет речь, находится здесь : (это просто пример, потому что моя конечная цель-сделать это, но с помощью акселерометра)
#include <ArduinoBLE.h>
#include <Arduino_LSM9DS1.h>
BLEService dataService("180C"); // User defined service
BLEStringCharacteristic dataCharacteristic("2A56", // standard 16-bit characteristic UUID
BLERead | BLENotify, 13); // remote clients will be able to read and subscribe to notifications
int oldValue = 0; // last value
long previousMillis = 0; // last time the value was checked, in ms
void setup()
{
Serial.begin(9600); // initialize serial communication
while (!Serial)
;
pinMode(LED_BUILTIN, OUTPUT); // initialize the built-in LED pin
if (!BLE.begin()) { // initialize BLE
Serial.println("starting BLE failed!");
while (1)
;
}
BLE.setLocalName("Sac de frappe"); // Set name for connection
BLE.setAdvertisedService(dataService); // Advertise service
dataService.addCharacteristic(dataCharacteristic); // Add characteristic to service
BLE.addService(dataService); // Add service
dataCharacteristic.setValue(String(oldValue)); // Set data string
BLE.advertise(); // Start advertising
Serial.print("Peripheral device MAC: ");
Serial.println(BLE.address());
Serial.println("Waiting for connections...");
Serial.begin(9600);
while (!Serial);
Serial.println("Started");
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Accelerometer sample rate = ");
Serial.print(IMU.accelerationSampleRate());
Serial.println(" Hz");
Serial.println();
Serial.println("Acceleration in G's");
Serial.println("XtYtZ");
}
void loop()
{
BLEDevice central = BLE.central(); // Wait for a BLE central to connect
// if a central is connected to the peripheral:
if (central) {
Serial.print("Connected to central MAC: ");
// print the central's BT address:
Serial.println(central.address());
// turn on the LED to indicate the connection:
digitalWrite(LED_BUILTIN, HIGH);
// update value every 200ms
// while the central is connected:
while (central.connected()) {
long currentMillis = millis();
// if 200ms have passed, update value:
if (currentMillis - previousMillis >= 200) {
previousMillis = currentMillis;
updateValue();
}
}
}
// when the central disconnects, turn off the LED:
digitalWrite(LED_BUILTIN, LOW);
Serial.print("Disconnected from central MAC: ");
Serial.println(central.address());
float x, y, z;
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(x, y, z);
Serial.print(x);
Serial.print('t');
Serial.print(y);
Serial.print('t');
Serial.println(z);
}
}
void updateValue() {
int value = analogRead(A0); // Read your accelerometer data here
if (value != oldValue) {
Serial.print("Accelerometer Data is now: "); // print it
Serial.println(value);
dataCharacteristic.writeValue(String(value)); // update value
// save the level for next comparison
oldValue = value;
}
}
спасибо за помощь (извините за мой английский)
Комментарии:
1. почтовый индекс, о котором идет речь.
2. Пожалуйста, скопируйте код на свой вопрос, не используйте изображения
3. да, хорошо, извините, я добавлю это сейчас
4. Вы сказали, что можете подключиться к сервису с помощью nRF Connect, но ничего не можете сделать? Можете ли вы описать, что вы имеете в виду под этим? Ваш код выглядит так, как будто вы должны уметь читать по характеристике
5. да, но я хочу передать ускорение, измеренное акселерометром внутри arduino, и отобразить его в простом приложении для смартфона через Bluetooth
Ответ №1:
Отредактировано в соответствии с отредактированным кодом, о котором идет речь
Чтобы передать данные акселерометра, вы можете сделать что-то похожее на пример BatteryMonitor:
Используйте уведомления о своих характеристиках, чтобы ваш смартфон мог получать изменения без постоянного чтения вручную. Считывание и постоянное обновление данных акселерометра при подключении центра.
#include <ArduinoBLE.h>
#include <Arduino_LSM9DS1.h>
BLEService dataService("180C"); // User defined service
BLEStringCharacteristic dataCharacteristic("2A56", // standard 16-bit characteristic UUID
BLERead | BLENotify, 50); // remote clients will be able to read and subscribe to notifications
float oldX = 0.0; // last value
float oldY = 0.0;
float oldZ = 0.0;
long previousMillis = 0; // last time the value was checked, in ms
void setup()
{
Serial.begin(9600); // initialize serial communication
while (!Serial)
;
pinMode(LED_BUILTIN, OUTPUT); // initialize the built-in LED pin
if (!BLE.begin()) { // initialize BLE
Serial.println("starting BLE failed!");
while (1)
;
}
BLE.setLocalName("Sac de frappe"); // Set name for connection
BLE.setAdvertisedService(dataService); // Advertise service
dataService.addCharacteristic(dataCharacteristic); // Add characteristic to service
BLE.addService(dataService); // Add service
dataCharacteristic.setValue(""); // Set initial value
BLE.advertise(); // Start advertising
Serial.print("Peripheral device MAC: ");
Serial.println(BLE.address());
Serial.println("Waiting for connections...");
Serial.begin(9600);
while (!Serial);
Serial.println("Started");
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Accelerometer sample rate = ");
Serial.print(IMU.accelerationSampleRate());
Serial.println(" Hz");
Serial.println();
Serial.println("Acceleration in G's");
Serial.println("XtYtZ");
}
void loop()
{
BLEDevice central = BLE.central(); // Wait for a BLE central to connect
// if a central is connected to the peripheral:
if (central) {
Serial.print("Connected to central MAC: ");
// print the central's BT address:
Serial.println(central.address());
// turn on the LED to indicate the connection:
digitalWrite(LED_BUILTIN, HIGH);
// update value every 200ms
// while the central is connected:
while (central.connected()) {
long currentMillis = millis();
// if 200ms have passed, update value:
if (currentMillis - previousMillis >= 200) {
previousMillis = currentMillis;
updateValue();
}
}
}
// when the central disconnects, turn off the LED:
digitalWrite(LED_BUILTIN, LOW);
Serial.print("Disconnected from central MAC: ");
Serial.println(central.address());
}
void updateValue() {
float x, y, z;
if (!IMU.accelerationAvailable()) return; // Return if not ready
IMU.readAcceleration(x, y, z); // Read new data
if (x != oldX || y != oldY || z != oldZ) {
// print it
Serial.print(x);
Serial.print('t');
Serial.print(y);
Serial.print('t');
Serial.println(z);
dataCharacteristic.writeValue("X: " String(x) " Y: " String(y) " Z: " String(z)); // update value
// save the value for next comparison
oldX = x;
oldY = y;
oldZ = z;
}
}
Вы можете проверить функциональность с помощью nRF Connect. Если все работает так, как вам нравится, приступайте к разработке собственного приложения.
Комментарии:
1. Как я должен проверить функциональность с помощью nRF connect ? и если я это сделаю, он всегда будет соединять (связывать) мой телефон с arduino через Bluetooth и, таким образом, позволит мне создать собственное приложение для редактирования : оно не работает из-за строки «dataCharacteristic.writeValue(значение); // значение обновления», в которой строка неоднозначна …
2. @Faiz42 всегда плохо разрабатывать свое приложение и периферийное устройство одновременно. Не было бы никакого способа определить, какая сторона вызывает ошибку. Начните с разработки периферийного устройства и используйте nRF Connect для тестирования вашего устройства с помощью чтения и записи. Если все работает на периферийной стороне, вы можете начать разработку своего приложения.
3. Я отредактировал свой ответ, чтобы записать новое значение в виде строки. Вы можете использовать другие типы данных для своей характеристики, если хотите, я не знаю, что вам нужно и какой тип данных возвращает ваш датчик
4. хорошо , спасибо, последний вопрос : если я хочу просто подключить arduino к своему телефону, как классическое устройство Bluetooth, как я предполагаю это сделать ? поскольку с помощью этой программы я не могу подключить свой смартфон к arduino, на моем телефоне появилось сообщение «для использования этого устройства необходимо приложение» ….
5. Точно. Если вы хотите использовать устройство с низким энергопотреблением Bluetooth, вам необходимо использовать такое приложение, как nRF Connect, или ваше собственное. Подключение к устройству Bluetooth через настройки вашего смартфона возможно только с помощью Bluetooth Classic. Это позволит вам установить последовательное соединение, но вам, безусловно, потребуется также пользовательское приложение, так как вы отправляете пользовательские данные и не используете один из профилей по умолчанию, например тот, который используется для гарнитуры Bluetooth