Espruino:Примеры/Управление другими Espruino-устройствами при помощи BLE: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 5: | Строка 5: | ||
=Управление другими Espruino-устройствами при помощи BLE<ref>[https://www.espruino.com/Puck.js+Controlling+Other+Pucks www.espruino.com - ]</ref>= | =Управление другими Espruino-устройствами при помощи BLE<ref>[https://www.espruino.com/Puck.js+Controlling+Other+Pucks www.espruino.com - ]</ref>= | ||
Есть три главных способа управления одним Puck.js с другого Puck.js: | Есть три главных способа управления одним [[Puck.js]] с другого [[Puck.js]]: | ||
* При помощи встроенного сервиса UART | * При помощи встроенного сервиса [[UART]] | ||
* При помощи кастомных сервисов | * При помощи кастомных сервисов | ||
* При помощи рассылки BLE-объявлений и сканирования | * При помощи рассылки [[BLE-объявлений]] и сканирования | ||
Более подробно об этом читайте в [http://wikihandbk.com/wiki/Espruino:Примеры/Введение_в_Bluetooth_Light_Energy_(BLE) статье «Введение в Bluetooth Light Energy (BLE)»]. | Более подробно об этом читайте в [http://wikihandbk.com/wiki/Espruino:Примеры/Введение_в_Bluetooth_Light_Energy_(BLE) статье «Введение в Bluetooth Light Energy (BLE)»]. | ||
Мы в этой статье воспользуемся UART, потому что это самый простой способ. | Мы в этой статье воспользуемся [[UART]], потому что это самый простой способ. | ||
== Действия для ведомого/периферийного Puck.js (которым будут управлять) == | == Действия для ведомого/периферийного Puck.js (которым будут управлять) == | ||
* Подключитесь к Puck.js при помощи Web IDE (если у вас больше двух Puck.js, запомните название этого ведомого Puck.js). | * Подключитесь к [[Puck.js]] при помощи [[Web IDE]] (если у вас больше двух [[Puck.js]], запомните название этого ведомого [[Puck.js]]). | ||
* В правой части Web IDE впишите функцию, с помощью которой будете управлять этим Puck.js: | * В правой части [[Web IDE]] впишите функцию, с помощью которой будете управлять этим [[Puck.js]]: | ||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
Строка 28: | Строка 28: | ||
* Кликните на кнопку загрузки кода. | * Кликните на кнопку загрузки кода. | ||
* Отключитесь от Puck.js. | * Отключитесь от [[Puck.js]]. | ||
== Действия для ведущего/центрального Puck.js (который будет управлять другими Puck.js) == | == Действия для ведущего/центрального Puck.js (который будет управлять другими Puck.js) == | ||
* Подключитесь к ведущему Puck.js при помощи Web IDE. | * Подключитесь к ведущему [[Puck.js]] при помощи [[Web IDE]]. | ||
* Введите в правую часть IDE вот этот код: | * Введите в правую часть [[IDE]] вот этот код: | ||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
Строка 65: | Строка 65: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* Замените название Puck.js (в коде это Puck.js 7fcf) на название своей Puck.js. | * Замените название [[Puck.js]] (в коде это ''Puck.js 7fcf'') на название своей [[Puck.js]]. | ||
* Кликните на кнопку загрузки кода в центре IDE. | * Кликните на кнопку загрузки кода в центре [[IDE]]. | ||
* Отключитесь, если хотите (это необязательно). | * Отключитесь, если хотите (это необязательно). | ||
== Тестирование == | == Тестирование == | ||
Теперь, если кликнуть на кнопку ведущего/центрального Puck.js: | Теперь, если кликнуть на кнопку ведущего/центрального [[Puck.js]]: | ||
* У него загорится синий светодиод. | * У него загорится синий [[светодиод]]. | ||
* На другом Puck.js загорится красный светодиод. | * На другом [[Puck.js]] загорится красный [[светодиод]]. | ||
* У него загорится зеленый светодиод. | * У него загорится зеленый [[светодиод]]. | ||
Или у ведущего/центрального Puck.js может загореться синий, а затем красный | Или у ведущего/центрального [[Puck.js]] может загореться синий, а затем красный [[светодиод]]ы – это значит, что связь оборвалась. В конце концов, это радиосвязь, и она надёжна не на 100%, поэтому вам нужно будет нажимать кнопку на центральном [[Puck.js]], пока не загорится зеленый [[светодиод]]. | ||
Примечание: Функция sendToggle() в коде для центрального Puck.js также проверяет, не занят ли он. Если занят, NRF.requestDevice() незамедлительно вызовет исключение, в котором будет сказано, что центральный Puck.js в данный момент уже выполняет BLE-задачу. | '''Примечание:''' Функция [[sendToggle()]] в коде для центрального [[Puck.js]] также проверяет, не занят ли он. Если занят, [[NRF.requestDevice()]] незамедлительно вызовет исключение, в котором будет сказано, что центральный [[Puck.js]] в данный момент уже выполняет BLE-задачу. | ||
== Как ускорить процесс == | == Как ускорить процесс == | ||
Вы, наверно, уже заметили, что управление другим Puck.js требует времени. Это происходит, потому что нам надо сначала воспользоваться requestDevice(), чтобы найти ведомый Puck.js, а затем подключиться к нему. | Вы, наверно, уже заметили, что управление другим [[Puck.js]] требует времени. Это происходит, потому что нам надо сначала воспользоваться [[requestDevice()]], чтобы найти ведомый [[Puck.js]], а затем подключиться к нему. | ||
Этот процесс можно сделать и быстрее, но для этого нам надо будет спуститься на уровень чуть глубже, чем позволяет модуль «ble_simple_uart», и получить доступ к отдельным характеристикам, как описывается в статье [http://wikihandbk.com/wiki/Espruino:Примеры/Введение_в_Bluetooth_Light_Energy_(BLE) «Введение в Bluetooth Light Energy (BLE)»]. | |||
Этот процесс можно сделать и быстрее, но для этого нам надо будет спуститься на уровень чуть глубже, чем позволяет модуль ''«ble_simple_uart»'', и получить доступ к отдельным характеристикам, как описывается в статье [http://wikihandbk.com/wiki/Espruino:Примеры/Введение_в_Bluetooth_Light_Energy_(BLE) «Введение в Bluetooth Light Energy (BLE)»]. | |||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
Строка 140: | Строка 141: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* Замените название Puck.js (в коде это Puck.js 7fcf) на название своей Puck.js. | * Замените название [[Puck.js]] (в коде это ''Puck.js 7fcf'') на название своей [[Puck.js]]. | ||
* Кликните на кнопку загрузки кода в середине IDE. | * Кликните на кнопку загрузки кода в середине [[IDE]]. | ||
* Нажмите на кнопку на Puck.js – связь по-прежнему будет работать медленно (как и прежде). | * Нажмите на кнопку на [[Puck.js]] – связь по-прежнему будет работать медленно (как и прежде). | ||
* Нажмите на кнопку ещё несколько раз – теперь Puck.js должен подключиться и найти TX-характеристику, и всё будет выполняться очень быстро. | * Нажмите на кнопку ещё несколько раз – теперь [[Puck.js]] должен подключиться и найти TX-характеристику, и всё будет выполняться очень быстро. | ||
* Когда всё будет готово, нажмите reset(). '''Если этого не сделать, Puck.js останется подключенным даже после отключения от IDE и будет тянуть заряд батареи.''' | * Когда всё будет готово, нажмите [[reset()]]. '''Если этого не сделать, Puck.js останется подключенным даже после отключения от IDE и будет тянуть заряд батареи.''' | ||
=См.также= | =См.также= |
Версия от 15:31, 25 июня 2021
Управление другими Espruino-устройствами при помощи BLE[1]
Есть три главных способа управления одним Puck.js с другого Puck.js:
- При помощи встроенного сервиса UART
- При помощи кастомных сервисов
- При помощи рассылки BLE-объявлений и сканирования
Более подробно об этом читайте в статье «Введение в Bluetooth Light Energy (BLE)».
Мы в этой статье воспользуемся UART, потому что это самый простой способ.
Действия для ведомого/периферийного Puck.js (которым будут управлять)
- Подключитесь к Puck.js при помощи Web IDE (если у вас больше двух Puck.js, запомните название этого ведомого Puck.js).
- В правой части Web IDE впишите функцию, с помощью которой будете управлять этим Puck.js:
var on = 0;
function toggle() {
on = !on;
digitalWrite(LED, on);
}
- Кликните на кнопку загрузки кода.
- Отключитесь от Puck.js.
Действия для ведущего/центрального Puck.js (который будет управлять другими Puck.js)
// Мы заняты?
var busy = false;
// Функция, которая будет отправлять функцию toogle()
// на другой Puck.js:
function sendToggle() {
if (!busy) {
busy = true;
digitalPulse(LED3, 1, 500); // включаем синий светодиод,
// чтобы показать, что мы заняты
NRF.requestDevice({ filters: [{ name: 'Puck.js 7fcf' }] }).then(function(device) {
require("ble_simple_uart").write(device, "toggle()\n", function() {
digitalPulse(LED2, 1, 500); // включаем зеленый светодиод,
// чтобы показать,
// что работа сделана
busy = false;
});
}).catch(function() {
digitalPulse(LED1, 1, 500); // включаем красный светодиод,
// если возникла проблема
busy = false;
});
}
}
// Вызываем sendToggle() при нажатии на кнопку:
setWatch(sendToggle, BTN, { edge:"rising", debounce:50, repeat: true });
- Замените название Puck.js (в коде это Puck.js 7fcf) на название своей Puck.js.
- Кликните на кнопку загрузки кода в центре IDE.
- Отключитесь, если хотите (это необязательно).
Тестирование
Теперь, если кликнуть на кнопку ведущего/центрального Puck.js:
- У него загорится синий светодиод.
- На другом Puck.js загорится красный светодиод.
- У него загорится зеленый светодиод.
Или у ведущего/центрального Puck.js может загореться синий, а затем красный светодиоды – это значит, что связь оборвалась. В конце концов, это радиосвязь, и она надёжна не на 100%, поэтому вам нужно будет нажимать кнопку на центральном Puck.js, пока не загорится зеленый светодиод.
Примечание: Функция sendToggle() в коде для центрального Puck.js также проверяет, не занят ли он. Если занят, NRF.requestDevice() незамедлительно вызовет исключение, в котором будет сказано, что центральный Puck.js в данный момент уже выполняет BLE-задачу.
Как ускорить процесс
Вы, наверно, уже заметили, что управление другим Puck.js требует времени. Это происходит, потому что нам надо сначала воспользоваться requestDevice(), чтобы найти ведомый Puck.js, а затем подключиться к нему.
Этот процесс можно сделать и быстрее, но для этого нам надо будет спуститься на уровень чуть глубже, чем позволяет модуль «ble_simple_uart», и получить доступ к отдельным характеристикам, как описывается в статье «Введение в Bluetooth Light Energy (BLE)».
* Снова подключитесь к ведущему Puck.js (если отключились).
* Скопируйте в правую часть IDE вот этот код:
// Мы заняты?
var busy = false;
// В случае успешного подключения это будет переменной для устройства:
var connected = false;
// В случае успешного подключения это будет характеристикой «tx»:
var txCharacteristic = false;
// Эта функция будет вызывать toggle() на другом Puck.js:
function sendToggle() {
if (!busy) {
busy = true;
if (!connected) {
NRF.requestDevice({ filters: [{ name: 'Puck.js 7fcf' }] }).then(function(device) {
return device.gatt.connect();
}).then(function(d) {
connected = d;
return d.getPrimaryService("6e400001-b5a3-f393-e0a9-e50e24dcca9e");
}).then(function(s) {
return s.getCharacteristic("6e400002-b5a3-f393-e0a9-e50e24dcca9e");
}).then(function(c) {
txCharacteristic = c;
busy = false;
// Теперь, наконец, отправляем функцию toogle():
sendToggle();
}).catch(function() {
connected=false;
digitalPulse(LED1, 1, 500); // включаем красный светодиод,
// если возникла проблема
busy = false;
if (connected) connected.disconnect();
});
} else {
txCharacteristic.writeValue("toggle()\n").then(function() {
digitalPulse(LED2, 1, 500); // включаем зелёный светодиод,
// чтобы показать,
// что работа сделана
busy = false;
}).catch(function() {
digitalPulse(LED1, 1, 500); // включаем красный светодиод,
// если возникла проблема
busy = false;
});
}
}
}
// Вызываем sendToggle() при нажатии на кнопку:
setWatch(sendToggle, BTN, { edge:"rising", debounce:50, repeat: true });
- Замените название Puck.js (в коде это Puck.js 7fcf) на название своей Puck.js.
- Кликните на кнопку загрузки кода в середине IDE.
- Нажмите на кнопку на Puck.js – связь по-прежнему будет работать медленно (как и прежде).
- Нажмите на кнопку ещё несколько раз – теперь Puck.js должен подключиться и найти TX-характеристику, и всё будет выполняться очень быстро.
- Когда всё будет готово, нажмите reset(). Если этого не сделать, Puck.js останется подключенным даже после отключения от IDE и будет тянуть заряд батареи.
См.также
Внешние ссылки