ESP-Jumpstart: быстрое создание приложений на ESP32. Часть 1

Написание готовой прошивки для незнакомого контроллера может быть сложным процессом. Вам придется изучить кипы документации, чтобы понять, как лучше реализовать тот или иной момент. Для реализации беспроводного решения вам потребуется создать приложение для телефона, реализовать интеграцию с облачным провайдером и решить множество других задач. Этот цикл статей содержит набор лучших практик, подготовленных инженерами Espressif, с которых вы можете начать
3651
В избранное

Введение

Написание готовой прошивки может быть сложным. Процесс включает в себя принятие решений по множеству вопросов как лучше реализовать тот или иной момент. Вам потребуется создать приложение для телефона, реализовать интеграцию с облачным провайдером и решить множество других задач. Этот цикл статей содержит набор лучших практик, подготовленных инженерами Espressif, с которых вы можете начать.

Проект ESP-Jumpstart ориентирован на создание продукта на основе контроллера ESP32. Это быстрый способ начать процесс разработки вашего собственного продукта. ESP-Jumpstart представляет собой полнофункциональный, готовый к развертыванию проект «Умной розетки», реализованный в виде последовательности обучающих шагов. Результат каждого шага - это все более и более напоминающее нужный результат приложение, созданное с помощью фреймворка ESP-IDF, среды разработки программного обеспечения ESP32.

Умная розетка

Рис.1. Умная розетка

В конечном итоге, программа "Smart Power Outlet" (Умная розетка) в проекте ESP-Jumpstart позволяет реализовать устройство, задействующее одну входную кнопку и один выход GPIO. В прошивке будут реализованы следующие минимально необходимые функции:

  • Возможность для конечного пользователя настроить свою домашнюю сеть Wi-Fi с помощью приложения для телефона (iOS/Android)
  • Включение или выключение выхода GPIO
  • Использование аппаратной кнопки для физического переключения этого выхода
  • Функционал удаленного управления выходом через облако
  • Обновление прошивки по воздуху (OTA)
  • Сброс к заводским настройкам при длительном нажатии кнопки

Разумеется, вы сможете заменить драйвер сетевой розетки на драйвер другого устройства (лампочка, стиральная машина и т.д.).

Применение Jumpstart

Рис. 2. Применение Jumpstart

Для начала вам потребуется следующее:

  • Приобрести комплект разработчика на основе ESP32 (например, ESP32-DEVKITC-32U). Вы также можете использовать любую другую отладочную плату с ESP32, если она у вас уже есть.
  • Настроить рабочий компьютер (Windows, Linux или Mac), на котором будет собираться прошивка.

Для пользователей ESP8266

Функционал можно будет реализовать и на ESP8266. Для начала вам потребуется следующее:

  • Отладочная плата с ESP8266: ESP8266-DevKit-C. Вы также можете использовать любую другую плату разработки ESP8266, если она у вас уже есть.
  • ESP8266_RTOS_SDK - это Espressif IoT Development Framework для ESP8266 (https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest). Все ссылки на IDF, ESP-IDF должны быть сопоставлены с ESP8266_RTOS_SDK в контексте ESP8266.
  • Инструкции для ESP32 и ESP8266 в большинстве своем являются общими, если они не будут приводиться в разделе «Для пользователей ESP8266».

Начало работы

В этой главе мы настроим рабочее окружение и получим представление об инструментах разработки и репозиториях, доступных в ESP32.

Обзор процесса разработки

На следующей диаграмме (Рис.3) показан типичный процесс создания прошивки для ESP32.

Создание прошивки

Рис.3. Создание прошивки

Операционная система на рабочем компьютере может быть любая из Linux, Windows или Mac. Отладочная плата на основе ESP32 подключается к хосту через кабель USB. На компьютере должен быть установлен ESP-IDF (SDK Espressif), набор инструментов компилятора (tooolchain) и подготовлен код вашего проекта. Из этого кода и генерируется исполняемый образ прошивки. С помощью toolchain сформированный образ прошивки можно загрузить в отладочную плату. Логи работы микропрограммы, выполняющейся на отладочной плате, можно отслеживать с рабочего компьютера.

ESP-IDF

ESP-IDF - это Espressif IoT Development Framework для ESP32.

  • ESP-IDF - это набор библиотек и заголовочных файлов, который содержит основные программные компоненты, необходимые для создания любых программных проектов на ESP32.
  • ESP-IDF также предоставляет инструменты и утилиты, которые требуются для типичных сценариев использования в разработке и производстве, таких как build, flash, debug и measure.

Настройка IDF

Последовательность шагов для настройки IDF приведена на странице: https://docs.espressif.com/projects/esp-idf/en/release-v3.3/get-started/index.html. Пожалуйста, выполните все шаги, описанные на этой странице.

Прежде чем продолжить, убедитесь, что вы правильно настроили хост разработки и успешно создали первое приложение в соответствии с инструкцией по приведенной выше ссылке. Теперь рассмотрим подробнее состав IDF.

IDF

IDF имеет компонентный дизайн.

Компонентный дизайн

Рис. 4. Компонентный дизайн

Все программное обеспечение в IDF доступно в виде компонентов. Операционная система, сетевой стек, драйверы Wi-Fi, дополнительные модули, такие как HTTP-сервер, являются компонентами IDF.

Такое решение позволяет вам использовать ваши собственные или сторонние компоненты, созданные для ESP-IDF.

Разработчик обычно создает приложения, используя IDF. Приложения содержат бизнес-логику, любые драйверы для внешних периферийных устройств и конфигурацию SDK.

Структура приложения

Рис. 5. Структура приложения

Приложение должно содержать один main компонент. Это компонент, который содержит логику приложения. Приложение, по необходимости, может дополнительно включать другие компоненты. Makefile приложения определяет инструкции по сборке приложения. Кроме того, приложение может включать дополнительный файл sdkconfig.defaults, который выбирает конфигурацию SDK по умолчанию, которая должна быть задана для этого приложения.

Загрузка проекта ESP-Jumpstart

Репозиторий ESP-Jumpstart содержит ряд приложений, которые мы будем использовать в своих шагах. Эти приложения собираются с ESP-IDF, который вы настроили ранее. Давайте начнем с клонирования git-репозитория ESP-Jumpstart https://github.com/espressif/esp-jumpstart.

$ git clone --recursive https://github.com/espressif/esp-jumpstart

Поскольку мы предполагаем использовать прошивку для производства, имеет смысл опираться на стабильную версию IDF. В настоящее время ESP-Jumpstart использует стабильную версию 3.3 ESP-IDF. Давайте сначала переключимся на эту версию ESP-IDF.

$ cd esp-idf
$ git checkout -b release/v3.3 remotes/origin/release/v3.3
$ git submodule update --recursive

Теперь создадим наше первое приложение Hello World из ESP-Jumpstart и перенесем его на нашу отладочную плату. (Вы уже наверняка выполняли большинство из приведенных ниже команд при установке и запуске тестового приложения ESP-IDF.)

$ cd esp-jumpstart/1_hello_world
$ make -j8 menuconfig
$ export ESPPORT=/dev/cu.SLAB_USBTOUART   #Укажите корректное наименование порта
$ export ESPBAUD=921600
$ make -j8 flash monitor

Команды соберут приложение, а после успешной сборки запишут сформированную прошивку в контроллер.

После успешной перепрошивки устройство перезагрузится, и в консоли появится результат работы прошивки.

Для пользователей ESP8266

Убедитесь, что для переменной окружения IDF_PATH задан путь ESP8266_RTOS_SDK. Для работы с платформой ESP8266 нужно использовать ветку /esp8266 из  проекта esp-jumpstart. Переключитесь на эту ветку, используя следующие команды.

$ cd esp-jumpstart
$ git checkout -b platform/esp8266 origin/platform/esp8266

Код

Теперь давайте посмотрим на код приложения Hello World. Это всего лишь несколько строк кода, приведенные ниже:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void app_main()
{
    int i = 0;
    while (1) {
        printf("[%d] Hello world!\n", i);
        i++;
        vTaskDelay(5000 / portTICK_PERIOD_MS);
    }
}

Код очень простой, но обратите внимание на несколько моментов:

  • Функция app_main () является точкой входа в приложение. Все приложения начинают выполнение через вызов этой функции. Функция вызывается после того, как ядро FreeRTOS уже запущено на обоих ядрах контроллера ESP32. После инициализации операционной сиистемы FreeRTOS, она создает поток приложения, называемый основным потоком, на одном из ядер. Функция app_main () вызывается в контексте этого потока. Стек потока приложения можно настроить с помощью конфигурации SDK.
  • Функции библиотеки C, такие как printf (), strlen (), time (), могут быть вызваны напрямую. IDF использует библиотеку newlib C, которая представляет собой низкоуровневую реализацию библиотеки C. Поддерживается большинство категорий функций библиотеки C, таких как stdio, stdlib, строковые операции, math, time/timezones, операции с файлами/ папками. Поддержка std::signal, std::locale, wchrs недоступна. В нашем примере выше мы используем функцию printf () для печати в консоль.
  • FreeRTOS - операционная система, использующая оба ядра контроллера. FreeRTOS (https://www.freertos.org) предоставляет механизмы для создания задач, взаимодействия между задачами (семафоры, очереди сообщений, мьютексы), прерываний и таймеров. В нашем примере выше мы используем функцию vTaskDelay для перевода потока в спящий режим на 5 секунд. Подробная информация о API FreeRTOS доступна по адресу: https://www.freertos.org/a00106.html.

Давайте теперь создадим простую розетку с ESP32.

Драйвер

В этой главе мы создадим базовую электрическую розетку с использованием API драйверов ESP32. Устройство будет делать следующее:

  • обрабатывать кнопку, которую пользователь может нажать
  • преключать выход GPIO при каждом нажатии кнопки

В рамках этой главы мы не будем беспокоиться о «подключении» этой розетки. Это будет реализовано в последующих главах. Здесь мы сосредоточимся только на реализации простейшей функциональности розетки. Исходный код приложения можно посмотреть в папке 2_drivers/ проекта esp-jumpstart.

Код драйвера выделен в файл app_driver.c. Таким образом, позже, когда вы захотите изменить это приложение для своего продукта, вы можете просто изменить содержимое этого файла, чтобы общаться с периферийным устройством.

Кнопка

Давайте сначала создадим кнопку. На отладочной плате, как правило, есть кнопка «boot», подключенная к выводу GPIO 0. Мы настроим эту кнопку для переключения состояния розетки.

Код

Код для инициализации кнопки приведен в следующих строках:

#include <iot_button.h>

button_handle_t btn_handle=iot_button_create(JUMPSTART_BOARD_BUTTON_GPIO,
                                JUMPSTART_BOARD_BUTTON_ACTIVE_LEVEL);
iot_button_set_evt_cb(btn_handle, BUTTON_CB_RELEASE,
                            push_btn_cb, "RELEASE");

Мы используем модуль iot_button для реализации функционала кнопки. Сначала мы создаем объект iot_button. Мы указываем номер вывода GPIO и активный уровень GPIO для обнаружения нажатия кнопки. В случае DevKit-C константа JUMPSTART_BOARD_BUTTON_GPIO соответствует выходу GPIO 0.

Затем мы регистрируем функцию обратного вызова push_btn_cb, которая будет вызываться каждый раз после отпускания кнопки. Эта функция вызывается в контексте потока esp-timer. Поэтому убедитесь, что стек по умолчанию, настроенный для потока esp-timer, достаточен для вашей функции обратного вызова.

Код самой функции Push_btn_cb приведен ниже:

static void push_btn_cb(void* arg)

{

    static uint64_t previous;
    uint64_t current = xTaskGetTickCount();
    if ((current - previous) > DEBOUNCE_TIME) {
        previous = current;
        app_driver_set_state(!g_output_state);
    }
}

Функция хTaskGetTickCount() возвращает текущий временной отсчет FreeRTOS. За счет проверки интервала между соседними нажатиями устраняется дребезг контактов. (В данном случае мы игнорируем все события, возникшие в интервале 300 миллисекунд, и обрабатываем их как одно событие.) И, в случае возникновения события вызывается функция app_driver_toggle_state(), которая отвечает за включение или выключение выхода.

Управление выходом

Теперь настроим выход GPIO, чтобы он работал как выход розетки. Мы будем включать или выключать этот выход  контроллера, который, в идеале, будет управлять  реле.

Части кода

Сначала нужно выполнить инициализацию выбранного порта GPIO как показано ниже:

gpio_config_t io_conf;
io_conf.mode = GPIO_MODE_OUTPUT;
io_conf.pull_up_en = 1;
io_conf.pin_bit_mask = ((uint64_t)1 << JUMPSTART_BOARD_OUTPUT_GPIO);

/* Конфигурирование GPIO */
gpio_config(&io_conf);

В этом примере в качестве выхода определен порт GPIO 27. Код инициализирует структуру gpio_config_t с нужными настройками, чтобы установить вывод контроллера в режим выхода с включенной подтяжкой к питанию.

/* Установка GPIO */
gpio_set_level(JUMPSTART_BOARD_OUTPUT_GPIO, target);

Наконец, состояние GPIO устанавливается с помощью вызова функции gpio_set_level () .

В качестве следующего шага давайте выполним настройку Wi-Fi подключения в этой прошивке.

Wi-Fi соединение

Подключим устройство к сети Wi-Fi. В этой главе мы будем подключаться к жестко запрограммированной сети Wi-Fi, данные которой будут встроены в исполняемый образ прошивки устройства. Исходный код для этого шага приведен в папке 3_wifi_connection/ проекта esp-jumpstart.

Код

#include <esp_wifi.h>
#include <esp_event_loop.h>

tcpip_adapter_init();
esp_event_loop_init(event_handler, NULL);

wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
esp_wifi_set_mode(WIFI_MODE_STA);

wifi_config_t wifi_config = {
    .sta = {
        .ssid = EXAMPLE_ESP_WIFI_SSID,
        .password = EXAMPLE_ESP_WIFI_PASS,
    },
 };
esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);
esp_wifi_start();

Что происходит в приведенном выше коде:

  • Вызов функции с tcpip_adapter_init () инициализирует стек TCP/ IP
  • Аналогично, подсистема Wi-Fi и ее интерфейс станции инициализируются вызовами функций esp_wifi_init () и esp_wifi_set_mode ()
  • Наконец, используя жестко заданную конфигурацию SSID и пароля целевой сети Wi-Fi, мы запускаем контроллер в режиме станции, используя вызов esp_wifi_start ()

Wi-Fi - это протокол, который может генерировать асинхронные события, такие как потеря соединения, установление соединения, получение адреса DHCP и т.д. Цикл обработки событий собирает их из стека TCP/ IP и подсистемы Wi-Fi. Вызов функции esp_event_loop_init () инициализирует обработку цикла событий, отправляя их в callback функцию, зарегистрированную в первом параметре.

Эта функция может быть реализована следующим образом:

esp_err_t event_handler(void *ctx, system_event_t *event)
{
    switch(event->event_id) {
    case SYSTEM_EVENT_STA_START:
        esp_wifi_connect();
        break;
    case SYSTEM_EVENT_STA_GOT_IP:
        ESP_LOGI(TAG, "Connected with IP Address:%s",
             ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
        break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
        esp_wifi_connect();
        break;
    return ESP_OK;
}

В примере обработчик событий отрабатывает 3 события. Когда он получает событие SYSTEM_EVENT_STA_START , обработчик просит интерфейс станции подключиться к сети с помощью вызова esp_wifi_connect (). Это же действие выполняется при получении события отключения Wi-Fi.

Событие SYSTEM_EVENT_STA_GOT_IP возникает, когда контроллер ESP32 получает IP-адрес от DHCP сервера. В этом случае программа просто напечатает  IP-адрес в консоли.

Теперь вы можете изменить приложение таким образом, что бы контроллер смог , после прошивки  подключиться к вашей сети Wi-Fi. Разумеется, функциональность розетки, переключающей выход GPIO при нажатии кнопки, также сохраняется.

Но проблема заключается в том, что настройки Wi-Fi жестко запрограммированы в образе прошивки. Это может быть нормально для хобби-проекта, но в реальном продукте конечный пользователь потребует динамической настройки этого параметра. Займемся этим в следующей статье.

Дополнительные материалы:

Источник: https://docs.espressif.com

Производитель: OLIMEX Ltd.
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
ESP8266-EVB
ESP8266-EVB
OLIMEX Ltd.
Арт.: 1901665 ИНФО PDF
Доступно: 14 шт. 654,00
Отладочная плата ESP8266-EVB для высокоинтегрированной WIFI SoC ESP8266.
ESP8266-EVB 654,00
14 шт.
(на складе)
ESP8266-EVB-BAT
ESP8266-EVB-BAT
OLIMEX Ltd.
Арт.: 2090550 ИНФО
Доступно: 4 шт. 1250,00
Отладочная плата ESP8266-EVB-BAT системы на кристалле ESP8266EX.
ESP8266-EVB-BAT 1250,00
4 шт.
(на складе)
Производитель: Espressif Systems (shanghai) Pte. Ltd.
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
ESP-LAUNCHER
ESP-LAUNCHER
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739111 ИНФО PDF RND
Доступно: 28 шт. 1740,00
отладочный набор начального уровня с ограниченным набором периферии (4 Мбайт SPI-Flash + 4 Мбайт HSPI-Flash, кнопки, светодиоды, разъем Micro-USB для отладки). Тем не менее, стоит отметить, что все выводы ESP8266 соединены с внешними колодками, что позволяет расширить функционал отладочной платы по желанию пользователя.
ESP-LAUNCHER 1740,00 от 2 шт. 1740,00 от 5 шт. 1740,00 от 9 шт. 1710,00
28 шт.
(на складе)
ESP32-DEVKITC-32U
ESP32-DEVKITC-32U
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796548 ИНФО RND
Доступно: 363 шт. 963,00
Малогабаритная отладочная плата на основе модуля ESP32-WROOM-32D с 4МБ Flash, созданного на базе флагманской SoC ESP32-D0W, представляющей собой двухъядерный беспроводной процессор, поддерживающий WiFi 802.11 b/g/n (802.11n до 150 Mbps), Bluetooth v4.2 BR/EDR и BLE.
ESP32-DEVKITC-32U 963,00 от 3 шт. 837,00 от 9 шт. 824,00 от 19 шт. 787,00
86 шт.
(на складе)
277 шт.
(под заказ)
ESP8266-DEVKITC-02D-F
ESP8266-DEVKITC-02D-F
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796568 ИНФО PDF RND
Доступно: 208 шт. 779,00
Отладочный набор начального уровня для ознакомления и работы с модулями ESP-WROOM-02D
ESP8266-DEVKITC-02D-F 779,00 от 4 шт. 677,00 от 12 шт. 667,00 от 24 шт. 636,00
2 шт.
(на складе)
206 шт.
(под заказ)
ESP8266-DEVKITC-02U-F
ESP8266-DEVKITC-02U-F
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796569 ИНФО PDF RND
Доступно: 24 шт. 760,00
Отладочный набор начального уровня для ознакомления и работы с модулями ESP-WROOM-02U.
ESP8266-DEVKITC-02U-F 760,00 от 4 шт. 661,00 от 10 шт. 651,00 от 20 шт. 621,00
5 шт.
(на складе)
19 шт.
(под заказ)
ESP-Prog
ESP-Prog
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796576 ИНФО RND
Доступно: 425 шт. 1610,00
Плата Espressif ESP-Prog для программирования и отладки беспроводных микросхем и модулей производства Espressif. В отладчике применяется USB/UART-мост FT2232HL. При этом для отладки ESP32 используется JTAG, а для ESP8266 – последовательный интерфейс.
ESP-Prog 1610,00 от 2 шт. 1400,00 от 5 шт. 1380,00 от 10 шт. 1310,00
4 шт.
(на складе)
421 шт.
(под заказ)

Сравнение позиций

  • ()