Начало работы с ESP32 с использованием ESP-IDF


В этом вводном руководстве по ESP32 с использованием ESP-IDF мы познакомим вас с некоторыми основными понятиями программирования ESP32 с помощью ESP-IDF в VS Code. Будут рассмотрены примеры логирования, генерации задержек, ввода с клавиатуры и мигания встроенного светодиода ESP32.

Начало работы с ESP32 с использованием ESP-IDF

Прежде чем продолжить, убедитесь, что у вас установлена ​​последняя версия VS Code и настроено расширение ESP-IDF:

В двух предыдущих уроках мы рассмотрели, как установить, скомпилировать, собрать и прошить код в ESP32 с помощью esp-idf. В этом уроке мы рассмотрим несколько примеров для начала работы, таких как логирование, включение отладочной информации и простая программа мигания светодиода.

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

Вход в систему ESP-IDF

ESP-IDF обладает некоторыми возможностями логирования, которые мы рассмотрим в первую очередь, поскольку они чрезвычайно полезны и используются довольно часто. Сначала мы включим файл «esp_log.h» в наши скрипты.

Вместо простого вывода сообщения с помощью команды printf, мы можем использовать различные типы логов. Библиотека логирования ESP-IDF поддерживает следующие пять уровней логирования:

  1. ESP_LOGE: Ведение журнала ошибок (самый низкий уровень)
  2. ESP_LOGW: Ведение журнала предупреждений
  3. ESP_LOGI: Информационный журнал
  4. ESP_LOGD: Отладочная инструкция
  5. ESP_LOGV: Подробный (самый высокий уровень)

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

Примечание: в функции ESP_LOGE() буква 'E' означает ошибку.

Функция логирования принимает два аргумента. Первый аргумент — это тег, а второй — отформатированная строка. Если вы зададите разные теги в разных участках кода, это упростит мониторинг этих частей кода.

В нашем скрипте мы укажем в качестве первого параметра 'LOG', который является тегом, а в качестве второго аргумента — отформатированную строку 'This is an error'. Таким образом, наша функция регистрации ошибок будет выглядеть примерно так:

Аналогичным образом мы определим разделы журналов для предупреждений, информационных сообщений, отладочной информации и подробного вывода соответственно.

Тестирование скрипта для ведения логов.

Вот как выглядит наш скрипт на данный момент:

Наш скрипт для ведения логов

Теперь давайте скомпилируем этот код. Откройте последовательный терминал, введите следующую команду и нажмите Enter:

Вот как выглядит результат после успешной прошивки микросхемы:

Результат успешной прошивки микросхемы скриптом логгирования

Давайте разберемся, что означает этот вывод. Слева направо: E означает ошибку, W — предупреждение, а I — информацию. Числа в скобках указывают время в миллисекундах после запуска приложения и вызова данной функции.

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

Включите режимы отладки и подробного вывода с помощью Menuconfig

Мы будем использовать menuconfig для включения отладочных и подробных настроек. Откройте командную строку ESP-IDF 4.3 и дождитесь загрузки переменных окружения. Теперь укажите путь к текущему корневому каталогу, как показано ниже, а затем откройте menuconfig с помощью команды idf.py menuconfig.

Включение меню конфигурации с помощью команды idf.py menuconfig

Эта команда открывает конфигурацию среды разработки Espressif IoT. Перейдите в раздел ‘Component config’ («Конфигурация компонентов»).

Раздел конфигурации компонентов в меню конфигурации ESP-IDF

Далее перейдите в раздел ‘Log output’ («Вывод в журнал»).

Раздел «Вывод в журнал» в меню конфигурации ESP-IDF

Затем перейдите к разделу ‘Default log verbosity (Info)’ («Уровень детализации журнала по умолчанию (Информация)»).

Раздел ‘Default log verbosity (Info)’ в меню конфигурации ESP-IDF

Теперь выберите ‘Verbose’. Здесь мы выбираем минимальный уровень детализации. Это означает, что мы будем получать сообщения в режиме подробного вывода и сообщения более высокого уровня (ошибки, предупреждения, информация, отладка). Однако, если бы мы выбрали ‘debug’ («Отладка»), то вывод отображал бы сообщения до уровня отладки, а подробный вывод отсутствовал бы. По сути, минимальный уровень устанавливается в следующем порядке:

Выбор минимального уровня логирования в меню конфигурации ESP-IDF

Нажмите 'Q' для выхода и сохраните настройки, нажав 'Y'.

Сохранение настроек конфигурации ESP-IDF

Включите режимы отладки и подробного вывода в коде

Мы также можем включить отладку и подробный вывод в скрипте программы. Добавьте следующую строку кода для установки конфигурации с помощью функции esp_log_level_set(). Она принимает два аргумента. Первый аргумент — это тег, а второй — фактический уровень, который мы хотим установить в качестве минимального уровня.

В нашем скрипте мы укажем в качестве первого параметра 'LOG', который является тегом, а в качестве второго аргумента — 'ESP_LOG_INFO', уровень логирования. Мы устанавливаем для тега 'LOG' уровень info. Таким образом, уровень логирования для тега LOG будет выглядеть примерно так:

Кроме того, мы добавим дополнительный набор уровней логирования с другим тегом. В первом наборе мы использовали тег 'LOG'. Во втором наборе мы установим тег 'TAG'.

Вот как сейчас выглядит наш скрипт:

Теперь запустите программу.

Наш скрипт логирования в VS Code

Вот как теперь выглядит вывод. Те сообщения с тегом 'LOG' выводились до уровня info. Это потому, что мы установили для тега 'LOG' уровень info. Однако сообщения с тегом 'TAG' выводились до уровня verbose, потому что именно это мы задали в menuconfig.

Вывод нашего лога в VS Code

Генерация задержек с помощью ESP-IDF на ESP32

Ещё одна важная концепция, которая часто используется, — это включение задержек в наши программные скрипты.

Для генерации задержек мы будем использовать FreeRTOS (на нашем сайте вы также можете более подробно прочитать про использование FreeRTOS в ESP32 с помощью ESP-IDF). Поэтому сначала мы включим необходимые для неё библиотеки в наш программный скетч.

Внутри функции цикла мы добавим задержку. Для генерации задержки мы будем использовать функцию «vTaskDelay». Она принимает в качестве первого параметра целое число (uint32), которое является константой TickType, определяющей количество тактов, которые нужно задержать. Это число соответствует такту, то есть частоте микросхемы.

Чтобы перевести тактовые секунды в миллисекунды, мы разделим их на portTICK_PERIOD_MS. Параметр portTICK_PERIOD_MS является частью директивы #defines. Он настраивается при компиляции скетча и по умолчанию устанавливается равным скорости работы микросхемы. Таким образом, 1000, разделенное на количество тактов, в течение которых работает микросхема, даст нам миллисекунды.

Пример скетча

Давайте запустим следующий скетч, чтобы увидеть, как генерируется задержка. В этом скетче мы определили TAG как 'DELAY'. Это будет заменено внутри функции ESP_LOGI() на первый параметр. В качестве второго параметра мы будем увеличивать значение целочисленной переменной 'i', которая изначально имеет значение 0. Будет сгенерирована задержка, после которой будет выведена информация в лог.

Наш скрипт с задержкой в VS Code

Теперь прошейте микросхему, введя в терминале следующую команду:

Ввод команды для прошивки микросхемы

Вот как выглядит вывод. Каждую секунду печатается новое число.

Пример работы нашего скетча с генерацией задержки

Пример мигания светодиода на ESP32 ESP-IDF

Теперь перейдём к одному из самых распространённых первых примеров, который выполняется с использованием ESP32. Мы покажем, как заставить мигать встроенный светодиод ESP32 с помощью ESP-IDF в VS Code.

Для начала создайте новый проект ESP-IDF и перейдите к файлу main.c.

Создание нового проекта в VS Code

Для начала мы подключим необходимые библиотеки для этого проекта. Это включает библиотеку driver/gpio.h, поскольку нам нужно работать с контактами GPIO, и библиотеки FreeRTOS, так как мы хотим добавить задержку для мигания светодиода.

На плате разработки ESP32 встроен светодиод, подключенный к выводу GPIO2. Поэтому мы определим переменную с именем 'LED_PIN', которая будет хранить значение вывода GPIO2. Она будет использоваться позже в коде для управления светодиодом.

Настройка GPIO для мигания светодиода

Следующий шаг — настройка вывода LED_PIN в качестве вывода GPIO. Для этого мы воспользуемся следующей функцией:

Укажите контакт LED_PIN в качестве параметра внутри этой функции.

Затем мы зададим направление вывода в качестве выходного сигнала, используя следующую функцию:

Эта функция принимает два аргумента. Первый аргумент — это номер контакта GPIO, а второй — режим (вход или выход), в который мы хотим установить этот контакт. В нашем случае мы хотим установить контакт LED_PIN как выходной.

Для мигания светодиода мы будем использовать следующие строки кода внутри функции цикла.

Сначала мы создаём целочисленную переменную с именем 'ON', которая хранит значение 0. Это флаг, который будет отслеживать, включен светодиод или выключен. Внутри цикла while мы переключаем значение переменной ON. Используя gpio_set_level(LED_PIN, ON), мы устанавливаем значение LED_PIN равным значению, сохранённому в переменной ON. Затем мы добавляем задержку перед повторным запуском цикла.

Для добавления задержки в 1 секунду между изменениями состояния светодиода мы будем использовать функцию vTaskDelay(). Эта задержка вызовет эффект мигания светодиода.

Скрипт проекта "Мигание светодиода"

Это скрипт, который мы будем использовать для мигания встроенного светодиода ESP32.

Скрипт проекта "Мигание светодиода" в VS Code

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте указать правильный COM-порт, через который подключена ваша плата.

Ввод команды для прошивки микросхемы

Вот что мы получаем в терминале после успешной прошивки.

Сообщения в терминале об успешной прошивке микросхемы

Здесь вы можете наблюдать, как встроенный светодиод ESP32 включается и выключается каждую секунду.

Тестирование работы проекта мигания светодиода

Считывание ввода с клавиатуры в ESP32 ESP-IDF

Наконец, мы покажем вам, как считывать ввод с клавиатуры от пользователя. Существует множество ситуаций, когда необходимо получить доступ к вводу с клавиатуры, например, при выборе из списка вариантов.

Сначала создадим две переменные. Одна из них будет типа char и будет хранить символ, введенный с клавиатуры.

Вторая переменная — это массив символов под названием 'str', который будет содержать символы с клавиатуры для формирования полной строки.

Следующая строка кода гарантирует, что все элементы нашего массива 'str' изначально будут установлены в 0.

Наша цель — продолжать получать ввод с клавиатуры от пользователя до тех пор, пока не будет нажата клавиша Enter. Это означает, что вводимый символ должен быть не '\n'.

Функция getchar() возвращает целое число и сохраняет его в переменной 'character'. Поскольку getchar() является неблокирующей функцией, это означает, что если символ не введен, переменная character будет содержать значение 0xff. Поэтому мы добавим дополнительное условное выражение для проверки, нажал ли пользователь клавишу на клавиатуре, проверяя, равен ли символ 0xff. Если нет, мы добавим этот символ к нашей строке. Эта строка также будет выведена на последовательный терминал, чтобы пользователь мог видеть, что он вводит.

Кроме того, мы добавим задержку в 1 секунду, чтобы не возникало проблем с вводом и сохранением клавиш в непрерывном цикле. Для генерации задержки мы будем использовать функцию vTaskDelay(), доступную в задачах FreeRTOS.

В заключение мы выведем на экран символы, введенные пользователем в последовательный терминал:

Скрипт для обработки ввода с клавиатуры

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

Скрипт для обработки ввода с клавиатуры в VS Code

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте указать правильный COM-порт, через который подключена ваша плата.

Ввод команды в VS Code для прошивки микросхемы

После успешной прошивки микросхемы введите символы и нажмите клавишу Enter. В нашем случае мы ввели символы 'welcome to esp32tutorials.com' и затем нажали Enter.

Символы для ввода с клавиатуры

После нажатия клавиши Enter в последовательном терминале отобразился следующий вывод:

Тестирование проекта ввода с клавиатуры в терминале

(Проголосуй первым!)
Загрузка...
52 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *