Arduino:Примеры/Genuino101CurieBLELED

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

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


Включение/выключение светодиода[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 используется для установления соединения с управляющим приложением на смартфоне и передачи значения для включения/выключения светодиода.

На смартфоне

Чтобы управлять светодиодом на Arduino/Genuino 101, вам понадобится приложение nRF Master Control Panel (BLE), которое доступно и для Android, и для iOS. Запустите его и нажмите SCAN. В итоге поиск должен выдать запись LED с кнопкой 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 – это отправит указанное значение на плату, тем самым поменяв состояние светодиода (т.е. включив или выключив его).

Код

В этом скетче блок setup() используется для того, чтобы инициализировать и настроить периферийное BLE-устройство. Начнем с того, что присваиваем устройству название «LED» и указываем UUID сервиса:

blePeripheral.setLocalName("LED");
blePeripheral.setAdvertisedServiceUuid(ledService.uuid());

Затем настраиваем BLE-сервис и добавляем характеристику переключения (она будет использоваться для управления светодиодом):

blePeripheral.addAttribute(ledService); 
blePeripheral.addAttribute(switchCharacteristic);

Выставляем значение этой характеристики на «0» (т.е. по умолчанию светодиод будет выключен):

switchCharacteristic.setValue(0);

И, наконец, запускаем рассылку пакетов-объявлений BLE-сервиса, который мы настроили выше:

blePeripheral.begin();

В блоке loop() проверяем соединение с центральным BLE-устройством, и если соединение есть, проверяем, была ли перезаписана характеристика, и если была, считываем это значение и соответствующим образом меняем состояние светодиода.

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

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

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

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

#include <CurieBLE.h>

BLEPeripheral blePeripheral;  // периферийное BLE-устройство (плата, которую вы программируете) 
BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // BLE-сервис для светодиода

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

const int ledPin = 13; // контакт для светодиода

void setup() {
  Serial.begin(9600);

  // выставляем светодиодный контакт в режим OUTPUT:
  pinMode(ledPin, OUTPUT);

  // задаем локальное имя и UUID сервиса, которые 
  // будут указаны в пакетах-объявлениях: 
  blePeripheral.setLocalName("LED");
  blePeripheral.setAdvertisedServiceUuid(ledService.uuid());

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

  // задаем начальное значение для характеристики: 
  switchCharacteristic.setValue(0);

  // запускаем рассылку пакетов-объявлений:
  blePeripheral.begin();

  Serial.println("BLE LED Peripheral");  //  "Включение/выключение светодиода на периферийном устройстве"
}

void loop() {
  // запускаем прослушку периферийных устройств, к которым можно подключиться: 
  BLECentral central = blePeripheral.central();

  // если центральное устройство подключилось к периферийному: 
  if (central) {
    Serial.print("Connected to central: ");  //  "Подключились к центральному устройству: "
    // показываем MAC-адрес центрального устройства:
    Serial.println(central.address());

    // если центральное устройство еще подключено к периферийному... 
    while (central.connected()) {
      // ...и если центральное устройство перезаписало характеристику, 
      // используем это значение для управления светодиодом: 
      if (switchCharacteristic.written()) {
        if (switchCharacteristic.value()) {   // любое значение, которое больше «0»...
          Serial.println("LED on");  //  "Светодиод включен"
          digitalWrite(ledPin, HIGH);         // ...включит светодиод...
        } else {                              // ...а значение «0»...
          Serial.println(F("LED off"));  //  "Светодиод выключен"
          digitalWrite(ledPin, LOW);          // ...выключит его
        }
      }
    }

    // если центральное устройство отключилось, сообщаем об этом: 
    Serial.print(F("Disconnected from central: "));  //  "Отключились от центрального устройства: "
    Serial.println(central.address());
  }
}

См.также

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

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