Espruino:Примеры/Управление другими Espruino-устройствами при помощи BLE: различия между версиями
Нет описания правки |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 78: | Строка 78: | ||
Или у ведущего/центрального [[Puck.js]] может загореться синий, а затем красный [[светодиод]]ы – это значит, что связь оборвалась. В конце концов, это радиосвязь, и она надёжна не на 100%, поэтому вам нужно будет нажимать кнопку на центральном [[Puck.js]], пока не загорится зеленый [[светодиод]]. | Или у ведущего/центрального [[Puck.js]] может загореться синий, а затем красный [[светодиод]]ы – это значит, что связь оборвалась. В конце концов, это радиосвязь, и она надёжна не на 100%, поэтому вам нужно будет нажимать кнопку на центральном [[Puck.js]], пока не загорится зеленый [[светодиод]]. | ||
{{Примечание1|Функция [[sendToggle()]] в коде для центрального [[Puck.js]] также проверяет, не занят ли он. Если занят, [[NRF.requestDevice()]] незамедлительно вызовет исключение, в котором будет сказано, что центральный [[Puck.js]] в данный момент уже выполняет BLE-задачу.}} | |||
== Как ускорить процесс == | == Как ускорить процесс == |
Текущая версия от 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()