Arduino:Примеры/Genuino101CurieBLEHeartRateMonitor
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Отслеживание пульса[1]
Этот пример демонстрирует встроенные BLE-возможности платы Arduino/Genuino 101, и в нем используется стандартный BLE-сервис «Heart Rate Monitor» (т.е. «пульсометр»). Этот сервис принимает значения от датчика сердцебиения (в этом примере он эмулируется аналоговым датчиком), а затем отсылает их через BLE на ваш смартфон или другое устройство, где эти значения используются приложением nRF Toolbox for BLE для создания соответствующего графика.
Необходимое оборудование
- Плата Arduino/Genuino 101
- Устройство на Android или iOS, на котором запущено приложение nRF Toolbox for BLE
- Потенциометр или другой аналоговый датчик
Цепь
Инструкции
- Настройте IDE Arduino согласно инструкциям в этой статье.
- Загрузите приложение nRF Toolbox for BLE (это бесплатно). Версия для Anrdoid – здесь, для iOS – здесь.
- Подсоедините к Arduino 101 потенциометр (или другой аналоговый датчик), как показано в разделе «Цепь» выше.
- Подключите Arduino 101 к компьютеру.
- Запустите на компьютере IDE Arduino и выберите там пункт Инструменты > Плата > Arduino/Genuino 101 (Tools > Board > Arduino/Genuino 101).
- Загрузите в IDE Arduino скетч CurieBLEHeartRateMonitor. Он находится в Файл > Примеры > CurieIMU (File > Examples > CurieIMU). Полную версию этого скетча можно также найти в разделе «Код» ниже.
- Запустите приложение. Перед вами должен появиться домашний экран, как на картинке ниже.
- Кликните по иконке с сердечком в центре экрана. Откроется график «Beats per Minute over Time» (т.е. «динамика сердцебиения»). Пока вы не подключитесь к Arduino, он не будет показывать никаких данных.
- Нажмите кнопку «Connect», расположенную под графиком, и вы увидите устройство «HeartRateSketch» (или какое-то другое, если вы его переименовали).
- Кликните по названию вашего устройства и данные от потенциометра должны сразу же появиться на графике, изображенном на картинке ниже. Конечно, потенциометр лишь эмулирует сердцебиение – чтобы продемонстрировать, как работает этот сервис.
Код
/*
Правообладатель – Intel Corporation (2015). Все права защищены.
Эта библиотека является бесплатной; ее можно распространять
и/или модифицировать согласно условиям Стандартной общественной
лицензии ограниченного применения GNU (т.к. она выпущена Фондом
свободного ПО) – либо версии 2.1 этой лицензии, либо более поздней
версии (на ваш выбор).
Эта библиотека распространяется в надежде на то, что будет
полезна кому-либо, но БЕЗО ВСЯКИХ ГАРАНТИЙ – даже без гарантий на
коммерческое качество и пригодность применения для конкретных
целей. Более подробно читайте в Стандартной общественной лицензии
ограниченного применения GNU.
Вы должны получить копию Стандартной общественной лицензии
ограниченного применения вместе с этой библиотекой. Если не
получили, напишите в Фонд бесплатного ПО на адрес: Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301 USA
*/
/*
Этот скетч частично использует стандартный BLE-сервис «Heart Rate».
Подробнее читайте на
https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
*/
#include <CurieBle.h>
BLEPeripheral blePeripheral; // периферийное BLE-устройство (программируемая вами плата)
BLEService heartRateService("180D"); // BLE-сервис для измерения пульса
// BLE-характеристика для измерения пульса:
BLECharacteristic heartRateChar("2A37", // стандартный 16-битный UUID характеристики;
BLERead | BLENotify, 2); // клиенты будут получать уведомления, если эта характеристика изменится;
// длина этой характеристики составляет два байта, т.е. первое поле отведено под «Flags» (согласно спецификациям BLE)
// https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml
int oldHeartRate = 0; // значение, последний раз считанное с аналогового датчика
long previousMillis = 0; // время, когда сердцебиение проверялось в последний раз (в миллисекундах)
void setup() {
Serial.begin(9600); // инициализируем последовательную коммуникацию
pinMode(13, OUTPUT); // инициализируем светодиод на 13-ом контакте, чтобы он сигнализировал о подключении центрального устройства
/* Задаем локальное название для BLE-устройства. Это название будет
в пакетах-объявлениях и может быть использовано удаленными
устройствами для идентификации этого BLE-устройства. Кроме того,
это название можно поменять, но оно может быть обрезано из-за
нехватки места в пакете-объявлении. */
blePeripheral.setLocalName("HeartRateSketch");
blePeripheral.setAdvertisedServiceUuid(heartRateService.uuid()); // добавляем UUID сервиса
blePeripheral.addAttribute(heartRateService); // добавляем BLE-сервис для измерения сердцебиения
blePeripheral.addAttribute(heartRateChar); // добавляем характеристику для измерения сердцебиения
/* Теперь включаем периферийное BLE-устройство. Оно начнет в
постоянном режиме рассылать пакеты-объявления и станет видимым
для находящихся рядом центральных BLE-устройств, пока не получит
новое подключение. */
blePeripheral.begin();
Serial.println("Bluetooth device active, waiting for connections..."); // "Bluetooth-устройство активно, ждем подключений..."
}
void loop() {
// начинаем прослушку периферийных BLE-устройств, к которым можно подключиться:
BLECentral central = blePeripheral.central();
// если центральное устройство подключилось к периферийному:
if (central) {
Serial.print("Connected to central: "); // "Подключились к центральному устройству: "
// показываем MAC-адрес центрального устройства:
Serial.println(central.address());
// включаем светодиод, сигнализируя о факте подключения:
digitalWrite(13, HIGH);
// проверяем сердцебиение каждые 200 миллисекунд,
// пока подключено центральное устройство:
while (central.connected()) {
long currentMillis = millis();
// если 200 миллисекунд прошли, снова проверяем сердцебиение:
if (currentMillis - previousMillis >= 200) {
previousMillis = currentMillis;
updateHeartRate();
}
}
// если центральное устройство отключилось, выключаем светодиод:
digitalWrite(13, LOW);
Serial.print("Disconnected from central: "); // "Отключились от центрального устройства: "
Serial.println(central.address());
}
}
void updateHeartRate() {
/* Считываем уровень напряжения на 0-ом входном аналоговом контакте.
Это используется для эмуляции датчика сердцебиения.
*/
int heartRateMeasurement = analogRead(A0);
int heartRate = map(heartRateMeasurement, 0, 1023, 0, 100);
if (heartRate != oldHeartRate) { // если пульс изменился
Serial.print("Heart Rate is now: "); // "Пульс сейчас: " сообщаем об этом
Serial.println(heartRate);
const unsigned char heartRateCharArray[2] = { 0, (char)heartRate };
heartRateChar.setValue(heartRateCharArray, 2); // и обновляем характеристику для измерения сердцебиения
oldHeartRate = heartRate; // сохраняем считанное значение для сравнения при следующем проходе через цикл
}
}
Что дальше
Протокол Bluetooth Low Energy включает в себя и другие сервисы, к примеру, Alert Notification Service (для уведомлениях о текстовых сообщениях), Environmental Sensing (для отображения информации о состоянии окружающей среды: скорости и направлении ветра, точки росы, влажности и т.д.), AutomationIO (для отображения данных от модулей ввода-вывода) и т.д. Все эти сервисы тоже можно использовать с платой Arduino, управляя и считывая данные с подключенных к ней компонентов.
Данный пример использует nRF Toolbox, но это приложение работает только с девятью сервисами. Если вы хотите использовать другие сервисы (как в примерах для библиотеки CurieIMU), мы рекомендуем использовать приложения LightBlue (для iOS) и nRF Control Panel (для Android).
См.также
- Heart Rate Monitor
- Battery Monitor
- Button LED
- Callback LED
- LED
Внешние ссылки
Arduino продукты | |
---|---|
Начальный уровень | Arduino Uno • Arduino Leonardo • Arduino 101 • Arduino Robot • Arduino Esplora • Arduino Micro • Arduino Nano • Arduino Mini • Arduino Starter Kit • Arduino Basic Kit • MKR2UNO • TFT-дисплей Arduino |
Продвинутые функции | Arduino Mega 2560 • Arduino Zero • Arduino Due • Arduino Mega ADK • Arduino Pro • Arduino Motor Shield • Arduino USB Host Shield • Arduino Proto Shield • MKR Proto Shield • MKR Proto Large Shield • Arduino ISP • Arduino USB 2 Serial Micro • Arduino Mini USB Serial Adapter |
Интернет вещей | Arduino Yun • Arduino Ethernet • Arduino MKR1000 • Arduino WiFi 101 Shield • Arduino GSM Shield V2 • Arduino WiFi Shield • Arduino Wireless SD Shield • Arduino Wireless Proto Shield • Arduino Ethernet Shield V2 • Arduino Yun Shield • Arduino MKR1000 Bundle |
Носимые устройства | Arduino Gemma • Lilypad Arduino Simple • Lilypad Arduino Main Board • Lilypad Arduino USB • LilyPad Arduino SimpleSnap |
3D-печать | Arduino Materia 101 |
Устаревшие устройства | - |
Примеры Arduino | |
---|---|
Стандартные функции | |
Основы |
|
Цифровой сигнал |
|
Аналоговый сигнал |
|
Связь |
|
Управляющие структуры |
|
Датчики |
|
Дисплей |
Примеры, объясняющие основы управления дисплеем:
|
Строки |
|
USB (для Leonardo, Micro и Due плат) |
В этой секции имеют место примеры, которые демонстрируют использование библиотек, уникальных для плат Leonardo, Micro и Due.
|
Клавиатура |
|
Мышь |
|
Разное |
- Страницы, использующие повторяющиеся аргументы в вызовах шаблонов
- Справочник языка Arduino
- Arduino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Пример
- Примеры
- Пример программирования Arduino
- Примеры программирования Arduino