Esp32 управление со смартфона
ESP32 поставляется не только с Wi-Fi, но также с Bluetooth и Bluetooth Low Energy (BLE). Этот пост представляет собой краткое введение в BLE с ESP32. Сначала рассмотрим, что такое BLE и для чего его можно использовать, а затем рассмотрим некоторые примеры с ESP32, используя Arduino IDE. Для простого введения мы создадим сервер ESP32 BLE и сканер ESP32 BLE, чтобы найти этот сервер.
Представляем Bluetooth с низким энергопотреблением
Что такое Bluetooth с низким энергопотреблением?
Bluetooth Low Energy, сокращенно BLE, представляет собой энергосберегающий вариант Bluetooth. Основное применение BLE - передача небольших объемов данных на короткие расстояния (низкая пропускная способность). В отличие от Bluetooth, который всегда включен, BLE постоянно находится в спящем режиме, за исключением случаев, когда устанавливается соединение.
Это заставляет его потреблять очень мало энергии. BLE потребляет примерно в 100 раз меньше энергии, чем Bluetooth (в зависимости от варианта использования).
Кроме того, BLE поддерживает не только двухточечную связь, но также широковещательный режим и mesh сеть.
Взгляните на таблицу ниже, которая сравнивает BLE и Bluetooth более подробно.
Благодаря своим свойствам, BLE подходит для приложений, которым необходимо обмениваться небольшими объемами данных. Например, BLE отлично подходит для фитнеса, трекинга, маячков и домашней автоматизации.
BLE сервер и клиент
С Bluetooth Low Energy, есть два типа устройств: сервер и клиент. ESP32 может действовать как клиент или как сервер.
Сервер объявляет о своем существовании, чтобы его могли найти другие устройства, и содержит данные, которые клиент может прочитать. Клиент сканирует близлежащие устройства и, когда находит сервер, который ищет, он устанавливает соединение и прослушивает входящие данные. Это называется двухточечной связью.
Как упоминалось ранее, BLE также поддерживает широковещательный режим и mesh сеть:
- Режим широковещания: сервер передает данные всем подключенным клиентам;
- mesh сеть: все устройства сопряжены, это соединение многие ко многим.
Несмотря на то, что настройки широковещательной и mesh сети можно реализовать, они были разработаны совсем недавно, поэтому в настоящее время для ESP32 не так много примеров.
BLE Сервис
Верхним уровнем иерархии является профиль, который состоит из одного или нескольких сервисов. Обычно устройство BLE содержит более одного сервиса.
Каждый сервис содержит хотя бы одну характеристику или может также ссылаться на другие сервисы. Сервис - это просто набор информации, например показания датчиков. Существуют предопределенные службы для нескольких типов данных, определенных SIG (Специальная группа по интересам Bluetooth), таких как: уровень заряда батареи, артериальное давление, частота сердечных сокращений, шкала веса и т. д. Здесь можно проверить другие сервисы.
Характеристика BLE
Характеристика всегда принадлежит сервису, и именно там фактические данные содержатся в иерархии. Характеристика всегда имеет два атрибута: объявление характеристики (которое предоставляет метаданные о данных) и значение характеристики.
Кроме того, за значением характеристики могут следовать дескрипторы, которые дополнительно расширяют метаданные, содержащиеся в объявлении признака.
Операции и процедуры, которые можно использовать с признаком:
- Broadcast
- Read
- Write without response
- Write
- Notify
- Indicate
- Authenticated Signed Writes
- Extended Properties
Для всех типов, служб и профилей, указанных в SIG (Специальная группа по интересам Bluetooth), существуют сокращенные UUID.
Но если вашему приложению нужен собственный UUID, вы можете сгенерировать его с помощью веб-сайта генератора UUID.
Таким образом, UUID используется для однозначно идентифицирующей информации. Например, он может идентифицировать конкретную услугу, предоставляемую устройством Bluetooth.
BLE с ESP32
ESP32 может выступать в качестве сервера BLE или клиента BLE. Есть несколько примеров BLE для ESP32 в библиотеке BLE ESP32 для Arduino IDE. Эта библиотека устанавливается по умолчанию при установке ESP32 в Arduino IDE.
В Arduino IDE вы можете перейти в File> examples> ESP32 BLE Arduino и изучить примеры, которые поставляются с библиотекой BLE.
Примечание: чтобы увидеть примеры ESP32, вы должны выбрать плату ESP32 в меню Инструменты > Плата.
Для краткого введения в ESP32 с BLE в Arduino IDE мы создадим сервер ESP32 BLE, а затем сканер ESP32 BLE, чтобы найти этот сервер. Мы будем использовать и объяснять примеры, которые поставляются с библиотекой BLE.
Чтобы следовать этому примеру, вам нужны две платы разработки ESP32. Мы будем использовать плату ESP32 DOIT DEVKIT V1.
ESP32 BLE Server
Чтобы создать сервер BLE ESP32, откройте свою среду разработки Arduino и выберите «Файл»> «Примеры»> «BLE Arduino ESP32» и выберите пример сервера BLE_server. Должен открыться следующий код:
Для создания сервера BLE необходимо:
- Создать сервер BLE. В этом случае ESP32 действует как сервер BLE.
- Создать службу BLE.
- Создать BLE-характеристику для службы.
- Создать BLE-дескриптор для характеристики.
- Запустить службу.
- Запустить рассылку, чтобы ее могли увидеть другие устройства.
Как работает код
Давайте кратко рассмотрим, как работает пример кода сервера BLE.
Он начинается с импорта необходимых библиотек для возможностей BLE.
Затем вам нужно определить UUID для сервиса и характеристики.
В setup() запускается последовательная связь со скоростью 115200 бод.
Затем создается устройство BLE под названием «MyESP32».
В следующей строке устанавливается устройство BLE в качестве сервера.
После этого создается сервис для сервера BLE с UUID, определенным ранее.
Затем устанавливается характеристика для этой услуги.
После создания характеристики вы можете установить ее значение с помощью метода setValue ().
В этом случае мы устанавливаем значение для текста « Hello World says Neil ». В будущих проектах этот текст может быть, например, показанием датчика или состоянием лампы.
Наконец, вы можете запустить службу и рассылку, чтобы другие устройства BLE могли сканировать и находить это устройство BLE.
Это простой пример того, как создать сервер BLE. В этом коде ничего не делается в цикле loop(), но вы можете добавить действие, которое происходит, когда подключается новый клиент.
ESP32 BLE Scanner
Создать сканер ESP32 BLE очень просто. Возьмите другой ESP32 (в то время как другой выполняет скетч сервера BLE). В вашей IDE Arduino перейдите в Файл> Примеры> ESP32 BLE Arduino и выберите пример BLE_scan. Должен открыться следующий код.
Этот код инициализирует ESP32 как устройство BLE и сканирует соседние устройства. Загрузите этот код на ESP32. Возможно, временно отключить другой ESP32 от компьютера, чтобы убедиться, что загружаете код на правильную плату ESP32.
В состав платы входит классический Bluetooth. Пример можно найти в разделе Examples/BluetoothSerial/SerialToSerialBT. В примере используется библиотека BluetoothSerial.
Bluetooth Low Energy (BLE) также доступен на плате. Это тема другой статьиРассмотрим упрощённый пример без дополнительных проверок. Просто будем посылать строку любому устройству, которое подключится к нашей плате.
В реальных устройствах всё-таки не помешает дополнительная проверка.
Посылаем данные через последовательный порт
Сначала напишем простой скетч, который будет считывать данные с компьютера или смартфона.
Данные удобно посылать через приложение Putty. В настройках выбираем тип соединения Serial и выставляем скорость. Главное - не ошибиться с номером порта, попробуйте методом перебора.
Затем в блоке Terminal выбираем настройки Force on.
После запуска появляется чёрный экран консоли, в котором можно вводить команды.
Посылаемые команды отображаются в мониторе порта.
Регистрируем события
Можно не только отследить наступление события подключения клиента к плате, но и его адрес. Добавим немного дополнительного кода в функцию обратного вызова.
Снова пытаемся соединиться с платой с компьютера или телефона и получаем адреса подключаемых устройств. На скриншоте показано, как я дважды подключался к плате с разных устройств.
Включаем светодиод с телефона
Немного видоизменённый пример, в котором добавлена проверка на поступление символов 0 и 1 с Android-устройства (код для Android).
После заливки скетча нужно дождаться появления надписи "The device started, now you can pair it with bluetooth!" в мониторе порта.
Дальше нужно послать команды. Это можно сделать через программу на Android (ссылка на исходник дана выше) или можно использовать готовую программу Bluetooth Terminal.
Bluetooth Terminal также может получать данные из платы. Вам нужно набрать любое слово в мониторе порта и оно отобразится на телефоне.
В последнее время наткнулся на новый терминал Serial Bluetooth Terminal с открытыми исходниками для Android-устройств Classic Bluetooth и BLE.
Узнать адрес ESP32-устройства
С помощью низкоуровневых функций можно узнать адрес-устройства.
У каждого Bluetooth-устройства есть адрес, по которому можно определить изготовителя. На сайте можно вбить адрес и получить имя производителя.
После запуска скетча откройте монитор порта. Там вы должны увидеть адрес вида 24:0A:C4:27:07:66. Скопируйте адрес и определите производителя через сайт (ссылка выше). В моём случае это оказался Espressif Inc.
Присвоить новое имя устройству
Функция esp_bt_dev_set_device_name() позволяет присвоить устройству новое имя.
Как управлять реле по Wi-Fi и bluetooth уже рассказывал. Сегодня немного расширим данную тему и попробуем в работе новый, быстрый мокро контроллер у которого на бору двух ядерный процессор, Wi-Fi и bluetooth. Да! Вы правильно поняли, сегодня будем подключать реле к ESP32. Посмотрим на сколько данный МК быстрее стандартных bluetooth модулей: HC-05 и HC-06.
Итак приступим. Для начало подключим все вот по такой схеме.
Подключил специально на пин D2, чтобы отследить роботу. Так как на данный пин подключен светодиод платы. Он светит синим цветом когда реле выключается, это видно на видео.
Код для ESP32 и управление через bluetooth.
Код прокомментирован и в видео объясняю с «заиканием» каждую строчку. Если, что то не понятно задавайте вопросы на форуме.
Таблица ASCII
При съемках видео ступил. Символы выводил как число. Просто нужно получаемую информацию из порта получать как char. И не нужно заморачиваться с таблицей ASCII.
Для управления можно воспользоваться bluetooth терминалом. Как рассказываю тут: Урок11 - Bluetooth модуль HC-06. Управление Arduino стелефона.
Или установить приложение которое можно скачать ниже.
Вывод можно сделать следующий. ESP32 работает быстрее и стабильнее. При этом стоимость дешевле чем купить Arduino NANO и Bluetooth модуль HC-06.
Уже сравнительно давно микроконтроллер ESP32 стал неким стандартом для множества DIY проектов. И действительно, возможность работы с Wi-Fi, Bluetooth, встроенная энергонезависимая память, а так же большое число выводов позволяют сделать массу интересных проектов.
В этой статье, мы поговорим про управление конроллером с помощью BLE используя доступные в AppStore приложения. А в следующей, если она будет, про создание собственного приложения для iOS.
На основе непосредственно контроллера, существует множество плат, с различными интегрируемыми модулями: экраном, модулем для карт памяти и тд. Одной из самых удобных для новичков, которым интересно именно программирование, а не возня с кучей проводков — платформа M5Stack.
Это устройство, в базовой комплектации, включает в себя LCD-дисплей, кардридер, аккумулятор, и три кнопки. Кроме этого, к нему существует множество модулей, подключаемых по принципу «бутерброда».
Не смотря на то, что в данной статье программирование микроконтроллера будет в Arduino IDE, его так же можно программировать с помощью MicroPython, а так же собственной блоковой среды разработки — UiFlow.
Инструкцию по настройке ArduinoIDE, для работы с M5Stack можно найти здесь.
Немного про то, что же такое BLE
BLE — Bluetooth Low Energy, это протокол, который, в отличии от обычного Bluetooth, постоянно находится в спящем режиме, кроме тех случаев, когда идёт непосредственная передача данных. За счёт этого, тратится примерно в 100 раз меньше энергии, что очень важно при использовании встраиваемых устройств с аккумуляторами.
Когда мы используем протокол BLE, мы работаем с сервисами и характеристиками. Это очень напоминает протокол MQTT, где есть топики. У каждого сервиса, есть как минимум одна характеристика. Каждый сервис это просто объем информации: например состояние датчика. Характеристика включает в себя описание себя (что она умеет: читать, писать, является Broadcast-ом) и непосредственно значение.
Каждый элемент, с которым мы работаем: сервис, характеристика должен иметь свой UUID (Universally unique identifier).
Подробнее про BLE можно почитать тут.
В Ардуино, система работа с BLE примерно такая: есть сервер — это само устройство, у сервера есть сервис, а у сервиса уже есть характеристики, в которые и поступают данные. У каждого из них могут быть Callback функции.
Чтобы работать с BLE и M5Stack из Arduino IDE необходимо подключить библиотеки.
Затем сгенерировать как минимум два UUID: один для сервиса, а один для характеристики. Для генерации можно использовать UUID generator.
Создадим сервер и сервис.
Для создания какой-либо характеристики необходимо сделать следующее:
-
Объявить характеристику.
Полностью исходный код представлен на гитхабе.
Тестируем
После подключения телефона — добавляется соответствующая строка:
Заключение
Используя предложенный пример, можно достаточно легко сделать собственный функционал. А с учётом возможностей M5Stack, часть проектов не потребует никакого дополнительного оборудования.
Читайте также: