Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Genuino101CurieBLEHeartRateMonitor

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Отслеживание пульса[1]

Этот пример демонстрирует встроенные BLE-возможности платы Arduino/Genuino 101, и в нем используется стандартный BLE-сервис «Heart Rate Monitor» (т.е. «пульсометр»). Этот сервис принимает значения от датчика сердцебиения (в этом примере он эмулируется аналоговым датчиком), а затем отсылает их через BLE на ваш смартфон или другое устройство, где эти значения используются приложением nRF Toolbox for BLE для создания соответствующего графика.

Необходимое оборудование

  • Плата Arduino/Genuino 101
  • Устройство на Android или iOS, на котором запущено приложение nRF Toolbox for BLE
  • Потенциометр или другой аналоговый датчик

Цепь

Gen101hrm fzz.jpg

Инструкции

  1. Настройте IDE Arduino согласно инструкциям в этой статье.
  2. Загрузите приложение nRF Toolbox for BLE (это бесплатно). Версия для Anrdoidздесь, для iOS – здесь.
  3. Подсоедините к Arduino 101 потенциометр (или другой аналоговый датчик), как показано в разделе «Цепь» выше.
  4. Подключите Arduino 101 к компьютеру.
  5. Запустите на компьютере IDE Arduino и выберите там пункт Инструменты > Плата > Arduino/Genuino 101 (Tools > Board > Arduino/Genuino 101).
  6. Загрузите в IDE Arduino скетч CurieBLEHeartRateMonitor. Он находится в Файл > Примеры > CurieIMU (File > Examples > CurieIMU). Полную версию этого скетча можно также найти в разделе «Код» ниже.
  7. Запустите приложение. Перед вами должен появиться домашний экран, как на картинке ниже.
HomeNRF.jpg
  • Кликните по иконке с сердечком в центре экрана. Откроется график «Beats per Minute over Time» (т.е. «динамика сердцебиения»). Пока вы не подключитесь к Arduino, он не будет показывать никаких данных.
  • Нажмите кнопку «Connect», расположенную под графиком, и вы увидите устройство «HeartRateSketch» (или какое-то другое, если вы его переименовали).
  • Кликните по названию вашего устройства и данные от потенциометра должны сразу же появиться на графике, изображенном на картинке ниже. Конечно, потенциометр лишь эмулирует сердцебиение – чтобы продемонстрировать, как работает этот сервис.
GraphNRF.jpg

Код

  1. /*
  2.    Правообладатель – Intel Corporation (2015).  Все права защищены.
  3.  
  4.    Эта библиотека является бесплатной; ее можно распространять
  5.    и/или модифицировать согласно условиям Стандартной общественной
  6.    лицензии ограниченного применения GNU (т.к. она выпущена Фондом
  7.    свободного ПО) – либо версии 2.1 этой лицензии, либо более поздней
  8.    версии (на ваш выбор).
  9.  
  10.    Эта библиотека распространяется в надежде на то, что будет
  11.    полезна кому-либо, но БЕЗО ВСЯКИХ ГАРАНТИЙ – даже без гарантий на
  12.    коммерческое качество и пригодность применения для конкретных
  13.    целей. Более подробно читайте в Стандартной общественной лицензии
  14.    ограниченного применения GNU.
  15.  
  16.    Вы должны получить копию Стандартной общественной лицензии
  17.    ограниченного применения вместе с этой библиотекой. Если не
  18.    получили, напишите в Фонд бесплатного ПО на адрес: Free Software
  19.    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,    
  20.    MA  02110-1301  USA
  21. */
  22.  
  23. /*
  24.    Этот скетч частично использует стандартный BLE-сервис «Heart Rate».
  25.    Подробнее читайте на
  26. https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
  27. */
  28.  
  29. #include <CurieBle.h>
  30.  
  31. BLEPeripheral blePeripheral;       // периферийное BLE-устройство (программируемая вами плата)
  32. BLEService heartRateService("180D"); // BLE-сервис для измерения пульса
  33.  
  34. // BLE-характеристика для измерения пульса:
  35. BLECharacteristic heartRateChar("2A37",  // стандартный 16-битный UUID характеристики;
  36.     BLERead | BLENotify, 2);  // клиенты будут получать уведомления, если эта характеристика изменится;
  37.                               // длина этой характеристики составляет два байта, т.е. первое поле отведено под «Flags» (согласно спецификациям BLE)
  38.                               // https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml
  39.  
  40. int oldHeartRate = 0;  // значение, последний раз считанное с аналогового датчика
  41. long previousMillis = 0;  // время, когда сердцебиение проверялось в последний раз (в миллисекундах)
  42.  
  43. void setup() {
  44.   Serial.begin(9600);    // инициализируем последовательную коммуникацию
  45.   pinMode(13, OUTPUT);   // инициализируем светодиод на 13-ом контакте, чтобы он сигнализировал о подключении центрального устройства
  46.  
  47.   /* Задаем локальное название для BLE-устройства. Это название будет
  48.      в пакетах-объявлениях и может быть использовано удаленными
  49.      устройствами для идентификации этого BLE-устройства. Кроме того,
  50.      это название можно поменять, но оно может быть обрезано из-за
  51.      нехватки места в пакете-объявлении. */
  52.   blePeripheral.setLocalName("HeartRateSketch");
  53.   blePeripheral.setAdvertisedServiceUuid(heartRateService.uuid());  // добавляем UUID сервиса
  54.   blePeripheral.addAttribute(heartRateService);   // добавляем BLE-сервис для измерения сердцебиения
  55.   blePeripheral.addAttribute(heartRateChar); // добавляем характеристику для измерения сердцебиения
  56.  
  57.   /* Теперь включаем периферийное BLE-устройство. Оно начнет в
  58.      постоянном режиме рассылать пакеты-объявления и станет видимым
  59.      для находящихся рядом центральных BLE-устройств, пока не получит
  60.      новое подключение. */
  61.   blePeripheral.begin();
  62.   Serial.println("Bluetooth device active, waiting for connections...");  //  "Bluetooth-устройство активно, ждем подключений..."
  63. }
  64.  
  65. void loop() {
  66.   // начинаем прослушку периферийных BLE-устройств, к которым можно подключиться:
  67.   BLECentral central = blePeripheral.central();
  68.  
  69.   // если центральное устройство подключилось к периферийному:
  70.   if (central) {
  71.     Serial.print("Connected to central: ");  //  "Подключились к центральному устройству: "
  72.     // показываем MAC-адрес центрального устройства:
  73.     Serial.println(central.address());
  74.     // включаем светодиод, сигнализируя о факте подключения:
  75.     digitalWrite(13, HIGH);
  76.  
  77.     // проверяем сердцебиение каждые 200 миллисекунд,
  78.     // пока подключено центральное устройство:
  79.     while (central.connected()) {
  80.       long currentMillis = millis();
  81.       // если 200 миллисекунд прошли, снова проверяем сердцебиение:
  82.       if (currentMillis - previousMillis >= 200) {
  83.         previousMillis = currentMillis;
  84.         updateHeartRate();
  85.       }
  86.     }
  87.     // если центральное устройство отключилось, выключаем светодиод:
  88.     digitalWrite(13, LOW);
  89.     Serial.print("Disconnected from central: ");  //  "Отключились от центрального устройства: "
  90.     Serial.println(central.address());
  91.   }
  92. }
  93.  
  94. void updateHeartRate() {
  95.   /* Считываем уровень напряжения на 0-ом входном аналоговом контакте.
  96.      Это используется для эмуляции датчика сердцебиения.
  97.   */
  98.   int heartRateMeasurement = analogRead(A0);
  99.   int heartRate = map(heartRateMeasurement, 0, 1023, 0, 100);
  100.   if (heartRate != oldHeartRate) {      // если пульс изменился
  101.     Serial.print("Heart Rate is now: ");  //  "Пульс сейчас: " сообщаем об этом
  102.     Serial.println(heartRate);
  103.     const unsigned char heartRateCharArray[2] = { 0, (char)heartRate };
  104.     heartRateChar.setValue(heartRateCharArray, 2);  // и обновляем характеристику для измерения сердцебиения
  105.     oldHeartRate = heartRate;           // сохраняем считанное значение для сравнения при следующем проходе через цикл
  106.   }
  107. }

Что дальше

Протокол Bluetooth Low Energy включает в себя и другие сервисы, к примеру, Alert Notification Service (для уведомлениях о текстовых сообщениях), Environmental Sensing (для отображения информации о состоянии окружающей среды: скорости и направлении ветра, точки росы, влажности и т.д.), AutomationIO (для отображения данных от модулей ввода-вывода) и т.д. Все эти сервисы тоже можно использовать с платой Arduino, управляя и считывая данные с подключенных к ней компонентов.

Данный пример использует nRF Toolbox, но это приложение работает только с девятью сервисами. Если вы хотите использовать другие сервисы (как в примерах для библиотеки CurieIMU), мы рекомендуем использовать приложения LightBlue (для iOS) и nRF Control Panel (для Android).

См.также

  1. Heart Rate Monitor
  2. Battery Monitor
  3. Button LED
  4. Callback LED
  5. LED

Внешние ссылки

  1. Arduino.cc - Genuino101CurieBLEHeartRateMonitor