Espruino:Примеры/Управление другими Espruino-устройствами при помощи BLE: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 5 промежуточных версий 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" enclose="div">
<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" enclose="div">
<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 может загореться синий, а затем красный светодиоды – это значит, что связь оборвалась. В конце концов, это радиосвязь, и она надёжна не на 100%, поэтому вам нужно будет нажимать кнопку на центральном Puck.js, пока не загорится зеленый светодиод.
Или у ведущего/центрального [[Puck.js]] может загореться синий, а затем красный [[светодиод]]ы – это значит, что связь оборвалась. В конце концов, это радиосвязь, и она надёжна не на 100%, поэтому вам нужно будет нажимать кнопку на центральном [[Puck.js]], пока не загорится зеленый [[светодиод]].


Примечание: Функция sendToggle() в коде для центрального Puck.js также проверяет, не занят ли он. Если занят, NRF.requestDevice() незамедлительно вызовет исключение, в котором будет сказано, что центральный Puck.js в данный момент уже выполняет BLE-задачу.
{{Примечание1|Функция [[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)»].


<syntaxhighlight lang="javascript" enclose="div">
Этот процесс можно сделать и быстрее, но для этого нам надо будет спуститься на уровень чуть глубже, чем позволяет модуль ''«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]] и будет тянуть заряд батареи.'''


=См.также=
=См.также=


{{ads}}
 


=Внешние ссылки=
=Внешние ссылки=
Строка 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)

  • Подключитесь к ведущему Puck.js при помощи Web IDE.
  • Введите в правую часть IDE вот этот код:
// Мы заняты?
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 может загореться синий, а затем красный светодиоды – это значит, что связь оборвалась. В конце концов, это радиосвязь, и она надёжна не на 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 и будет тянуть заряд батареи.

См.также

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