Espruino:Примеры/Управление другими Espruino-устройствами при помощи BLE: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Myagkij (обсуждение | вклад) Нет описания правки |
||
(не показано 6 промежуточных версий 2 участников) | |||
Строка 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 | <syntaxhighlight lang="javascript"> | ||
var on = 0; | var on = 0; | ||
function toggle() { | function toggle() { | ||
Строка 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 | <syntaxhighlight lang="javascript"> | ||
// Мы заняты? | // Мы заняты? | ||
var busy = false; | var busy = false; | ||
Строка 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]], пока не загорится зеленый [[светодиод]]. | ||
{{Примечание1|Функция [[sendToggle()]] в коде для центрального [[Puck.js]] также проверяет, не занят ли он. Если занят, [[NRF.requestDevice()]] незамедлительно вызовет исключение, в котором будет сказано, что центральный [[Puck.js]] в данный момент уже выполняет BLE-задачу.}} | |||
== Как ускорить процесс == | == Как ускорить процесс == | ||
Вы, наверно, уже заметили, что управление другим Puck.js требует времени. Это происходит, потому что нам надо сначала воспользоваться requestDevice(), чтобы найти ведомый Puck.js, а затем подключиться к нему | Вы, наверно, уже заметили, что управление другим [[Puck.js]] требует времени. Это происходит, потому что нам надо сначала воспользоваться [[requestDevice()]], чтобы найти ведомый [[Puck.js]], а затем подключиться к нему. | ||
<syntaxhighlight lang="javascript | Этот процесс можно сделать и быстрее, но для этого нам надо будет спуститься на уровень чуть глубже, чем позволяет модуль ''«ble_simple_uart»'', и получить доступ к отдельным характеристикам, как описывается в статье [http://wikihandbk.com/wiki/Espruino:Примеры/Введение_в_Bluetooth_Light_Energy_(BLE) «Введение в Bluetooth Light Energy (BLE)»]. | ||
<syntaxhighlight lang="javascript"> | |||
* Снова подключитесь к ведущему Puck.js (если отключились). | * Снова подключитесь к ведущему Puck.js (если отключились). | ||
* Скопируйте в правую часть IDE вот этот код: | * Скопируйте в правую часть IDE вот этот код: | ||
Строка 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]] и будет тянуть заряд батареи.''' | ||
=См.также= | =См.также= | ||
=Внешние ссылки= | =Внешние ссылки= | ||
Строка 154: | Строка 155: | ||
<references /> | <references /> | ||
{{Навигационная таблица/Espruino}} | {{Навигационная таблица/Портал/Espruino}} | ||
[[Категория:Пример]] | |||
[[Категория:Примеры]] | |||
[[Категория:digitalWrite]] | |||
[[Категория:digitalPulse]] | |||
[[Категория:digitalPulse()]] | |||
[[Категория:digitalWrite()]] | |||
[[Категория:NRF.requestDevice()]] | |||
[[Категория:NRF.requestDevice]] | |||
[[Категория:requestDevice()]] | |||
[[Категория:requestDevice]] | |||
[[Категория:NRF]] | |||
[[Категория:require]] | |||
[[Категория:require()]] | |||
[[Категория:setWatch]] | |||
[[Категория:setWatch()]] | |||
[[Категория:getPrimaryService]] | |||
[[Категория:getPrimaryService()]] | |||
[[Категория:getCharacteristic]] | |||
[[Категория:getCharacteristic()]] |
Текущая версия от 19:14, 27 мая 2023
Управление другими 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, пока не загорится зеленый светодиод.
Как ускорить процесс
Вы, наверно, уже заметили, что управление другим 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 и будет тянуть заряд батареи.
См.также
Внешние ссылки
- Справочник Espruino
- Espruino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Пример
- Примеры
- DigitalWrite
- DigitalPulse
- DigitalPulse()
- DigitalWrite()
- NRF.requestDevice()
- NRF.requestDevice
- RequestDevice()
- RequestDevice
- NRF
- Require
- Require()
- SetWatch
- SetWatch()
- GetPrimaryService
- GetPrimaryService()
- GetCharacteristic
- GetCharacteristic()