4.01.3. Лабораторная работа №4.1.3.md
Обработка событий
Тема работы
В предыдущей работе мы научились проверять, нажата ли кнопка в данный момент. Но в реальной жизни многие действия происходят не пока кнопка зажата, а в сам момент её нажатия или отпускания.
Пример из жизни: Попробуйте нажать на кнопку «Свернуть» у окна на вашем компьютере и, не отпуская, отведите курсор в сторону. Окно не свернётся. Действие произойдёт только в тот момент, когда вы отпустите кнопку мыши над этой иконкой.
В этой лабораторной работе мы научимся отлавливать именно такие события и создадим программу, которая будет переключать светодиод ровно в тот момент, когда вы отпускаете кнопку.
Цель
- Понять разницу между состоянием кнопки и событием нажатия/отпускания.
- Научиться отслеживать изменение состояния кнопки с помощью переменных.
- Реализовать классический алгоритм «переключателя» (toggle switch) для управления светодиодом.
Оборудование и материалы
- Отладочная плата
Рудирон. - USB-кабель для подключения
Рудиронак компьютеру. - Компьютер с настроенной средой
Arduino IDE.
Ход работы
-
Как поймать момент?
Давайте посмотрим на график сигнала, который приходит с кнопки, настроенной как
INPUT_PULLDOWN(как встроенные кнопкиРудирона).
Мы, как люди, легко видим на графике моменты нажатия и отпускания — это переходы между уровнями. Но как это «увидеть» микроконтроллеру, который проверяет состояние миллионы раз в секунду?
Чтобы обнаружить изменение, нужно сравнить то, что есть сейчас, с тем, что было в прошлом.
Для этого мы будем использовать переменные:
- Одна переменная будет хранить текущее состояние кнопки (
currentState). - Другая — состояние кнопки из предыдущей проверки (
lastState).
Если
currentStateне равноlastState, значит, произошло событие! А если мы знаем, чтоcurrentStateсталоLOW, аlastStateбылоHIGH, значит, это и есть момент отпускания кнопки. - Одна переменная будет хранить текущее состояние кнопки (
-
Настройка и подключение
Для этого эксперимента нам понадобятся только встроенные компоненты
Рудирона. Давайте вспомним, к каким пинам они подключены.Компонент Маркировка Пин Константа в коде Светодиод 1 L1 5 LED_BUILTIN_1Светодиод 2 L2 7 LED_BUILTIN_2Кнопка 1 B1 35 BUTTON_BUILTIN_1Кнопка 2 B2 31 BUTTON_BUILTIN_2Кнопка 3 B3 32 BUTTON_BUILTIN_3Подготовка платы к работе стандартная:
- Установите перемычку
PRG | RUNв положениеPRG. - Подключите плату к компьютеру и настройте
Arduino IDE(платаRudiron Buterbrod R9_16MHzи правильный COM-порт).
- Установите перемычку
-
Написание и загрузка кода
Напишем программу, которая будет переключать светодиод
L1по событию отпускания кнопкиB1.-
В
Arduino IDEсоздайте новый скетч и введите следующий код:// Переменная для хранения состояния светодиода (включен/выключен) bool ledState = false; // Переменная для хранения ПРЕДЫДУЩЕГО состояния кнопки bool lastButtonState = false; void setup() { pinMode(LED_BUILTIN_1, OUTPUT); // Настраиваем встроенную кнопку с внутренним стягивающим резистором pinMode(BUTTON_BUILTIN_1, INPUT_PULLDOWN); } void loop() { // 1. Считываем ТЕКУЩЕЕ состояние кнопки bool currentButtonState = digitalRead(BUTTON_BUILTIN_1); // 2. Сравниваем текущее состояние с предыдущим if (currentButtonState != lastButtonState) { // Если они отличаются, значит, произошло событие. // Проверяем, было ли это событие «ОТПУСКАНИЕ» if (currentButtonState == LOW) { // Кнопку только что отпустили! // Меняем состояние светодиода на противоположное ledState = !ledState; digitalWrite(LED_BUILTIN_1, ledState); } } // 3. Запоминаем текущее состояние, чтобы на следующем шаге оно стало «прошлым» lastButtonState = currentButtonState; // Небольшая задержка, чтобы уменьшить дребезг и нагрузку на процессор delay(10); } - Нажмите кнопку «Upload», чтобы загрузить код на плату.
-
-
Проверка работы
После загрузки программы светодиод
L1будет выключен.- Нажмите и удерживайте кнопку B1. Ничего не произойдёт. Светодиод не загорится.
- Теперь отпустите кнопку. В этот самый момент светодиод
L1должен загореться. - Нажмите и отпустите кнопку ещё раз. Светодиод погаснет.
Результаты
Вы создали программу, которая реагирует не на состояние, а на событие. Светодиод меняет своё состояние только в момент отпускания кнопки, что делает управление более чётким и предсказуемым, как в интерфейсах компьютерных программ.
Анализ результатов
Ключевой момент нашего алгоритма — это сравнение currentButtonState и lastButtonState. Цикл loop() выполняется очень быстро.
- Пока кнопка не нажата, обе переменные равны
LOW. - Когда вы нажимаете кнопку,
currentButtonStateстановитсяHIGH. В этот моментif (currentButtonState != lastButtonState)срабатывает, но вложенное условиеif (currentButtonState == LOW)— нет. - Пока вы держите кнопку, обе переменные равны
HIGH. - Когда вы отпускаете кнопку,
currentButtonStateстановитсяLOW. Снова срабатываетif (currentButtonState != lastButtonState), и на этот раз вложенное условиеif (currentButtonState == LOW)тоже истинно! Происходит переключение светодиода. - Наконец, строка
lastButtonState = currentButtonState;обновляет «прошлое» состояние для следующей итерации цикла.
Выводы
В этой лабораторной работе вы освоили мощный программный приём — отслеживание изменения состояния. Вы научились отличать состояние от события и реализовали алгоритм, который позволяет микроконтроллеру реагировать на конкретные действия пользователя, такие как отпускание кнопки. Этот принцип лежит в основе создания многих сложных интерфейсов.
Вопросы для самопроверки
- В чём разница между состоянием и событием при работе с кнопкой?
- Зачем в коде нужны две переменные для хранения состояния кнопки (
currentButtonStateиlastButtonState)? - Что произойдёт, если убрать строку
lastButtonState = currentButtonState;? - Как изменить код, чтобы светодиод реагировал на момент нажатия, а не отпускания?
- Для чего используется оператор
!в строкеledState = !ledState;?
Вы научились отлавливать события, и теперь ваши проекты могут стать гораздо более отзывчивыми! Переходите к следующей лабораторной работе, чтобы научиться работать с датчиком, который реагирует на положение в пространстве.
- Страницы
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home
-
imgs
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home