Код для поиска

Урок 98-3: Как включить/выключить светодиод-переключатель с помощью кнопки на Arduino

Урок 98-3: Как включить/выключить светодиод-переключатель с помощью кнопки на Arduino

Кнопки повсюду — в пультах, бытовой технике и панелях управления — и как только одной кнопке приходится выполнять больше одной задачи, вам нужна логика переключения. Этот проект показывает, как заставить одну кнопку включать светодиод при первом нажатии и выключать при следующем, так что свет остаётся именно в том состоянии, в котором вы его оставили. Это поведение «нажми один раз, чтобы зафиксировать, нажми ещё раз, чтобы отпустить» лежит в основе почти каждой кнопки меню, выключателя питания и переключателя режимов, которые вы когда-либо будете создавать.

Светодиод с резистором на макетной плате, подключённый к Arduino с кнопкой
Светодиод с резистором на макетной плате, подключённый к Arduino с кнопкой

Как только вы поймёте переключение, тот же шаблон кода масштабируется на реальное оборудование. Вы можете использовать его, чтобы:

  • Управлять реле, которое включает лампу переменного тока или настольную лампу, с одной кнопки на панели.
  • Запускать и останавливать двигатель или насос одной кнопкой вместо двух.
  • Переключаться между режимами работы устройства (например, медленный / быстрый / выключено).
  • Собрать фиксирующуюся сигнализацию, которая остаётся включённой, пока кто-нибудь её не подтвердит.
  • Создать кнопку отключения звука для аудиопроекта, которая запоминает своё состояние.
  • Служить программным выключателем питания для гаджета с батарейным питанием, заменяя механический переключатель.

Инструктор прямо отмечает этот момент в видео (в видео на 19:52): проект вовсе не о светодиоде — он о технике переключения, которую вы можете применить к реле, драйверу двигателя или любому другому выходу.

Светодиод 5 мм зелёный

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

Список деталей намеренно минимален, так что это отличный проект, если вы только начинаете. Вам понадобится:

  • Плата Arduino — Uno, Nano или Mega подойдут.
  • Один светодиод, 3 мм или 5 мм, любого цвета.
  • Один резистор для светодиода, от 200 Ω до 1000 Ω. В расшифровке объясняется логика (в видео на 03:49): светодиод падает примерно на 2 В и потребляет около 10 мА, поэтому при питании 5 В оставшиеся 3 В должны быть погашены резистором. Закон Ома даёт 3 В ÷ 0,01 А = 300 Ω, и подойдёт всё от 300 Ω до 1000 Ω — более высокие значения просто делают светодиод тусклее.
  • Один кнопочный переключатель. В видео показаны как маленький четырёхвыводной тактильный тип, так и версия с более длинными выводами (в видео на 12:43). Если у вас нет кнопки, подойдёт и обычный переключатель — просто найдите два вывода, которые замыкают и размыкают цепь.
  • Макетная плата и несколько соединительных проводов DuPont.

Один практический совет из видео (в видео на 07:50): четырёхвыводная тактильная кнопка имеет две пары внутренне соединённых выводов. Используйте мультиметр в режиме прозвонки, чтобы найти, какие два вывода пищат вместе — это одна сторона переключателя. Подключите одну сторону к входному выводу, а другую сторону к земле.

Руководство по подключению

Схема Arduino для светодиода с кнопочным переключателем
Схема Arduino для светодиода с кнопочным переключателем
Подключение Arduino для светодиода с кнопочным переключателем
Подключение Arduino для светодиода с кнопочным переключателем

Подключение такое же, как в простых схемах со светодиодом и кнопкой, с добавленной кнопкой сверху. Анод светодиода (длинная ножка) идёт к выводу 3, а его катод (короткая ножка, на плоской стороне корпуса) соединяется через резистор с землёй. Кнопка подключается между выводом 2 и землёй — больше ничего не нужно, потому что код включает внутренний подтягивающий резистор Arduino.

Этот внутренний подтягивающий резистор стоит понять: без него плавающий входной вывод считывал бы случайный шум. Включение INPUT_PULLUP удерживает вывод на 5 В, пока кнопка разомкнута, а нажатие кнопки притягивает его к 0 В. Вот почему код рассматривает чтение LOW как «нажато» — логика инвертирована по сравнению с обычным переключателем на землю с внешним резистором.

Объяснение кода

Полный скетч доступен ниже этой статьи. Здесь мы сосредоточимся на частях, которые вы действительно захотите изменить.

В начале файла два назначения выводов определены как константы. Если вы переместите провода на другие выводы, это единственное место, которое нужно отредактировать:

const int pushButtonPin = 2;//define a pin number for push button
const int LEDPin = 3;//define a pin that is connected to LED

Далее идут три переменные состояния. Обычно вам не нужно их менять, но полезно знать, что они делают:

int pushButtonStatus = 0; // push value from pin 2
int lightStatus = 0;//light status
int pushed = 0;//push status

pushButtonStatus сохраняет необработанное показание вывода кнопки при каждом проходе цикла. lightStatus запоминает, что считал вывод кнопки в предыдущем проходе, — именно так скетч определяет момент нового нажатия, а не реагирует непрерывно. pushed — это фактический флаг переключения — он переключается между 0 и 1 и решает, должен ли светодиод быть включён или выключен.

Само переключение выполняется с помощью аккуратного арифметического приёма (в видео на 18:30). Вычитание флага из единицы инвертирует его: 1 - 0 даёт 1, а 1 - 1 даёт 0. Таким образом, одна строка переключает состояние каждый раз, когда обнаружено новое нажатие:

pushed = 1-pushed;//toggle the pushed value
delay(100);//give some time for finger to press

Задержка в 100 мс нужна, чтобы ваш палец успел отпустить кнопку. Без неё одно физическое нажатие могло бы быть посчитано несколько раз. Если ваша кнопка работает ненадёжно или палец дрожит, увеличьте это значение (в видео на 40:39).

Условие, которое запускает переключение, — это ключ ко всему скетчу. Оно срабатывает только тогда, когда кнопка не нажата (HIGH, из-за подтягивающего резистора) и предыдущее показание было LOW — то есть кнопка только что была отпущена после нажатия:

if(pushButtonStatus == HIGH && lightStatus == LOW){
  pushed = 1-pushed;//toggle the pushed value
  delay(100);//give some time for finger to press
}

Наконец, светодиод управляется флагом переключения, а текущее показание кнопки сохраняется для следующего сравнения:

lightStatus = pushButtonStatus;
if(pushed == HIGH){
  Serial.println("Light ON");
  digitalWrite(LEDPin, HIGH); //turn the LED ON
}else{
  Serial.println("Light OFF");
  digitalWrite(LEDPin, LOW);//turn the LED OFF
}

Вы также можете открыть монитор последовательного порта на скорости 9600 бод, чтобы наблюдать сообщения "Light ON" и "Light OFF" при нажатии кнопки.

Живая демонстрация

В видео (в видео на 19:41) вы можете увидеть поведение в действии: первое нажатие включает светодиод, и он остаётся включённым после отпускания пальца. Следующее нажатие выключает его, и он остаётся выключенным. Нет необходимости удерживать кнопку, и это как раз то, чем этот проект отличается от более простой версии "удерживай, чтобы светить", рассмотренной в Уроке 98-2: Как включать и выключать светодиод с помощью кнопки на Arduino.

В видео также отмечается, что вы можете заменить светодиод на модуль реле для переключения устройств, питающихся от сети, или на драйвер двигателя для запуска и остановки двигателя. Логика переключения не меняется — меняется только выходное устройство.

Другие варианты, показанные в том же видео — плавное затухание светодиода, узор "качели", бегущий огонь, светодиодный индикатор напряжения и светофор — каждый рассматривается в своих собственных уроках, ссылки ниже.

Связанные проекты из этого видео

Главы

  • [00:00] Обзор 10 проектов со светодиодами
  • [01:00] Введение в пошаговый курс по Arduino
  • [02:29] Основы светодиодов: символ, анод, катод и расчёт резистора
  • [05:53] Проект 1: Включение и выключение светодиода
  • [12:43] Проект 2: Кнопка управляет светодиодом
  • [17:13] Проект 3: Кнопка переключает светодиод вкл/выкл
  • [20:12] Проект 4: Плавное затухание светодиода
  • [23:20] Проект 5: Плавное затухание светодиода с помощью кнопки
  • [27:32] Проект 6: Качели с двумя светодиодами
  • [30:47] Проект 7: Бегущий огонь с пятью светодиодами
  • [36:41] Проект 8: Усовершенствованный бегущий огонь с кнопкой
  • [42:25] Проект 9: Светодиодный индикатор уровня напряжения с потенциометром
  • [49:25] Проект 10: Светофор на Arduino

Изображения

push-button-and-finger
push-button-and-finger
Arduino schematic for LED
Arduino schematic for LED
Arduino wiring for LED with a push button switch
Arduino wiring for LED with a push button switch
Arduino schematic for LED with a push button switch
Arduino schematic for LED with a push button switch
LED-5mm-green
LED-5mm-green
светодиод с резистором на макетной плате, подключенный к Arduino с кнопкой
светодиод с резистором на макетной плате, подключенный к Arduino с кнопкой
935-Lessson 98-LED-3: Arduino code push button toggles LED ON/OFF
Язык: C++
This code has not been parsed yet. Please return to the admin panel to parse it.

Вещи, которые могут вам понадобиться

Файлы📁

Библиотеки Arduino (zip)

Руководство пользователя