Arduino:Примеры/Genuino101CurieBLEButtonLED

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

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


Включение/выключение светодиода через приложение[1]

Этот пример показывает, как при помощи библиотеки Curie BLE настроить двустороннюю коммуникацию между смартфоном (центральным BLE-устройством) и платой Arduino/Genuino 101 (периферийным BLE-устройством). В нем кнопка, подключенная к плате, позволит включать и выключать встроенный светодиод, подключенный к 13-ому контакту, но то же самое можно будет сделать и при помощи смартфона. Кроме того, смартфон сможет считывать состояние светодиода.

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

  • Arduino/Genuino 101
  • Кнопка
  • Резистор на 10 кОм
  • Макетная плата
  • Провода-перемычки
  • Смартфон или планшет на Android или iOS

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

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

Цепь

Вам нужно будет подключить кнопку к Arduino/Genuino 101 через резистор – пока кнопка не будет нажата, он будет держать 4-ый цифровой контакт в значении LOW. Но если нажать на кнопку, 4-ый цифровой контакт соединится с 3,3 вольтами, и получит значение HIGH.

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

CurieBLE.h – библиотека, дающая доступ ко всем параметрам, возможностям и функциям BLE-модуля платы Arduino/Genuino 101. При помощи BLE вы можете подключаться и коммуницировать со смартфонами, планшетами и прочими устройствами, поддерживающими этот стандарт. В данном руководстве BLE используется для соединения с управляющим приложением на смартфоне, а также для включения/выключения светодиода при помощи виртуальной «кнопки».

На смартфоне

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

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

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

У второй характеристики справа есть иконка с несколькими стрелочками, смотрящими вниз – если поставить на ней «X», вы тем самым включите уведомления. Это позволит вам видеть статус светодиода каждый раз, когда вы будете нажимать и отпускать кнопку.

Теперь вернемся к первой характеристике и нажмем у нее стрелочку вверх. В ответ на это действие откроется окно «Write value», и нам нужно выставить здесь тип данных на «BYTE». Это добавит маленькую запись «0x» перед строкой ввода – значит, данные нужно вводить в HEX-формате.

Нажмите на эту строку, чтобы вписать нужное значение – это будет либо «00», либо «01». Далее нажимаем SEND, тем самым отправляя плате 101 введенное нами значение и меняя статус светодиода.

Код

/*
   Правообладатель – 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; // задаем контакт для встроенного светодиода
const int buttonPin = 4; // задаем контакт для кнопки

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


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

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT); // ставим 13-ый контакт в режим OUTPUT 
  pinMode(buttonPin, INPUT); // ставим 4-ый контакт в режим INPUT

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

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

  ledCharacteristic.setValue(0);
  buttonCharacteristic.setValue(0);

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

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

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

  // считываем текущий статус контакта для кнопки: 
  char buttonValue = digitalRead(buttonPin);

  // проверяем, изменилось ли значение по сравнению с последним считыванием: 
  boolean buttonChanged = (buttonCharacteristic.value() != buttonValue);

  if (buttonChanged) {
    // статус кнопки изменился, обновляем характеристику: 
    ledCharacteristic.setValue(buttonValue);
    buttonCharacteristic.setValue(buttonValue);
  }

  if (ledCharacteristic.written() || buttonChanged) {
    // обновляем светодиод – либо если характеристика была 
    // перезаписана центральным устройством, либо если кто-то
    // отпустил или нажал на кнопку 
    if (ledCharacteristic.value()) {
      Serial.println("LED on");  //  "Светодиод включен"
      digitalWrite(ledPin, HIGH);
    } else {
      Serial.println("LED off");  //  "Светодиод выключен"
      digitalWrite(ledPin, LOW);
    }
  }
}

См.также

  1. Curie IMU Orientation Visualizer
  2. Curie IMU Accelerometer
  3. Curie IMU Accelerometer Orientation
  4. Curie IMU Gyro
  5. Curie IMU Raw Imu Data Serial
  6. Curie IMU Shock Detect
  7. Curie IMU Step Count
  8. Curie IMU Tap Detect

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