На прошлом уроке нам удалось создать свой проект и попробовать использование порта ввода-вывода на выход. В результате получилось помигать светодиодом, подключенным к определённой ножке порта. А теперь мы попробуем испытать порт на вход. Для этого мы сначала подключим кнопку, например к ножке GPIO4 и написать код, который будет отслеживать её состояние. Подключим кнопку одним контактом к данной ножке, а другим к общему проводу платы
Теперь проект. Мы можем также добавить новый проект и потом вносить в него изменения. Но, так как мы знаем уже, как это делать, то интереснее будет нам по нашей доброй традиции сделать проект из проекта прошлого занятия. Тем более в дальнейшем мы будем от урока к урока вносить в свои проекты не столь значительные изменения и писать весь проект заново будет по меньшей мере непроизводительно. Поэтому в нашем рабочем каталоге создадим ещё один каталог для нового проекта с именем BUTTON01 и скопируем туда каталог main, файлы sdkconfig, .project, .cproject и CMakeLists.txt из каталога проекта прошлого занятия с именем BLINK01. Откроем в блокноте файл .project и изменим там старое имя проекта на новое вот здесь и сохраним файл
Подключим наш новый проект к дереву проекта в Espressif IDE, откроем файл main.c и попробуем собрать наш проект.
Проект у нас собрался. Только нам теперь целесообразно будет в конфигурацию добавить ещё и ножку порта кнопки, ну и кое-что оттуда убрать ненужное.
Поэтому откроем Kconfig.projbuild и внесём в него некоторые изменения.
Но прежде чем мы внесём изменения, давайте и здесь настроим шрифт, так как шрифт у нас настроен только для исходных кодов, остальные файлы у нас по-прежнему отображаются с мелким шрифтом. Для этого проследуем в меню Window->Preferences, в дереве слева откроем General->Appearance->Colors and Fonts, затем в правом окне встанем на пункт Basic->Text font, нажмём кнопку Edit, изменим размер шрифта и сохраним изменения
Теперь займёмся редактированием нашего файла конфигурации.
Сначала удалим всё между строками choice BLINK_LED и endchoice, включая, соответственно и эти строки.
Вот этот пункт удаляем тоже
1 2 3 4 5 6 7 8 9 10 11 |
config BLINK_LED_RMT_CHANNEL depends on BLINK_LED_RMT int "RMT Channel" range 0 7 default 0 help Set the RMT peripheral channel. ESP32 RMT channel from 0 to 7 ESP32-S2 RMT channel from 0 to 3 ESP32-S3 RMT channel from 0 to 3 ESP32-C3 RMT channel from 0 to 1 |
Перед пунктом config BLINK_PERIOD добавим ещё один пункт для ножки порта, к которому мы подключаем кнопку, по умолчанию сразу поставим 4, чтобы не исправлять его потом
1 2 3 4 5 6 |
config BUTTON_GPIO int "Button GPIO number" range 0 48 default 4 help GPIO number Button. |
Вот этот пункт также удалим
1 2 3 4 5 6 |
config BLINK_PERIOD int "Blink period in ms" range 10 3600000 default 1000 help Define the blinking period in milliseconds. |
Пересоберём проект и зайдём в конфигуратор, где настроим только ножку порта светодиода (хотя она тоже может быть уже настроена)
Теперь, если мы попытаемся собрать проект повторно, он у нас не соберётся, так как мы удалили некоторые ненужные пункты из конфигуратора.
Во-первых, удалим файл led_strip.h и физически и из дерева проекта, а затем также удалим из main.c его подключение
#include "led_strip.h"
Удалим также вот это объявление
static uint8_t s_led_state = 0;
Затем вот этот комментарий также можно удалить
/* Blink Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an «AS IS» BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
Логи мы сегодня использовать не будем, поэтому подключение библиотеки также удалим
#include «esp_log.h»
После подключения библиотек удаляем весь код до функции app_main.
В функции app_main также удалим всё тело, кроме бесконечного цикла. Останется вот это
1 2 3 4 5 |
void app_main(void) { while (1) { } } |
В данной функции объявим две переменные и сразу их проинициализируем значениями из конфигурации
1 2 3 4 |
void app_main(void) { int led_gpio = CONFIG_BLINK_GPIO; int button_gpio = CONFIG_BUTTON_GPIO; |
Сбросим инициализацию ножек портов
1 2 3 |
int button_gpio = CONFIG_BUTTON_GPIO; gpio_reset_pin(led_gpio); gpio_reset_pin(button_gpio); |
Настроим направление работы данных ножек
1 2 3 |
gpio_reset_pin(button_gpio); gpio_set_direction(led_gpio, GPIO_MODE_OUTPUT); gpio_set_direction(button_gpio, GPIO_MODE_INPUT); |
Настроим режим работы ножки, которая работает на вход
1 2 |
gpio_set_direction(button_gpio, GPIO_MODE_INPUT); gpio_set_pull_mode(button_gpio, GPIO_PULLUP_ONLY); |
Я не объясняю, какой именно режим и какое именно направление, так как используемые макросы SDK в аргументах сами за себя говорят.
В бесконечном цикле в случае, когда на ножке GPIO4 будет обнаружен низкий уровень (кнопка нажата), мы установим высокий уровень на ножке GPIO2, тем самым зажжём светодиод, а если высокий — то установим низкий (погасим светодиод)
1 2 3 |
while (1) { if(gpio_get_level(button_gpio)) gpio_set_level(led_gpio, 0); else gpio_set_level(led_gpio, 1); |
Добавим небольшую задержку, чтобы дать работать всем остальным задачам, которые имеют или такой же приоритет, или более низкий
1 2 |
else gpio_set_level(led_gpio, 1); vTaskDelay(10 / portTICK_PERIOD_MS); |
Вот, в принципе, и весь код.
Пробуем собрать проект, прошить контроллер и смотрим результат
Итак, сегодня мы смогли поработать с ножкой порта ввода-вывода на вход, также мы научились делать проект на основе существующего.
Всем спасибо за внимание!
Предыдущий урок Программирование МК ESP32 Следующий урок
Недорогие отладочные платы ESP32 можно купить здесь: Недорогие отладочные платы ESP32
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)
Всем привет, скачал папку с исходным кодом, но при открытии папки в Espressive IDE пака с файлами не открывается, выводиться ошибка — The project description file (.project) for 'BUTTON01' is missing. This file contains important information about the project. The project will not function properly until this file is restored.
The project description file (.project) for 'BUTTON01' is missing. This file contains important information about the project. The project will not function properly until this file is restored.