1.05. Лабораторная работа №1.5.md
Кнопоки
Тема работы
До сих пор наши программы работали сами по себе, не обращая на нас внимания. Пришло время это исправить! В этой лабораторной работе мы научим Рудирон
реагировать на наши действия. Мы напишем программу, в которой вы сможете управлять встроенными светодиодами L1
и L2
с помощью встроенных кнопок B1
и B3
. Нажали на кнопку — светодиод изменил своё состояние. Это ваш первый шаг к созданию по-настоящему интерактивных устройств!
Цель
Научиться считывать состояние кнопок и использовать его для управления светодиодами. Освоить применение условного оператора if
для принятия решений в программе.
Оборудование и материалы
- Отладочная плата
Рудирон
. - USB-кабель (тип USB-A на USB-B) для подключения
Рудирона
к компьютеру. - Компьютер с установленной средой разработки
Arduino IDE
.
Ход работы
-
Знакомство с кнопками и новой командой:
digitalRead()
На плате
Рудирон
есть три встроенные кнопки: B1, B2, B3. В этой работе мы будем использовать B1 и B3. Как и светодиоды, они подключены к определённым пинам микроконтроллера:- Кнопка
B1
подключена к пину35
. - Кнопка
B3
подключена к пину32
.
Чтобы узнать, нажата кнопка или нет, мы будем использовать новую команду —
digitalRead()
. Она «спрашивает» у пина, какое на нём напряжение, и возвращает одно из двух значений:HIGH
(высокий уровень, кнопка нажата) илиLOW
(низкий уровень, кнопка не нажата). - Кнопка
-
Настройка перемычек и подключение
Подготовка платы остаётся прежней:
- Установите перемычку
PRG | RUN
в положениеPRG
для загрузки кода. - Подключите плату
Рудирон
к компьютеру через USB-кабель. - В
Arduino IDE
выберите платуRudiron_Buterbrod_R10_20MHz
и правильный COM-порт.
- Установите перемычку
-
Написание и загрузка кода
Теперь напишем программу, которая будет «слушать» кнопки и управлять светодиодами.
-
В
Arduino IDE
создайте новый скетч и вставьте следующий код:// Объявляем константы для пинов светодиодов и кнопок const int L1Pin = 5; // Светодиод L1 const int L2Pin = 7; // Светодиод L2 const int B1Pin = 35; // Кнопка B1 const int B3Pin = 32; // Кнопка B3 // Переменные для хранения текущего состояния светодиодов bool L1State = false; // false - выключен, true - включен bool L2State = false; // Переменные для хранени предыдущего состояния кнопок bool B1Last = false; // false - не нажата, true - нажата bool B3Last = false; void setup() { // Настраиваем пины светодиодов на выход pinMode(L1Pin, OUTPUT); pinMode(L2Pin, OUTPUT); // Настраиваем пины кнопок на вход // INPUT_PULLDOWN означает, что кнопка по умолчанию "LOW" pinMode(B1Pin, INPUT_PULLDOWN); pinMode(B3Pin, INPUT_PULLDOWN); } void loop() { // Читаем состояния кнопок bool B1 = digitalRead(B1Pin); bool B3 = digitalRead(B3Pin); // Проверяем, нажата ли первая кнопка (B1) if (B1 == HIGH && B1Last == LOW) { // Если нажата, меняем состояние первого светодиода на противоположное L1State = !L1State; digitalWrite(L1Pin, L1State); // Ждём, чтобы избежать многократных срабатываний от одного нажатия delay(50); } // Проверяем, нажата ли вторая кнопка (B3) if (B3 == HIGH && B3Last == LOW) { // Если нажата, меняем состояние второго светодиода L2State = !L2State; digitalWrite(L2Pin, L2State); delay(50); // Задержка от "дребезга" } B1Last = B1; B3Last = B3; }
- Нажмите кнопку «Upload» (стрелка вправо), чтобы загрузить код на плату.
-
-
Проверка работы
После загрузки программы светодиоды будут выключены.
- Нажмите на кнопку B1. Светодиод
L1
должен загореться. Нажмите на неё ещё раз — он погаснет. - Теперь попробуйте то же самое с кнопкой B3 и светодиодом
L2
. - Вы можете управлять каждым светодиодом независимо друг от друга!
- Нажмите на кнопку B1. Светодиод
Результаты
Вы создали интерактивное устройство! Программа на вашем Рудироне
теперь считывает нажатия кнопок B1
и B3
и использует их для переключения состояния светодиодов L1
и L2
. Каждое нажатие меняет состояние соответствующего светодиода на противоположное (вкл → выкл, выкл → вкл).
Анализ результатов
Ключевым элементом этой программы является условный оператор if
. Конструкция if (B1 == HIGH)
дословно означает: «Если результат чтения пина кнопки равен HIGH
(то есть кнопка нажата), то выполнить следующий блок кода».
Внутри блока if
мы инвертируем состояние светодиода с помощью строки L1State = !L1State;
. Знак !
— это логическое «НЕ», он меняет true
на false
и наоборот. Затем мы используем digitalWrite()
, чтобы применить новое состояние к светодиоду. Небольшая задержка delay(50)
нужна, чтобы микроконтроллер не успел обработать одно нажатие как несколько (это явление называется «дребезг контактов»).
Выводы
В этой лабораторной работе вы научились:
- Считывать состояние кнопок с помощью команды
digitalRead()
. - Использовать оператор
if
для принятия решений в программе. - Создавать интерактивные устройства, которые реагируют на действия пользователя.
- Управлять состоянием светодиодов на основе сигналов от кнопок.
Теперь вы умеете не только отправлять команды, но и получать их от пользователя!
Вопросы для самопроверки
- Какая команда используется для проверки состояния кнопки?
- Какие значения может вернуть эта команда?
- Что делает оператор
if
в коде? - Зачем в коде нужна переменная
L1State
? - Как изменить программу, чтобы при нажатии на кнопку
B1
светодиодL1
только загорался, но не гас при повторном нажатии? - Что такое «дребезг контактов» и зачем в конце блоков
if
используетсяdelay(50)
?
Поздравляем с завершением первой главы! Вы прошли путь от настройки среды разработки до создания интерактивного устройства. Вы готовы двигаться дальше! Переходите ко второй главе, чтобы углубиться в основы электроники.
- Страницы
- 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