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