Arduino:Примеры/Genuino101CurieBLECallbackLED

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

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


Включение/выключение светодиода с помощью функций внешнего вызова[1]

Этот пример показывает, как, используя смартфон/планшет, а также встроенные BLE-возможности платы Arduino/Genuino 101, включать/выключать светодиод, подключенный к 13-ому контакту. Нам нужно будет создать сервис для светодиода, запустить опрос периферийного BLE-устройства и задать несколько событий, которые будут запускать функции внешнего вызова. Значения будут отсылаться через приложение nRF Master Control Panel (BLE), которое доступно и для Android, и для iOS.

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

  • Arduino или Genuino 101
  • Смартфон или планшет (на Android или iOS)

Необходимое ПО

  • Приложение nRF Master Control Panel (BLE) для Android или iOS

Цепь

Наиболее важные части скетча

  • CurieBLE.h – библиотека, дающая доступ ко всем параметрам, возможностям и функциям BLE-модуля платы Arduino/Genuino 101. При помощи BLE вы можете подключаться и коммуницировать со смартфонами, планшетами и прочими устройствами, поддерживающими этот стандарт. В данном руководстве BLE используется для установления соединения с управляющим приложением на смартфоне и передачи значения для включения/выключения светодиода.
    • blePeripheralConnectHandler() – вызывается, когда к плате 101 подключается центральное BLE-устройство. Она показывает на мониторе порта IDE Arduino сообщение о подключении и адрес центрального устройства.
    • blePeripheralDisconnectHandler() – вызывается, когда центральное BLE-устройство отключается от платы 101. Она показывает на мониторе порта IDE Arduino сообщение об отключении и адрес центрального устройства.
    • switchCharacteristicWritten() – вызывается, когда центральное BLE-устройство перезаписывает характеристику переключения светодиода. Она включает/выключает светодиод в зависимости от значения, записанного пользователем в эту характеристику через приложение nRF Master Control Panel.

На смартфоне

Чтобы управлять светодиодом на Arduino/Genuino 101, вам понадобится приложение nRF Master Control Panel (BLE), которое доступно и для Android, и для iOS. Запустите его и нажмите SCAN. В итоге поиск должен выдать запись LEDCB с кнопкой CONNECT.

Нажмите на CONNECT, и вам откроется экран с описанием сервиса Unknown Service, предлагаемого платой 101. Этот сервис будет иметь UUID «19B10000-E8F2-537E-4F6C-D104768A1214», и он задан строчкой BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"), стоящей в самом начале скетча.

Нажмите на запись Unknown Service, чтобы открыть характеристики этого сервиса, как показано на картинке ниже. В нем будет характеристика Unknown Characteristic, в свойствах которой указано, что ее значение можно перезаписать через «Write Request» (т.е. через запрос на запись). Кроме того, справа от нее будет две иконки: стрелочка вниз означает считывание, стрелочка вверх – запись.

Нажмите на стрелочку вверх, чтобы открыть окно Write value, а затем выставьте тип данных на UINT 8 и нажмите на поле ввода, чтобы вписать нужное значение («0» или «1»). Затем нажмите на SEND – это отправит указанное значение на плату, тем самым поменяв состояние светодиода (т.е. включив или выключив его).

Код

/*
   Правообладатель – Intel Corporation (2015).  Все права защищены.

   Эта библиотека является бесплатной; ее можно распространять 
   и/или модифицировать согласно условиям Стандартной общественной
   лицензии ограниченного применения GNU (т.к. она выпущена Фондом
   свободного ПО) – либо версии 2.1 этой лицензии, либо более поздней
   версии (на ваш выбор). 

   Эта библиотека распространяется в надежде на то, что будет 
   полезна кому-либо, но БЕЗО ВСЯКИХ ГАРАНТИЙ – даже без гарантий на 
   коммерческое качество и пригодность применения для конкретных 
   целей. Более подробно читайте в Стандартной общественной лицензии
   ограниченного применения GNU. 

   Вы должны получить копию Стандартной общественной лицензии
   ограниченного применения вместе с этой библиотекой. Если не
   получили, напишите в Фонд бесплатного ПО на адрес: Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,    
   MA  02110-1301  USA 
*/


#include <CurieBLE.h>

const int ledPin = 13; // задаем контакт для встроенного светодиода 
BLEPeripheral blePeripheral; // создаем экземпляр для периферийного устройства 

BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // создаем сервис

// создаем характеристику для переключателя, а также разрешаем 
// удаленному устройству делать на ней операции записи и считывания: 
BLECharCharacteristic switchChar("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT); // делаем контакт для 13-ого светодиода выходным 

  // задаем локальное название для периферийного устройства: 
  blePeripheral.setLocalName("LEDCB");
  // задаем UUID для сервиса, который рекламирует это периферийное устройство: 
  blePeripheral.setAdvertisedServiceUuid(ledService.uuid());

  // добавляем сервис и характеристику:
  blePeripheral.addAttribute(ledService);
  blePeripheral.addAttribute(switchChar);

  // присваиваем периферийному устройству обработчики событий для подключения и отключения:
  blePeripheral.setEventHandler(BLEConnected, blePeripheralConnectHandler);
  blePeripheral.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler);

  // присваиваем характеристике обработчик события для записи нового значения:
  switchChar.setEventHandler(BLEWritten, switchCharacteristicWritten);
// задаем начальное значение для характеристики:
  switchChar.setValue(0);

  // запускаем «рекламу» сервиса:
  blePeripheral.begin();
  Serial.println(("Bluetooth device active, waiting for connections..."));  //  "Bluetooth-устройство активно, ждем подключений..."
}

void loop() {
  // запускаем опрос периферийного устройства:
  blePeripheral.poll();
}

void blePeripheralConnectHandler(BLECentral& central) {
  // обработчик события «подключение центрального устройства» 
  Serial.print("Connected event, central: ");  //  "Событие «подключение центрального устройства», адрес: "
  Serial.println(central.address());
}

void blePeripheralDisconnectHandler(BLECentral& central) {
  // обработчик события «отключение центрального устройства»
  Serial.print("Disconnected event, central: ");  //  "Событие «отключение центрального устройства», адрес: "
  Serial.println(central.address());
}

void switchCharacteristicWritten(BLECentral& central, BLECharacteristic& characteristic) {
  // центральное устройство записывает в характеристику новое значение, обновляя состояние светодиода 
  Serial.print("Characteristic event, written: ");  //  "Событие «запись в характеристику», текущий статус: "

  if (switchChar.value()) {
    Serial.println("LED on");  //  "Светодиод включен"
    digitalWrite(ledPin, HIGH);
  } else {
    Serial.println("LED off");  //  "Светодиод выключен"
    digitalWrite(ledPin, LOW);
  }
}

См.также

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

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