Arduino:Примеры/Genuino101CurieBLEHeartRateMonitor

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Отслеживание пульса[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

Код

/*
   Правообладатель – 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).

См.также

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

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