Arduino:Примеры/Genuino101CurieBLELED
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Включение/выключение светодиода[1]
Этот пример показывает, как, используя смартфон/планшет, а также встроенные BLE-возможности платы Arduino/Genuino 101, включать/выключать светодиод, подключенный к 13-ому контакту. Мы создадим сервис для светодиода и будем постоянно следить за центральным BLE-устройством, ожидая, когда оно перезапишет значение в характеристике, связанной со светодиодом, которым мы хотим управлять. Этот пример схож с этим примером, где управление светодиодом осуществляется при помощи опроса и функций внешнего вызова. Значения будут отсылаться через приложение nRF Master Control Panel (BLE), которое доступно и для Android, и для iOS.
Необходимое оборудование
- Arduino или Genuino 101
- Смартфон или планшет на 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());
}
}
См.также
- Heart Rate Monitor
- Battery Monitor
- Button LED
- Callback LED