</> Задания по ArduinoПрактические работы для Tinkercad Circuits · Школа № 2094

← все задания

02Кнопка-переключатель

Сделайте так, чтобы одно нажатие кнопки включало светодиод, а следующее — выключало его.

Начальный

Задание

  1. Подключите кнопку к пину 2, а светодиод — к пину 9.
  2. Внутренний подтягивающий резистор Arduino включим программно (INPUT_PULLUP), внешний не нужен.
  3. Напишите программу, которая реагирует именно на момент нажатия, а не на удержание.
  4. Проверьте: нажали — светодиод горит, нажали ещё раз — погас.
  5. Дополнительно: объясните, почему без переменной lastButtonState светодиод мигал бы, пока кнопка удерживается.

Что понадобится

  • Arduino Uno
  • Кнопка (тактовая)
  • Светодиод
  • Резистор 220 Ом
  • Провода

Схема

Схема: Кнопка-переключатель

Соберите схему в Tinkercad Circuits так же, как на картинке.

Код

Скопировать нельзя специально — наберите код руками и подумайте над каждой строкой.

1const int buttonPin = 2;
2const int ledPin = 9;
3bool ledState = false;
4bool lastButtonState = HIGH;
5 
6void setup()
7{
8 pinMode(ledPin, OUTPUT);
9 pinMode(buttonPin, INPUT_PULLUP);
10}
11 
12void loop()
13{
14 bool currentButtonState = digitalRead(buttonPin);
15 if (lastButtonState == HIGH && currentButtonState == LOW)
16 {
17 ledState = !ledState;
18 digitalWrite(ledPin, ledState);
19 delay(200);
20 }
21 lastButtonState = currentButtonState;
22}

Что делает каждая строка

СтрокаЧто делает
1–2Константы buttonPin = 2 и ledPin = 9: номера пинов кнопки и светодиода. Слово const означает, что менять их нельзя.
3ledState — логическая переменная: false = светодиод выключен, true = включён. Хранит состояние между проходами цикла.
4lastButtonState — состояние кнопки на прошлом проходе. Изначально HIGH (не нажата), потому что вход подтянут к питанию.
6–10setup(): пин светодиода — выход (OUTPUT). Пин кнопки — вход с внутренней подтяжкой (INPUT_PULLUP): при ненажатой кнопке на пине 5 В (HIGH), при нажатой 0 В (LOW).
12–13Начало бесконечного цикла loop().
14digitalRead(buttonPin) читает текущее состояние кнопки и кладёт его в currentButtonState.
15Условие «нажатие только что произошло»: в прошлый раз было HIGH (не нажата), а сейчас LOW (нажата). Так мы ловим именно момент нажатия.
16–18Если нажатие произошло: ledState = !ledState инвертирует состояние (было true — станет false), digitalWrite применяет его к светодиоду.
19delay(200) — пауза-антидребезг: контакты кнопки дребезжат, и без паузы одно нажатие могло бы посчитаться несколько раз.
20–21Запоминаем текущее состояние кнопки как «прошлое» для следующего прохода. Без этой строки кнопка работала бы неправильно.
22Конец loop(); условие внутри срабатывает один раз за нажатие.