Как подключить кнопку к ардуино
Перейти к содержимому

Как подключить кнопку к ардуино

  • автор:

Arduino.ru

В этом примеры мы рассмотрим подключение кнопки к контроллеру Arduino. При нажатие кнопки мы будем зажигать встроенный светодиод. Большинство плат Arduino имеют встроенный SMT светодиод, подключенный к выходу 13 (pin 13).

Необходимые компоненты
  • контроллер Arduino
  • тактовая кнопка
  • 10кОм резистор
  • контактная макетная плата
  • соединительные провода
Подключение

Подключаем кнопку к Arduino

Подключаем выход питания (5V) и землю (Gnd), красным и черным проводом соответственно к макетной плате. Обычно на макетных платах для питания и земли используют крайние ряды контактов, как показано на рисунке. Третьим синим проводом мы соединяем цифровой пин 2 контроллера Arduino к контакту тактовой кнопки. К этому же контакту, либо к контакту, постоянно соединенному с ней в 4х штырковом исполнении, подключаем подтягивающий резистор 10 кОм, который в свою очередь соединяем с землей. Другой выход кнопки соединяем с питанием 5 В.

Когда тактовая кнопка не нажата, выход 2 подключен только к земле через подтягивающий резистор и на этом входе будет считываться LOW. А когда кнопка нажата появляется контакт между входом 2 и питанием 5В, и считываться будет HIGH.

Замечание: Чаще всего тактовые кнопки имеют по два контакта с каждой стороны так, как это показано на рисунке подключение. При этом по форме кнопка почти квадратная. ВАЖНО не перепутать при подключении какие контакты соединены, а какие замыкаются при нажатие. Лучше всего прозвонить кнопку если не уверены.

Можно также подключить кнопку наоборот — через подтягивающий резистор к питанию и через кнопку к земле. Тогда с входа будет считваться HIGH, а при нажатие кнопки LOW.

Если вход оставить неподключенным, то на входе будет считываться HIGH или LOW случайным образом. Именно поэтому мы используем подтягивающий резистор, чтобы задать определенное значение при ненажатой кнопке.

Схема

Cхема подключения кнопки к Arduino

Код
/* Кнопка Включаем и выключаем светодиод нажатием кнопки. created 2005 by DojoDave modified 28 Oct 2010 by Tom Igoe This example code is in the public domain. */ // задаем константы const int buttonPin = 2; // номер входа, подключенный к кнопке const int ledPin = 13; // номер выхода светодиода // переменные int buttonState = 0; // переменная для хранения состояния кнопки void setup() < // инициализируем пин, подключенный к светодиоду, как выход pinMode(ledPin, OUTPUT); // инициализируем пин, подключенный к кнопке, как вход pinMode(buttonPin, INPUT); >void loop() < // считываем значения с входа кнопки buttonState = digitalRead(buttonPin); // проверяем нажата ли кнопка // если нажата, то buttonState будет HIGH: if (buttonState == HIGH) < // включаем светодиод digitalWrite(ledPin, HIGH); >else < // выключаем светодиод digitalWrite(ledPin, LOW); >>

Смотрите также

Кнопка

Кнопки очень часто используются в электронике. На первый взгляд, работа с ними не таит сюрпризов, но и тут есть «подводные камни».

Хотя у кнопки есть четыре ножки, фактически можно рассматривать их два участка цепи, который замыкается сверху. Следите за правильностью подключения, чтобы цепь была корректной.

Button

Подключим кнопку без использования контроллера, пропустив ток из 5V. При нажатии кнопки цепь замкнётся и светодиод будет светиться. Ничего неожиданного.

Button

В реальности нам нужно считывать сигнал с кнопки и реагировать на него. Поэтому попробуем изменить схему. Соединим один вывод кнопки с питанием и выводом 3 на плате. С вывода 3 мы будем считывать информацию: логический ноль или логическая единица. При нажатии на кнопку цепь замыкается, на выводе 3 будет логическая единица и мы включим светодиод.

Button

 int buttonPin = 12; int ledPin = 3; void setup() < pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); >void loop()

Код прекрасно работает при нажатии кнопки. А когда мы отпускаем кнопку и создаём разрыв в цепи, то возникает проблема. Вывод 12 становится свободным и висит в неопределённом состоянии в режиме INPUT (вспоминаем урок про цифровые выводы). В результате мы получаем случайные значения и светодиод то включается, то выключается от наводок.

Чтобы избежать этой проблемы, можно добавить резистор от 10 до 100 кОм и прижать кнопку к земле. В этом случае цепь будет замкнута даже при отпущенной кнопке. В этом случае резистор называют стягивающим (pull down). Это рабочая схема, которую можно использовать в учебной программе.

Несмотря на рабочую схему с стягивающим резистором, мы получаем проблему при работе со сложным проектом. Дело в том, что возможна ситуация, когда многие устройства в схеме используют разные значения питания. И тогда придётся к каждой кнопке устройства подавать свой отдельный стягивающий резистор. На практике принято подключаться не к питанию, а к земле, которая всегда одинакова и равно 0. В этом случае сам резистор следует подключить к питанию — подтянуть. Резистор в этом случае является подтягивающим (pull up). Правда, при этом возникает другая проблема — поведение светодиода изменилось противоположным образом — при нажатии светодиод выключается, а при отпускании — включается. Решается проблема просто — меняем одну строчку кода.

 digitalWrite(ledPin, !val); 

Мы просто меняем значение переменной на противоположное. Это стандартный подход при работе с кнопкой. Теперь вам будет легче разобраться с примерами из Arduino IDE.

Стоит отметить, что у платы Arduino у выводов уже есть встроенные подтягивающие резисторы (кроме вывода 13) и мы можем убрать внешний резистор. Но тогда надо также явно указать использование данного резистора через код с параметром INPUT_PULLUP.

 int buttonPin = 12; int ledPin = 3; void setup() < pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); >void loop()

01.Basics: DigitalReadSerial (Чтение цифрового вывода)

Изучим пример DigitalReadSerial из File | Examples | 01.Basics.

Мы изучили, как правильно подключать кнопку и можем изучать встроенные примере. Будем считывать сигнал, идущий с цифрового вывода при нажатии кнопки.

Приблизительно собранная схема может выглядеть следующим образом:

Вкратце опишу на словах данную схему. Вставляем в центре макетной платы кнопку таким образом, чтобы между парными ножками проходил жёлоб макетной платы. Далее соединяем перемычками питание 5V и землю GND на Arduino с рельсами на макетной плате. Потом соединяем перемычкой цифровой вывод под номером 2 на Arduino с одной ножкой кнопки на макетной плате. Эту же ножку кнопки, но с другой стороны соединяем с резистором, который выполняет роль стягивающего резистора. После чего сам резистор соединяем с землёй. Третью ножку кнопки соединяем к положительной рельсе на макетной плате. Осталось только соединить между собой боковые рельсы на макетной плате, и мы готовы изучать новый пример.

Кнопка выполняет очень важную функцию — она замыкает цепь при нажатии. Когда кнопка не нажата, то ток не проходит между ножками кнопки, и не можем поймать сигнал с цифрового вывода под номером 2. Поэтому состояние вывода определяется системой как LOW или 0. При нажатии на кнопку его две ножки соединяются, позволяя току пройти от питания к цифровому выводу 2, а система считывает проходящий сигнал как HIGH или 1.

Разберём код по кусочкам

 // Второй вывод связан с кнопкой int pushButton = 2; void setup() < Serial.begin(9600); pinMode(pushButton, INPUT); >void loop() < int buttonState = digitalRead(pushButton); Serial.println(buttonState); delay(1); // задержка для стабильности >

В функции setup() устанавливаем связь с портом для считывания данных на скорости 9600 бит в секунду с Arduino на ваш компьютер: Serial.begin(9600).

Вторая строчка нам уже знакома, но здесь теперь используется параметр INPUT — мы устанавливаем второй цифровой вывод на режим чтения данных, поступающих с кнопки: pinMode(pushButton, INPUT);

В цикле считываем поступающую информацию. Для начала нам понадобится новая переменная buttonState, которая будет содержать значения 0 или 1, поступающие от функции digitalRead().

Чтобы мы могли видеть поступающую информацию, нужно вывести получаемые результаты в окно Serial Monitor при помощи команды println().

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

Если вы сейчас запустите программу и откроете также окно Serial Monitor (меню Tools | Serial Monitor), то на экране увидите бесконечные нули. Программа постоянно опрашивает состояние нашей конструкции и выводит результат — отсутствие тока. Если нажать на кнопку и удерживать её, то увидите, что цифры сменяются с 0 на 1. Значит в нашей цепи появился ток и информация изменилась.

02.Digital: Button

Работа с кнопкой рассматривается также в примере File | Examples | 02.Digital | Button. Кнопка соединяется с выводом 2, а светодиод с выводом 13. К кнопке также следует подвести питание и землю через резистор на 10K. Сам принцип работы остался без изменений. Только на этот раз мы не будем выводить информацию о состоянии кнопки на экран, а будем включать светодиод. Такой вариант более наглядный. При нажатии и отпускании кнопки встроенный светодиод должен загораться или гаснуть.

Button

 const int buttonPin = 2; // вывод для кнопки const int ledPin = 13; // вывод для светодиода int buttonState = 0; // статус кнопки - нажата или отпущена void setup() < // режим вывода для светодиода pinMode(ledPin, OUTPUT); // режим ввода для кнопки pinMode(buttonPin, INPUT); >void loop() < // считываем состояние кнопки buttonState = digitalRead(buttonPin); // если кнопка нажата, то её состояние HIGH: if (buttonState == HIGH) < // включаем светодиод digitalWrite(ledPin, HIGH); >else < // иначе выключаем светодиод digitalWrite(ledPin, LOW); >> 

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

 if (buttonState == LOW) 

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

Нужно поменять полярность цепи! Провод от резистора, который на землю, нужно воткнуть в 5V, а провод, который шёл из 5V к кнопке, перекинуть на землю. При включении ток пойдёт из питания на вывод 2 без всяких помех и будет получено значение HIGH. При нажатии кнопки получится другая цепь, и вывод 2 останется без питания.

02.Digital: StateChangeDetection

В примере File | Examples | 02.Digital | StateChangeDetection идёт подсчёт щелчков кнопки и состояние кнопки (включён или выключен). Схема осталась прежней. Кнопка соединяется с выводом 2, а светодиод с выводом 13 (можно использовать встроенный). К кнопке также следует подвести питание и стягивающий резистор к земле на 10K.

 const int buttonPin = 2; // кнопка на выводе 2 const int ledPin = 13; // светодиод на выводе 13 int buttonPushCounter = 0; // счётчик нажатия кнопки int buttonState = 0; // текущее состояние кнопки int lastButtonState = 0; // предыдущее состояние кнопки void setup() < // устанавливаем режим ввода для кнопки pinMode(buttonPin, INPUT); // устанавливаем режим вывода для светодиода pinMode(ledPin, OUTPUT); // включаем последовательную передачу данных Serial.begin(9600); >void loop() < // считываем показания с вывода кнопки buttonState = digitalRead(buttonPin); // сравниваем состояние с предыдущим состоянием if (buttonState != lastButtonState) < // если состояние изменилось, увеличиваем счётчик if (buttonState == HIGH) < // если текущее состояние HIGH, значит кнопка включена buttonPushCounter++; Serial.println("on"); Serial.print("number of button pushes: "); Serial.println(buttonPushCounter); >else < // если текущее состояние LOW, значит кнопка выключена Serial.println("off"); >// небольшая задержка для устранения эффекта дребезга delay(50); > // сохраняем текущее состояние как последнее состояние для следующего раза lastButtonState = buttonState; // включаем светодиод при каждом четвёртом нажатии, проверяя деление по остатку счётчика нажатий if (buttonPushCounter % 4 == 0) < digitalWrite(ledPin, HIGH); >else < digitalWrite(ledPin, LOW); >> 

02.Digital: Debounce (Дребезг)

У кнопок существует такой эффект, как «дребезг». При замыкании и размыкании между пластинами кнопки возникают микроискры, провоцирующие до десятка переключений за несколько миллисекунд. Явление называется дребезгом (англ. bounce). Это нужно учитывать, если необходимо фиксировать «клики». Поэтому первичным показаниям верить нельзя. По этой причине часто в скетчах делают небольшую задержку, а уже потом считывают показания. В обычном состоянии, когда мы не нажимаем кнопку или держим кнопку нажатой, эффекта дребезга не наблюдается. Иногда для этих целей в учебных примерах используют функцию delay(), но на практике следует использовать функцию millis(), как в примере File | Examples | 02.Digital | Debounce. Схема подключения остаётся без изменений.

 const int buttonPin = 2; // кнопка на выводе 2 const int ledPin = 13; // светодиод на выводе 13 int ledState = HIGH; // текущее состояние светодиода int buttonState; // текущее состояние вывода для кнопки int lastButtonState = LOW; // предыдущее состояние вывода для кнопки // используем тип без знака, чтобы использовать большие числа unsigned long lastDebounceTime = 0; // последнее время unsigned long debounceDelay = 50; // задержка, увеличьте в случае необходимости void setup() < pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, ledState); >void loop() < // считываем состояние кнопки int reading = digitalRead(buttonPin); // если нажали кнопку, // то немного ожидаем, чтобы исключить дребезг // если состояние изменилось (дребезг или нажатие) if (reading != lastButtonState) < // сбрасываем таймер lastDebounceTime = millis(); >if ((millis() - lastDebounceTime) > debounceDelay) < // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // если состояние кнопки изменилось if (reading != buttonState) < buttonState = reading; // переключаем светодиод, если новое состояние кнопки стало HIGH if (buttonState == HIGH) < ledState = !ledState; >> > // устанавливаем светодиод digitalWrite(ledPin, ledState); // сохраняем состояние кнопки. В следующий раз в цикле это станет значением lastButtonState: lastButtonState = reading; > 

02.Digital: DigitalInputPullup (Встроенный подтягивающий резистор)

У цифровых выводов уже есть резисторы на 20 кОм, которые можно использовать в качестве подтягивающих при работе с кнопками. Рассмотрим пример File | Examples | 02.Digital | DigitalInputPullup.

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

Pull-up

 void setup() < Serial.begin(9600); // настроим вывод 2 на режим ввода и включим встроенный подтягивающий резистор pinMode(2, INPUT_PULLUP); pinMode(13, OUTPUT); // светодиод >void loop() < // снимаем показания кнопки int sensorVal = digitalRead(2); // выводим в Serial Monitor Serial.println(sensorVal); // Помните, что при использовании подтягивающего к питанию резистора, состояние кнопки инвертировано // В не нажатом состоянии кнопка имеет значение HIGH, и LOW при нажатии. // При нажатии на кнопку включим светодиод, при отпускании - выключим if (sensorVal == HIGH) < digitalWrite(13, LOW); >else < digitalWrite(13, HIGH); >> 

Если запустить скетч, то увидим, что на монитор выводятся числа 1 (HIGH). При нажатии на кнопку значения поменяются на 0 (LOW).

Arduino для начинающих. Урок 2. Подключение кнопки

Share Button

banner

Продолжаем серию уроков “Arduino для начинающих”. Сегодня подключаем к ардуино кнопку и светодиод (при нажатой кнопке светодиод будет гореть, при отжатой — не гореть). Это одна из базовых схем, которая неоднократно пригодиться вам в будущем и может использоваться для управления роботом на Arduino. В вашем будущем роботе по нажатию кнопки могут происходить самые разные действия.

В посте помимо видео-инструкции приводим листинг программы и схему подключения.

Видео-инструкция сборки модели кнопки на Arduino:

Для сборки модели нам потребуется:

  • плата Arduino
  • Breadboard
  • 5 проводов и/или перемычек «папа-папа»
  • светодиод
  • кнопка
  • резисторы на 10 кОм и 220 Ом.

компоненты

Что понадобится для подключения кнопки на Arduino?

Схема подключения модели Arduino с кнопкой и светодиодом:

подключить на Arduino кнопку и светодиод

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

Также вам потребуется программа Arduino IDE, которую можно скачать с сайта Arduino.

Для работы этой модели подойдет следующая программа (программу вы можете просто скопировать в Arduino IDE):
int button = 2;
int led = 8;
void setup() pinMode(led, OUTPUT);
pinMode(button, INPUT);
>
void loop() if (digitalRead(button) == HIGH) digitalWrite(led, HIGH);
>
else digitalWrite(led, LOW);
>
>

Так выглядит собранная модель Arduino кнопки со светодиодом:

схема

Готовая модель с кнопкой и светодиодом на Arduino

На этом второй урок «Arduino для начинающих» закончен. Продолжение следует!

саша

Смотрите также:

Посты по урокам:

  1. Первый урок: Светодиод
  2. Второй урок: Кнопка
  3. Третий урок: Потенциометр
  4. Четвертый урок: Сервопривод
  5. Пятый урок: Трехцветный светодиод
  6. Шестой урок: Пьезоэлемент
  7. Седьмой урок: Фоторезистор
  8. Восьмой урок: Датчика движения (PIR) и E-mail
  9. Девятый урок: Подключение датчика температуры и влажности DHT11 или DHT22

Все посты сайта «Занимательная робототехника» по тегу Arduino.

Наш YouTube канал, где публикуются видео-уроки.

Не знаете, где купить Arduino? Все используемые в уроке комплектующие входят в большинство готовых комплектов Arduino, их также можно приобрести по отдельности. Подробная инструкция по выбору здесь. Низкие цены, спецпредложения и бесплатная доставка на сайтах AliExpress и DealExtreme. Если нет времени ждать посылку из Китая — рекомендуем интернет-магазины Амперка и DESSY. Низкие цены и быструю доставку предлагает интернет-магазин ROBstore. Смотри также список магазинов.

Автор: Александр Гагарин

Share Button

Читайте также

55 комментариев к статье “Arduino для начинающих. Урок 2. Подключение кнопки”

Сергей
02.11.2014
Мне очень понравилось с фоторезистором. А сделайте пожалуйста навесным монтажом.
Вячеслав
28.02.2015
С +5V провод идет на кнопку и через резистор на землю? Это же почти к.з.?
Александр
02.03.2015
Резистор на 10 ком достаточно ограничивает ток.
Констатин
06.03.2015

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

Занимательная робототехника
07.03.2015

Добрый день. Если просто соединить выводы кнопки через резистор с пином контроллера и землей, то это не работает. При нажатии кнопки пин соединяется с землей, и digitalRead будет считывать логический 0, но при отпущенной кнопке пин не будет соединен ни с какой линией и будет «висить в воздухе», и программа будет считать с вывода и 0 и 1 случайным образом. Правильное подключение предполагает, что в разомкнутом состоянии пин должен быть соединен через резистор с шиной питания, а в замкнутом — с землей, либо наоборот. Попробуйте и так, и так.
Внутри микроконтроллера есть подтягивающие резисторы. Но они могут быть программно включены или выключены. Попробуйте включить и выключить подтягивающие резисторы программно.
После того, как пин установлен в режим входа, чтобы включить на нем подтягивающий резистор нужно «записать в него 1» с помощью digitalWrite. void setup() pinMode(8, OUTPUT);
pinMode(2, INPUT);
digitalWrite(2, HIGH); //включаем подтягивающий резистор
>
void loop() digitalWrite(8, !digitalRead(2));
>

Макс
24.02.2019
Марина
04.10.2016

Была такая же проблема, долго не понимала в чем дело.
Оказалось, просто не до конца воткнула кнопку 🙂

Михаил
15.05.2015

Что нужно изменить в вашем коде, чтобы было так :
нажал на кнопку один раз — лампочка включилась,
нажал второй раз — выключилась… и так далее.. ?

Денис
19.05.2015

Есть множество вариантов решения данной задачи. Например такой: const int buttonPin = 2;
const int ledPin = 13; void setup() // initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
> void loop() digitalRead(buttonPin);
while(!digitalRead(buttonPin))<>
digitalWrite(ledPin, HIGH);
while(digitalRead(buttonPin))<>
while(!digitalRead(buttonPin))<>
digitalWrite(ledPin, LOW);
while(digitalRead(buttonPin))<> >

Роман
30.05.2015
Здравствуйте, можно ли void loop() построчно комментарий?
Занимательная робототехника
30.05.2015

void loop() <
digitalRead(buttonPin); //считываем значение с кнопки
while(!digitalRead(buttonPin))<> //пока кнопка не нажата ждем
digitalWrite(ledPin, HIGH); //включаем светодиод
while(digitalRead(buttonPin))<> //пока кнопка еще нажата ждем
while(!digitalRead(buttonPin))<>//пока кнопка не нажата ждем
digitalWrite(ledPin, LOW); //выключаем светодиод
while(digitalRead(buttonPin))<> //пока кнопка еще нажата ждем
>
То есть: ждем нажатия кнопки и включаем светодиод, затем ждем отжатия кнопки и повторного нажатия, выключаем светодиод, ждем отжатия кнопки.

Толик
13.10.2016
ошибки выдаёт с воид лупом чёта
Youjinn
21.10.2016

Подскажите что может быть, заюзал ваш код для кноки, все вроде работает но на 5-6 нажатия когда светодиод должен выключаться он горит, или должен гореть — выключаеться. В общем не 100% получаеться связь между кнопкой и светодиодом. Иногда проскакивает

Денис
19.05.2015
или можно запустить образец из digital -> debounce
он делает то же самое
Вячеслав
30.06.2015

Здравствуйте подскажите что нужно добавить в скейч что б алгоритм работы был таков: 2 кнопки Одно нажатие на кнопку 1 светодиод загорается горит 5 сек и затухает,если нажать на вторую то светик сразу гаснет?? /*
intledPin = 12;
int buttonApin = 8;
int buttonBpin = 7;
byte leds = 0;
void setup()
pinMode(ledPin, OUTPUT);
pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);
>
Void loop()
if (digitalRead(buttonApin) == LOW)
digitalWrite(ledPin, HIGH);
delay(5000);
digitalWrite(12, LOW);
>
if (digitalRead(buttonBpin) == LOW)
digitalWrite(ledPin, LOW);
>
>

Занимательная робототехника
30.06.2015

Ваш скетч не работает, потому что программа выполняет delay(5000), в этот момент ничего больше выполняться не может.
Можно использовать функцию millis(), возвращающую, сколько миллисекунд прошло с начала работы программы. int ledPin = 12;
int buttonApin = 8;
int buttonBpin = 7;
void setup()
pinMode(ledPin, OUTPUT);
pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);
>
void loop()
unsigned long currentMillis = 0;
if (digitalRead(buttonApin) == LOW)
digitalWrite(ledPin, HIGH);
currentMillis = millis();
>
if (digitalRead(buttonBpin) == LOW || millis()-currentMillis>5000)
digitalWrite(ledPin, LOW);
>
>

Вячеслав
01.07.2015
Спасибо что так быстро ответили но что то не получается( Выдает ошибку!
Занимательная робототехника
03.07.2015
В синтаксисе ошибки нет. Распишите ситуацию подробнее. Какая ошибка выдается?
Антон
08.08.2015

Помогите пожалуйста. 100 раз все проверил — светодиод не загорается. Такое ощущение, что не идет питание 5V с платы. Как можно просто диагностировать эту неисправность?

Денис
10.08.2015

Во-первых, нужно убедиться, что пины правильные. Далее, лучше всего проверить мультиметром.
Еще для простоты можно светодиод воткнуть напрямую к 5в и земле. Если будет гореть (может и взорвется), то питание идет и проблема в подключении.
Чтобы проверить подключение собственно кнопки можно загрузить код
int pushButton = 2; void setup() Serial.begin(9600);
pinMode(pushButton, INPUT);
> void loop() int buttonState = digitalRead(pushButton);
Serial.println(buttonState);
delay(100);
> И зайти в монитор порта. Если выдает при нажатии 1, то кнопка работает.

Михаил
11.08.2015

Почему не удаётся плавно запустить светодиод? //Свет плавно загорается после нажатия кнопки, кнопка нажимается ещё раз, свет моргает и гаснет.
int button = 2;
int led = 9;
int i = 0; void setup() < pinMode(led, OUTPUT); pinMode(button, INPUT); >void loop() digitalRead(button); //считываем значение с кнопки
while(!digitalRead(button))<> //пока кнопка не нажата ждем
do analogWrite(led, i);
i = i+1;
>
while(i==255);//включаем светодиод плавно
digitalWrite(led, HIGH); //включаем светодиод
while(digitalRead(button))<> //пока кнопка еще нажата ждем
while(!digitalRead(button))<>//пока кнопка не нажата ждем
digitalWrite(led, LOW);//моргаем несколько раз
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW); //выключаем светодиод
while(digitalRead(button))<> //пока кнопка еще нажата ждем
>

Денис
11.08.2015

Во-первых, неправильный цикл (http://arduino.ru/Reference/DoWhile), во-вторых, после каждого увеличения i нудно поставить delay

Михаил
11.08.2015

Благодарю, Денис! Сейчас въехал, у меня проверка условия была не верна. Сделал вот так, сейчас всё красиво.
//Свет плавно загорается после нажатия кнопки, кнопка нажимается ещё раз, свет моргает и гаснет.
int button = 2;
int led = 9;
int i = 0; void setup() < pinMode(led, OUTPUT); pinMode(button, INPUT); >void loop() digitalRead(button); //считываем значение с кнопки
while(!digitalRead(button))<> //пока кнопка не нажата ждем
do
analogWrite(led, i);
i = i+1;
delay(10);
> while(i <100);//включаем светодиод плавно медленно
do
analogWrite(led, i);
i = i+1;
delay(5);
> while(i <200);//включаем светодиод плавно средне
do
analogWrite(led, i);
i = i+1;
delay(1);
> while(i <255);//включаем светодиод плавно быстро
i = 0;//обнуление счётчика
digitalWrite(led, HIGH); //включаем светодиод
while(digitalRead(button))<> //пока кнопка еще нажата ждем
while(!digitalRead(button))<>//пока кнопка не нажата ждем
digitalWrite(led, LOW);//моргаем несколько раз
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW); //выключаем светодиод
while(digitalRead(button))<> //пока кнопка еще нажата ждем
>

Влад
19.10.2015

Объясните пожалуйста неучу=) кнопка соединена с с +5v и с землей через резистор. Зачем вообще нужно соединять с землей кнопку? Может я что то недопонимаю в принципе работы кнопки?

Занимательная робототехника
20.10.2015

Когда кнопка разомкнута, то если не было бы резистора, то на вход могли бы поступать хаотичные сигналы вместо ожидаемого нами отсутствия напряжения. Можно встретить терминологию «оставить вход в «подвешенном» состоянии». Причина — шумы, образующиеся вокруг провода производят электричество из электромагнитных волн среды.
Стягивающий резистор рядом со входом гарантирует отсутствие напряжения при разомкнутой цепи (кнопка не нажата — цепь разомкнута).

sergey
15.11.2015

Подтягивающий резистор всегда ставится к +5в а тут наоборот . Почему? Почему не используется внутренний подтягивающий резистор?

Ренат
29.11.2015

Здравствуйте.Как можно проделать этот алгоритм .По кнопке меняется режим скорости переключения диодов (5с 2c 1c 0.5c)

ЗёБрА
04.12.2015

Подскажите как создать светильник из ARDUINO UNO У меня набор «Матрёшка» НО он выводит ОЩИБКЮ. когда вожу код

Владимир
20.01.2016

Скажите пожалуйста, насколько я понимаю, перед записью нового кода, нужно удалить старый с памяти платы. Как это сделать?

Занимательная робототехника
20.01.2016
Нет, не верно. Просто загружаете новый скетч с помощью Arduino IDE
Александр
28.01.2016

помогите пожалуйста
нужно чтобы при зажатии кнопка тоесть нажал и не отпускаеш
загорелся светодиод и проигрался на mini MP3 1 трек и мр3 выключился а светодиод продолжал гореть если отпустить кнопку то все должно выключится
у меня просто получается что Mp3 гоняет один трек по кругу и я не совсем понимаю как мр3 должен выйти из цикла #include
#include
int switchPin = 9;
int ledPin = 7; void setup()
Serial.begin (9600);
mp3_set_serial (Serial);
mp3_set_volume (5);
delay (100);
pinMode (switchPin, INPUT);
pinMode (ledPin, OUTPUT);
> void loop()
< if (digitalRead(switchPin) == HIGH)
digitalWrite(ledPin, HIGH); >
else
digitalWrite(ledPin, LOW); >
if (digitalRead(switchPin) == HIGH)
delay(500);
mp3_play(1);
delay(5000);
mp3_stop(); >
else
mp3_stop(); >

Денис
30.01.2016

Т.е. проблема в том, что если кнопка зажата то мп3 должен проиграть мелодию и после этого остановиться, а сейчас при зажатии трек повторяется?

Александр
28.01.2016
как мне выйти из цикла только для mp3 не совсем понимаю
ромча
06.03.2016
very very veryveryvery GOOD!
пРЕКРАСНО
Alex
16.03.2016

Почему то малое напряжение если подключать на одну нагрузку несколько управляющих кнопок, светодиод включается но напряжение 1,3 вольта. int led_1 = 2;
int led_2 = 3;
int led_3 = 4;
int led_4 = 5; int button_1 = 6;
int button_2 = 7;
int button_3 = 8;
int button_4 = 9; int button_5 = 10;
int button_6 = 11;
int button_7 = 12;
int button_8 = 13; int button_9 = A0;
int button_10 = A1;
int button_11 = A2;
int button_12 = A3; int button_13 = A4;
int button_14 = A5; void setup()
Serial.begin(9600);
Serial.println(); pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT); pinMode(button_1, INPUT);
pinMode(button_2, INPUT);
pinMode(button_3, INPUT);
pinMode(button_4, INPUT); pinMode(button_5, INPUT);
pinMode(button_6, INPUT);
pinMode(button_7, INPUT);
pinMode(button_8, INPUT); pinMode(button_9, INPUT);
pinMode(button_10, INPUT);
pinMode(button_11, INPUT);
pinMode(button_12, INPUT); pinMode(button_13, INPUT);
pinMode(button_14, INPUT); > void loop() < if (digitalRead(button_1) == HIGH)
digitalWrite(led_1,HIGH);
>
else
digitalWrite(led_1,LOW);
> if (digitalRead(button_2) == HIGH)
digitalWrite(led_2,HIGH);
>
else
digitalWrite(led_2,LOW);
> if (digitalRead(button_3) == HIGH)
digitalWrite(led_3,HIGH);
>
else
digitalWrite(led_3,LOW);
> if (digitalRead(button_4) == HIGH)
digitalWrite(led_4,HIGH);
>
else
digitalWrite(led_4,LOW);
>
//************************************** if (digitalRead(button_5) == HIGH)
digitalWrite(led_1,HIGH);
>
else
digitalWrite(led_1,LOW);
> if (digitalRead(button_6) == HIGH)
digitalWrite(led_2,HIGH);
>
else
digitalWrite(led_2,LOW);
> if (digitalRead (button_7) == HIGH)
digitalWrite(led_3,HIGH);
>
else
digitalWrite(led_3,LOW);
> if (digitalRead (button_8) == HIGH)
digitalWrite(led_4,HIGH);
>
else
digitalWrite(led_4,LOW);
>
//********************************** if (digitalRead (button_9) == HIGH)
digitalWrite(led_1,HIGH);
>
else
digitalWrite(led_1,LOW);
> if (digitalRead (button_10) == HIGH)
digitalWrite(led_2,HIGH);
>
else
digitalWrite(led_2,LOW);
> if (digitalRead (button_11) == HIGH)
digitalWrite(led_3,HIGH);
>
else
digitalWrite(led_3,LOW);
> if (digitalRead (button_12) == HIGH)
digitalWrite(led_4,HIGH);
>
else
digitalWrite(led_4,LOW);
>
//********************************** if (digitalRead (button_13) == HIGH)
digitalWrite(led_1,HIGH);
>
else
digitalWrite(led_1,LOW);
> if (digitalRead (button_14) == HIGH)
digitalWrite(led_3,HIGH);
>
else
digitalWrite(led_3,LOW);
> >

Макс
31.08.2016

Подскажите мне не грамотному, как в уроке № 2, где собирают кнопку+диод, как модифицировать схему, чтобы нажимаешь на кнопку и диод продолжает гореть, еще раз нажимаешь диод гаснет. В исходном решении нажимаешь — горит, отпускаешь гаснет. Спасибо

Игорь
25.10.2016
Посмотри уроки Джереми Блюма. На ютубе есть с нормальным переводом от Амперки
Дмитрий
26.10.2016

Помогите пожалуйста моя идея работы скетча такая : один раз нажмешь на кнопку и все 6 светодиодов приемом бегущего огонька работают все время пока не нажмешь второй раз кнопку. Если второй раз нажать на кнопку то они перестают работать. int button = 10; int led = 2; void setup() <
int pin = 2;
for (pin = 2 ; pin pinMode ( pin , OUTPUT) ;
>
pinMode(led, OUTPUT);
pinMode(button, INPUT);
bool flag = false;
> int delay_len = 20 ; void loop() <
if (button == 1) <
for (pin = 2 ; pin blink (pin);
>
void blink ( int pin ) <
digitalWrite ( pin, HIGH ) ;
delay ( delay_len );
digitalWrite ( pin, LOW ) ;
delay ( delay_len );
>
>
if (digitalRead (button) == HIGH)
if (flag == true ;
if flag == false ;
else
if flag == true) <
digitalWrite(pin, HIGH);
else
digitalWrite(pin, LOW);
delay(500);
>
>

Артем
29.10.2016

Такая же проблема, один в один. Никак не могу понять как комбинировать несколько кодов вместе. По отдельности все работает, а как объединить кнопку и бегущую строку не понимаю.

Дмитрий
30.10.2016
У меня также.Я не знаю как соединить все вместе.
Александр
02.11.2016

Подскажите пожалуйста как добавить кнопку чтобы отключались 6 ть каналов шим ? Вот мой код :
[code]
int buttonPin = 7;
int ledPin = 9;
int potPin = A0;
int led1Pin =3; // Светодиод подключен к выходу 3
int led2Pin =5; // Светодиод подключен к выходу 5
int led3Pin =6; // Светодиод подключен к выходу 6
int led4Pin =9; // Светодиод подключен к выходу 9
int led5Pin =10; // Светодиод подключен к выходу 10
int led6Pin =11; // Светодиод подключен к выходу 11 int analog1Pin = 3; // потенциометр подключен к выходу 3
int analog2Pin = 3; // потенциометр подключен к выходу 3
int analog3Pin = 3; // потенциометр подключен к выходу 3
int analog4Pin = 3; // потенциометр подключен к выходу 3
int analog5Pin = 3; // потенциометр подключен к выходу 3
int analog6Pin = 3; // потенциометр подключен к выходу 3 int val1 = 0; // переменная для хранения значения
int val2 = 0; // переменная для хранения значения
int val3 = 0; // переменная для хранения значения
int val4 = 0; // переменная для хранения значения
int val5 = 0; // переменная для хранения значения
int val6 = 0; // переменная для хранения значения
void setup()
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(led1Pin, OUTPUT); // установка порта на выход
pinMode(led2Pin, OUTPUT); // установка порта на выход
pinMode(led3Pin, OUTPUT); // установка порта на выход
pinMode(led4Pin, OUTPUT); // установка порта на выход
pinMode(led5Pin, OUTPUT); // установка порта на выход
pinMode(led6Pin, OUTPUT); // установка порта на выход
> void loop()
val1 = analogRead(analog1Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led1Pin, val1 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val2 = analogRead(analog2Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led2Pin, val2 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val3 = analogRead(analog3Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led3Pin, val3 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val4 = analogRead(analog4Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led4Pin, val4 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val5 = analogRead(analog5Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led5Pin, val5 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val6 = analogRead(analog6Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led6Pin, val6 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
> [/code]

Александр
02.11.2016

Подскажите пожалуйста как добавить кнопку чтобы при однократном нажатии отключало 6 ть каналов шим одновременно а при повторном — включало? Вот мой код :
[code]
int buttonPin = 7;
int ledPin = 9;
int potPin = A0;
int led1Pin =3; // Светодиод подключен к выходу 3
int led2Pin =5; // Светодиод подключен к выходу 5
int led3Pin =6; // Светодиод подключен к выходу 6
int led4Pin =9; // Светодиод подключен к выходу 9
int led5Pin =10; // Светодиод подключен к выходу 10
int led6Pin =11; // Светодиод подключен к выходу 11 int analog1Pin = 3; // потенциометр подключен к выходу 3
int analog2Pin = 3; // потенциометр подключен к выходу 3
int analog3Pin = 3; // потенциометр подключен к выходу 3
int analog4Pin = 3; // потенциометр подключен к выходу 3
int analog5Pin = 3; // потенциометр подключен к выходу 3
int analog6Pin = 3; // потенциометр подключен к выходу 3 int val1 = 0; // переменная для хранения значения
int val2 = 0; // переменная для хранения значения
int val3 = 0; // переменная для хранения значения
int val4 = 0; // переменная для хранения значения
int val5 = 0; // переменная для хранения значения
int val6 = 0; // переменная для хранения значения
void setup()
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(led1Pin, OUTPUT); // установка порта на выход
pinMode(led2Pin, OUTPUT); // установка порта на выход
pinMode(led3Pin, OUTPUT); // установка порта на выход
pinMode(led4Pin, OUTPUT); // установка порта на выход
pinMode(led5Pin, OUTPUT); // установка порта на выход
pinMode(led6Pin, OUTPUT); // установка порта на выход
> void loop()
val1 = analogRead(analog1Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led1Pin, val1 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val2 = analogRead(analog2Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led2Pin, val2 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val3 = analogRead(analog3Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led3Pin, val3 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val4 = analogRead(analog4Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led4Pin, val4 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val5 = analogRead(analog5Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led5Pin, val5 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val6 = analogRead(analog6Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led6Pin, val6 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
> [/code]

Николай
30.12.2022

Чтобы реализовать отключение и включение шести каналов PWM с помощью кнопки, вам нужно будет добавить код, который опрашивает состояние кнопки и принимает решение о том, какие каналы PWM нужно включить или отключить. Вот пример такого кода: int buttonState = digitalRead(buttonPin); // считываем состояние кнопки if (buttonState == LOW) < // если кнопка нажата
// отключаем каналы PWM
analogWrite(led1Pin, 0);
analogWrite(led2Pin, 0);
analogWrite(led3Pin, 0);
analogWrite(led4Pin, 0);
analogWrite(led5Pin, 0);
analogWrite(led6Pin, 0);
> else < // иначе (кнопка н

Николай
30.12.2022

Чтобы реализовать однократное включение/выключение светодиодов при нажатии на кнопку, нужно использовать функцию digitalRead() для чтения состояния кнопки, а также использовать переменную, которая будет хранить состояние кнопки (нажата или отжата). Также может понадобиться использовать задержку, чтобы избежать многократного срабатывания кода при нажатии на кнопку. Чтобы реализовать отключение и включение нескольких каналов ШИМ при однократном нажатии на кнопку int buttonPin = 7;
int led1Pin = 3;
int led2Pin = 5;
int led3Pin = 6;
int led4Pin = 9;
int led5Pin = 10;
int led6Pin = 11; bool ledsOn = false; void setup()
pinMode(buttonPin, INPUT);
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
pinMode(led4Pin, OUTPUT);
pinMode(led5Pin, OUTPUT);
pinMode(led6Pin, OUTPUT);
> void loop()
// читаем состояние кнопки
int buttonState = digitalRead(buttonPin); // если кнопка нажата
if (buttonState == HIGH)
// инвертируем состояние переменной ledsOn
ledsOn = !leds

islam
20.11.2016

int button = 2;
int led = 8;
void setup() pinMode(led, OUTPUT);
pinMode(button, INPUT);
>
void loop() if (digitalRead(button) == HIGH) digitalWrite(led, HIGH);
>
else digitalWrite(led, LOW);
>
>
помогите пожалуйста вместо одной кнопки сделать две кнопки

Adam
27.03.2017

Добрый день,есть кнопка нажимаешь включаешь 1 светодиод 2 паралельно мигает отпускаеш кнопку отключаешь обе светодиода

Ксения
13.04.2017

всем привет, подскажите, пожалуйста! мы сделали модель и код. рабоет так: нажал на кнопку — диод горит, еще раз нажал- потух. сейсам мне надо сделать так: нажал- слабо горит, еще нажал- сильнее горит, еще нажал- сильно горит, нажал еще-потух диод. прежний код выглядит так.
int ledPin = 13;
int switchPin = 8;
boolean lastButton = LOW;
boolean ledOn = false;
boolean currentButton = LOW; void setup()
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);
> boolean debounce (boolean last)
currentButton = digitalRead (switchPin);
if (last != currentButton)
delay (5);
currentButton = digitalRead (switchPin);
>
return currentButton;
> void loop() currentButton = debounce (lastButton);
if(lastButton == LOW && currentButton == HIGH)
ledOn = !ledOn;
>
lastButton = currentButton; digitalWrite(ledPin, ledOn);
>

Ivan
29.04.2017

Объясните пожалуйста, зачем в землю резистор. Объясните пожалуйста максимально простыми словами, никак не могу понять:(

питер
02.07.2017

Доброго дня . Подскажите пожалуйста зачем нужно резистором тянуть землю на кнопку , если при нажатии кнопка пропускает плюс ?

Владимир
28.11.2017

Здравствуйте. как будет выглядеть скейч на две кнопки и два светодиода которые будут выключается по времени. Например на 1 секунду

полина
13.06.2018

Как прописать код для радуино, чтобы светодиод загорался только при одновременном нажатии на 2 кнопки

Dana
21.09.2018

Включение светодиода с помощью кнопки
Когда на кнопку нажали,включается светодиод
Когда на кнопку не нажали,выключаем светодиод

Глеб
30.12.2022

Для того, чтобы реализовать включение светодиода с помощью кнопки, нужно использовать функцию digitalRead, которая позволяет считывать состояние пина (нажата кнопка или нет). Также нужно использовать функцию digitalWrite, которая позволяет установить состояние пина (высокое или низкое).

Михаил
30.12.2022

Подключение кнопки к плате Arduino является одним из самых простых и базовых элементов работы с электронными устройствами. Чтобы подключить кнопку к плате Arduino, необходимо следующее: Подключить один конец кнопки к одному из пинов платы Arduino (например, к пину 2).
Подключить другой конец кнопки к земле (GND).
Подключить плату Arduino к компьютеру с помощью USB-кабеля.
Открыть программу Arduino IDE и создать новый скетч.
В начале скетча определить номер пина, к которому подключена кнопка: const int buttonPin = 2;
В секции setup инициализировать этот пин как вход: pinMode(buttonPin, INPUT);
В секции loop считывать состояние кнопки с помощью команды digitalRead: int buttonState = digitalRead(buttonPin); В результате состояние кнопки будет сохранено в переменной buttonState — если кнопка нажата, то buttonState будет равно HIGH, если не нажата — равно LOW. Ниже приведен пример кода, который мигает светодиодом, когда кнопка нажата: const int ledPin = 13; // Пин светодиода
const int buttonPin = 2; // Пин кнопки void setup() pinMode(ledPin, OUTPUT); // Инициал Этот код будет проверять состояние кнопки каждый цикл `loop` и включать светодиод, если кнопка нажата, и выключать его, если кнопка не нажата. Однако, часто необходимо, чтобы светодиод мигал регулярно, а не только при нажатии кнопки. Для этого можно использовать функцию `delay` и переменную, которая хранит состояние светодиода (включен/выключен). Ниже приведен код, реализующий мигание светодиода с частотой 1 раз в секунду: const int ledPin = 13; // Пин светодиода
const int buttonPin = 2; // Пин кнопки int ledState = LOW; // Состояние свет Добавить код, отвечающий за мигание светодиода с частотой 1 раз в секунду: void loop() int buttonState = digitalRead(buttonPin); // Считываем состояние кнопки
if (buttonState == HIGH) < // Если кнопка нажата
ledState = !ledState; // Меняем состояние светодиода
digitalWrite(ledPin, ledState); // Включаем/выключаем светодиод
>
delay(1000); // Ждем 1 секунду
> В этом коде мы считываем состояние кнопки, а затем меняем состояние светодиода и включаем/выключаем его, если кнопка нажата. Затем мы ждем 1 секунду с помощью функции delay и возвращаемся в начало цикла. В результате светодиод будет мигать с частотой 1 раз в секунду. Загрузите скетч на плату Arduino с помощью программы Arduino IDE. Сначала нужно выбрать нужную плату в меню «Сервис» -> «Устройство». Затем нажмите на кнопку «Загрузить» или нажмите «Ctrl + U» на клавиатуре. После загрузки скетча вы можете нажать кнопку на плате Arduino и увидеть, как светодиод начинает мигать. Если светодиод не мигает, проверьте, что все провода подключены правильно и что правильно выбрана плата в Arduino IDE.

Михаил
30.12.2022

И вот вы уже умеете подключать кнопку к плате Arduino и реализовывать мигание светодиода с помощью нее. Это только один из примеров того, что можно сделать с помощью Arduino. С ее помощью можно реализовывать различные электронные устройства и роботов, от простых до сложных.

Как подключить кнопку к Ардуино

Как подключить кнопку к Ардуино без резистора

Как подключить кнопку к Arduino с резистором, используя цифровые и аналоговые порты платы или, как подключить кнопку к микроконтроллеру Ардуино без резистора. Рассмотрим, как избежать «дребезга контактов», используя конфигурацию портов микроконтроллера INPUT_PULLUP при работе с тактовыми кнопками. Разберем схему подключения одной или нескольких тактовых кнопок к плате Ардуино для включения светодиода.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • тактовые кнопки
  • светодиоды
  • резисторы
  • макетная плата
  • коннекторы
  1. Включение светодиода от кнопки Ардуино
  2. Игра со светодиодами и кнопками Ардуино
  3. Пианино на Ардуино с кнопками и пищалкой

Основной проблемой при использовании кнопок с Arduino Uno является «отскок контактов», см. рисунок ниже. Дело в том, что механические контакты кнопок никогда не замыкаются и не размыкаются мгновенно. Контакты многократно замыкаются и размыкаются в течение нескольких миллисекунд (это период t на диаграмме, показанной ниже) — таким образом, микроконтроллер на входе получает серию импульсов, а не одиночный сигнал.

Управление и программирование кнопки на Ардуино

Управление и программирование кнопки Ардуино

Чтобы микроконтроллер не принимал сигнал от ложных нажатий на кнопку при «дребезге контактов», используются различные электрические цепи с триггерами и конденсаторами. Но удобнее использовать программный метод предотвращения ложного нажатия на кнопку с помощью режима работы порта INPUT_PULLUP и задержки в несколько миллисекунд или с помощью библиотеки Bounce2.h. Первый вариант намного проще и эффективнее.

Как подключить кнопку к Ардуино с резистором

Как подключить кнопку к Ардуино с резистором

В первом примере используйте цифровые порты на плате для подключения кнопки с подтягивающим резистором. Соберите схему, как показано на рисунке выше, и загрузите скетч. Обратите внимание, что когда кнопка отпущена, на пин 2 подается логический «0«, а при нажатии логическая «1» Используйте эту кнопку для включения и выключения светодиода, подключенного к цифровому порту 13 на плате микроконтроллера.

Скетч для кнопки с подтягивающим резистором

#define LED 13 #define BUT 2 void setup() < pinMode(LED, OUTPUT); pinMode(BUT, INPUT); >void loop() < if (digitalRead(BUT) == HIGH) < digitalWrite(LED, HIGH); >if (digitalRead(BUT) == LOW) < digitalWrite(LED, LOW); >>

Подключение кнопки к Ардуино с резистором

Подключение кнопки к Ардуино с резистором

Также можно подключить кнопки к аналоговому входу Arduino (обозначены на плате как Analog In). Принципиальное отличие этой схемы заключается в использовании аналогового порта микроконтроллера. В программе также будем использовать тактовую кнопку для включения и выключения светодиода, подключенного к пину 13. Переключите кнопку на аналоговый вход A1, как показано на схеме, и загрузите следующий код в плату.

Скетч для кнопки с резистором и светодиодом

#define LED 13 #define BUT A1 void setup() < pinMode(LED, OUTPUT); pinMode(BUT, INPUT); >void loop() < if (analogRead(BUT) >300) < digitalWrite(LED, HIGH); >if (analogRead(BUT) < 300) < digitalWrite(LED, LOW); >>

Подключение кнопки Ардуино в режиме INPUT_PULLUP

Подключение кнопки Ардуино в режиме INPUT_PULLUP

pinMode() может использовать режим работы INPUT_PULLUP для конфигурации порта, как показано в этом примере. В этом случае к порту подключается 5 Вольт через встроенный подтягивающий резистор, что позволяет подключать кнопки к Arduino Uno без резистора. Следующая программа реализует возможность считывать нажатия кнопок, при этом будет увеличиваться или уменьшаться переменная (выводится на монитор порта Arduino IDE).

Скетч для кнопки c режимом порта INPUT_PULLUP

#define BT1 2 #define BT2 3 int x; boolean button1WasUp = true; boolean button2WasUp = true; void setup() < pinMode(BT1, INPUT_PULLUP); pinMode(BT2, INPUT_PULLUP); Serial.begin(9600); >void loop() < boolean button1IsUp = digitalRead(BT1); boolean button2IsUp = digitalRead(BT2); if (button1WasUp && !button1IsUp) < delay(10); button1IsUp = digitalRead(BT1); if (!button1IsUp) < x = x + 1; Serial.println(x); >> button1WasUp = button1IsUp; if (button2WasUp && !button2IsUp) < delay(10); button2IsUp = digitalRead(BT2); if (!button2IsUp) < x = x - 1; Serial.println(x); >> button2WasUp = button2IsUp; >

Заключение. В последнем примере реализована возможность исключения дребезга контактов кнопок на программном уровне. Более подробно вариант подключения в режиме работы цифрового пина INPUT_PULLUP рассмотрено в разделе проекты на Ардуино, где с помощью кнопок производится управление режимом работы адресной ленты. Если у вас остались интересные вопросы по этому обзору — оставляйте их в комментариях к посту.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *