1.05. Лабораторная работа №1.5.md


Кнопоки

Тема работы

До сих пор наши программы работали сами по себе, не обращая на нас внимания. Пришло время это исправить! В этой лабораторной работе мы научим Рудирон реагировать на наши действия. Мы напишем программу, в которой вы сможете управлять встроенными светодиодами L1 и L2 с помощью встроенных кнопок B1 и B3. Нажали на кнопку — светодиод изменил своё состояние. Это ваш первый шаг к созданию по-настоящему интерактивных устройств!

Цель

Научиться считывать состояние кнопок и использовать его для управления светодиодами. Освоить применение условного оператора if для принятия решений в программе.

Оборудование и материалы

  • Отладочная плата Рудирон.
  • USB-кабель (тип USB-A на USB-B) для подключения Рудирона к компьютеру.
  • Компьютер с установленной средой разработки Arduino IDE.

Ход работы

  1. Знакомство с кнопками и новой командой: digitalRead()

    На плате Рудирон есть три встроенные кнопки: B1, B2, B3. В этой работе мы будем использовать B1 и B3. Как и светодиоды, они подключены к определённым пинам микроконтроллера:

    • Кнопка B1 подключена к пину 35.
    • Кнопка B3 подключена к пину 32.

    Чтобы узнать, нажата кнопка или нет, мы будем использовать новую команду — digitalRead(). Она «спрашивает» у пина, какое на нём напряжение, и возвращает одно из двух значений: HIGH (высокий уровень, кнопка нажата) или LOW (низкий уровень, кнопка не нажата).

    Рис. 1. Расположение кнопок на плате

  2. Настройка перемычек и подключение

    Подготовка платы остаётся прежней:

    • Установите перемычку PRG | RUN в положение PRG для загрузки кода.
    • Подключите плату Рудирон к компьютеру через USB-кабель.
    • В Arduino IDE выберите плату Rudiron_Buterbrod_R10_20MHz и правильный COM-порт.
  3. Написание и загрузка кода

    Теперь напишем программу, которая будет «слушать» кнопки и управлять светодиодами.

    • В 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» (стрелка вправо), чтобы загрузить код на плату.
  4. Проверка работы

    После загрузки программы светодиоды будут выключены.

    • Нажмите на кнопку B1. Светодиод L1 должен загореться. Нажмите на неё ещё раз — он погаснет.
    • Теперь попробуйте то же самое с кнопкой B3 и светодиодом L2.
    • Вы можете управлять каждым светодиодом независимо друг от друга!

Результаты

Вы создали интерактивное устройство! Программа на вашем Рудироне теперь считывает нажатия кнопок B1 и B3 и использует их для переключения состояния светодиодов L1 и L2. Каждое нажатие меняет состояние соответствующего светодиода на противоположное (вкл → выкл, выкл → вкл).

Анализ результатов

Ключевым элементом этой программы является условный оператор if. Конструкция if (B1 == HIGH) дословно означает: «Если результат чтения пина кнопки равен HIGH (то есть кнопка нажата), то выполнить следующий блок кода».

Внутри блока if мы инвертируем состояние светодиода с помощью строки L1State = !L1State;. Знак ! — это логическое «НЕ», он меняет true на false и наоборот. Затем мы используем digitalWrite(), чтобы применить новое состояние к светодиоду. Небольшая задержка delay(50) нужна, чтобы микроконтроллер не успел обработать одно нажатие как несколько (это явление называется «дребезг контактов»).

Выводы

В этой лабораторной работе вы научились:

  • Считывать состояние кнопок с помощью команды digitalRead().
  • Использовать оператор if для принятия решений в программе.
  • Создавать интерактивные устройства, которые реагируют на действия пользователя.
  • Управлять состоянием светодиодов на основе сигналов от кнопок.

Теперь вы умеете не только отправлять команды, но и получать их от пользователя!

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

  1. Какая команда используется для проверки состояния кнопки?
  2. Какие значения может вернуть эта команда?
  3. Что делает оператор if в коде?
  4. Зачем в коде нужна переменная L1State?
  5. Как изменить программу, чтобы при нажатии на кнопку B1 светодиод L1 только загорался, но не гас при повторном нажатии?
  6. Что такое «дребезг контактов» и зачем в конце блоков if используется delay(50)?

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