Подключение светодиода и кнопки к arduino. Подключение кнопки

10.09.2021

/*
* Набор для экспериментов ArduinoKit
* Код программы для опыта №5: sketch 05
*
* КНОПКИ
*
* Написано для сайта http://сайт
*
*
* Помощь сообщества Arduino.
* Посетите сайт http://www.arduino.cc
*
* Комментарий к программе написан
* 22 января 2014
* специально для http://сайт
*/

КНОПКИ.

Использование кнопок на цифровых входах.

Ранее мы использовали аналоговые порты (пины) для ввода данных, теперь же мы посмотрим в действии и цифровые порты. Поскольку цифровые порты знают только о двух уровнях сигналов — высоких «+5» и низких «0», они идеально подходят для взаимодействия с кнопками и переключателями, которые тоже имеют только два положения — «Вкл» и «Выкл».

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

Но подождите — что происходит, когда кнопка не нажата? В этом состоянии, порт отключен от всего, т.е висит в воздухе, и это не понятное состояние мы называем «неопределенным», или плавующим. То есть, мы не можем с уверенностью сказать, как отреагирует на такое состояние Arduino. В зависимости от различных условий окружающей среды это может быть воспринято ей и как HIGH («ВЫСОКИЙ» +5 Вольт), и как LOW («НИЗКИЙ» — логический ноль).

Чтобы не возникало никакий разночтений, и микроконтроллер точно знал что в данный момент у него на входе, мы дополнительно соединим порт Arduino через ограничивающий резистор (подойдет любой с номиналом от 1КОм — 10KОм) с шиной +5 Вольт. Эта «подтяжка» будет гарантировать наличие постоянного ВЫСОКОГО +5V сигнала, а при нажатии, на кнопку цепь замкнется на Землю — «0», а значит для ардуино, сигнал на входе изменится с HIGH, на LOW, т.е. с ВЫСОКОГО +5V, на НИЗКИЙ «0».

(Дополнительно: Когда вы привыкнете к резисторами, и будете знать когда они необходимы, вы сможете активировать внутренние резисторы подтяжки, находящиеся в самом процессоре ATmega. Для информации смотрите http://arduino.cc/en/Tutorial/DigitalPins).

Подсоединение оборудования:

У кнопок есть два контакта, если кнопка нажата — контакт замкнут, если не нажата — разомкнут.

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

Самый простой способ подключить кнопку — подключить провода к клеммам — наискосок (по диагонали).

Подключите любой контакт кнопки 1 к земле (GND).
Подключите другой контакт кнопки к цифровому порту 2.

Подключите любой контакт кнопки 2 к земле (GND).
Подключите другой контакт кнопки к цифровому порту 3.

На ножки кнопок идущие к цифровым портам 2,3, подключите «подтягивающие» резисторы по 10Kом (коричневый/черный/красный), а вторые выводы этих резисторов подключите к общему «-» (GND). Эти резисторы гарантируют, что на входе будет либо +5V (кнопка не нажата), либо «0», при нажатии, и не чего другого. (И не забывайте, что в отличии от аналоговых входов у цифровых всего два состояния ВЫСОКОЕ и НИЗКИЙ.)

Светодиод:

Большинство плат Arduino, в том числе и UNO, уже имеют установленный светодиод, с токоограничивающим резистором, подключенный к порту 13. И Вам не обязательно ставить свой.

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

Подсоедините положительный вывод светодиода к цифровому порту Arduino №13
Подсоедините отрицательный вывод светодиода к резистору 330 Ом.
Подсоедините другой вывод резистора к GND «-«.

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

const int button1Pin = 2; // кнопка №1 — порт 2
const int button2Pin = 3; // кнопка №2 — порт 3
const int ledPin = 13; // порт 13, для светодиода

void setup()
{
// Установим порты кнопок как входящие:
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);

// Установим порт светодиода как исходящий:
pinMode(ledPin, OUTPUT);
}

void loop()
{
int button1State, button2State; // переменные для сохранения состояния кнопок

// Поскольку кнопки имеют только два состояния (нажаты и не нажаты) мы будем
// работать с ними используя цифровые порты ввода. Для того чтобы считывать
// информацию мы воспользуемся функцией digitalRead(). Эта функция позволяет
// получить один параметр с цифрового порта и возвратить либо HIGH (+5V),
// либо LOW («0»).

// Здесь мы читаем текущее состояние кнопок и помещаем их значение
// в две переменные:

button1State = digitalRead(button1Pin);
button2State = digitalRead(button2Pin);

// Вспомните, если кнопка нажата, то порт будет соединен с массой («-«).
// Если кнопка не нажата, порт, через подтягивающий резистор будет подключен к +5 вольт.

// Таким образом, состояние порта будет LOW (низким), когда кнопка нажата,
// и HIGH (высоким), когда она не нажата.

// Теперь мы будем использовать состояние портов чтобы контролировать светодиод.

// Что мы хотим сделать, условие:
// «Если какая-либо кнопка нажата, загорается светодиод»,
// «Но, если окажутся нажатыми обе кнопки, светодиод не загорится»
// Давайте переведем это в программный код.

// У Arduino есть специальные логические операторы, и операторы сравнения,
// которые часто используются при проверке условий, в частности:

// «==» (равенство) — Истинно, если обе стороны являются одинаковыми
// Пример:
// if (x == y) {
// тело условия
//}

// «&&» (логическое И) — Истинно только при выполнении обоих условий
// Пример:
// Истинно, если оба выражения Истинно (true)
// if (x > 0 && x < 5) {
// тело условия
//}

// «!» (логическое НЕ)
// Истинно если оператор ложен (false)
// Пример:
//if (!x) {
// тело условия
//}

// «||» (логическое ИЛИ) — Истинно, если хотя бы одно из условий выполняется
// Пример:
//if (x > 0 || y > 0) {
// тело условия
// }

// В данном случае Мы будем использовать конструкцию «if» для перевода всего
// выше сказанного в логические цепочки программы.
// (Не забудьте, НИЗКИЙ (LOW), означает что кнопка нажата)

// «Если одна из кнопок нажата, светодиод светится»
// получится:
// if ((button1State == LOW) || (button2State == LOW)) // зажечь светодиод

// «Если обе кнопки нажатые, светодиод не загорается»
// получится:
// if ((button1State == LOW) && (button2State == LOW)) // не зажигать светодиод

// Теперь давайте используем вышеуказанные функции и объединим их в одной инструкции:

if (((button1State == LOW) || (button2State == LOW)) // сравниваем, нажата ли одна из кнопок
&& ! // и если нет
((button1State == LOW) && (button2State == LOW))) // сравниваем, нажаты ли обе кнопки
// тогда…
{
digitalWrite(ledPin, HIGH); // включаем светодиод
}
else // в противном случае
{
digitalWrite(ledPin, LOW); // выключаем светодиод
}

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

// Не забудьте: Нельзя использовать оператор «=» при сравнении значений вместо
// «==», потому что оператор «=» присваивает значение переменным!
}

В следующей статье мы опубликуем код к уроку №5 в виде архива.

Вам понадобится

  • Arduino;
  • тактовая кнопка;
  • резистор 10 кОм;
  • макетная плата;
  • соединительные провода.

1 Виды кнопок

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

Некоторые кнопки после нажатия оставляют проводники соединёнными (фиксирующиеся кнопки ), другие - сразу же после отпускания размыкают цепь (нефиксирующиеся кнопки ).

Также кнопки делят на:

  • нормально разомкнутые ,
  • нормально замкнутые .
Первые при нажатии замыкают цепь, вторые - размыкают.

Сейчас нашёл широкое применение тип кнопок, которые называют «тактовые кнопки» . Тактовые - не от слова «такт», а от слова «тактильный», т.к. нажатие хорошо чувствуется пальцами. Но этот ошибочный термин устоялся, и теперь эти кнопки у нас повсеместно так называют. Это кнопки, которые при нажатии замыкают электрическую цепь, а при отпускании - размыкают, т.е. это нефиксирующиеся, нормально разомкнутые кнопки.

2 Дребезг контактов

Кнопка - очень простое и полезное изобретение, служащее для лучшего взаимодействия человека и техники. Но, как и всё в природе, она не идеальна. Проявляется это в том, что при нажатии на кнопку и при её отпускании возникает т.н. «дребезг» ("bounce" по-английски). Это многократное переключение состояния кнопки за короткий промежуток времени (порядка нескольких миллисекунд), прежде чем она примет установившееся состояние. Это нежелательное явление возникает в момент переключения кнопки из-за упругости материалов кнопки или из-за возникающих при электрическом контакте микроискр.


В следующей статье мы подробно рассмотрим способы борьбы с «дребезгом» при замыкании и размыкании контактов. А пока что рассмотрим варианты подключения кнопки к Arduino.

3 Некорректное подключение кнопки

Чтобы подключить нормально разомкнутую тактовую кнопку к Arduino, можно поступить самым простым способом: один свободный проводник кнопки соединить с питанием или землёй, другой - с цифровым выводом Arduino. Но, вообще говоря, это неправильно. Дело в том, что в моменты, когда кнопка не замкнута, на цифровом выводе Ардуино будут появляться электромагнитные наводки, и из-за этого возможны ложные срабатывания.


Чтобы избежать наводок, цифровой вывод обычно подключают через достаточно большой резистор (10 кОм) либо к земле, либо к питанию. В первом случае это называется «схема с подтягивающим резистором» , во втором - «схема со стягивающим резистором» . Давайте рассмотрим каждую из них.

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

Сначала подключим к Arduino кнопку по схеме с подтягивающим резистором. Для этого один контакт кнопки соединим с землёй, второй - с цифровым выходом "2". Цифровой выход "2" также подключим через резистор номиналом 10 кОм к питанию +5 В.


Напишем вот такой скетч для обработки нажатий на кнопку и загрузим в Arduino.

// Задаём номера выводов: const int buttonPin = 2; const int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { int buttonState = digitalRead(buttonPin); // считываем состояние кнопки if (buttonState == HIGH) { digitalWrite(ledPin, HIGH); // зажигаем светодиод при нажатии кнопки } else { digitalWrite(ledPin, LOW); // гасим светодиод при отпускании кнопки } }

Встроенный светодиод на выводе "13" постоянно горит, пока не нажата кнопка. Т.е. на порте "2" Arduino всегда присутствует высокий логический уровень HIGH. Когда нажимаем кнопку, напряжение на "2" порте принимает состояние LOW, и светодиод гаснет.

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

Теперь соберём схему со стягивающим резистором. Один контакт кнопки соединим с питанием +5 В, второй - с цифровым выходом "2". Цифровой выход "2" подключим через резистор номиналом 10 кОм к земле. Скетч менять не будем.


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

Инструкция

Кнопки бывают разные, но все они выполняют одну функцию - физически соединяют (или, наоборот, разрывают) между собой проводники для обеспечения электрического контакта. В простейшем случае - это соединение двух проводников, есть кнопки, которые соединяют большее количество проводников.
Некоторые кнопки после нажатия оставляют проводники соединёнными (фиксирующиеся кнопки), другие - сразу же после отпускания размыкают цепь (нефиксирующиеся).
Также кнопки делят на нормально разомкнутые и нормально замкнутые. Первые при нажатии замыкают цепь, вторые - размыкают.
Сейчас нашёл широкое применение тип кнопок, которые называют "тактовые кнопки". Тактовые - не от слова "такт", а скорее от слова "тактильный", т.к. нажатие хорошо чувствуется пальцами. Это кнопки, которые при нажатии замыкают электрическую цепь, а при отпускании - размыкают.

Кнопка - очень простое и полезное изобретение, служащее для лучшего взаимодействия человека и техники. Но, как и всё в природе, она не идеальна. Проявляется это в том, что при нажатии на кнопку и при её отпускании возникает т.н. " " ("bounce" по-). Это многократное переключение состояния кнопки за короткий промежуток времени (порядка нескольких миллисекунд), прежде чем она примет установившееся состояние. Это нежелательное явление возникает в момент переключения кнопки из-за упругости материалов кнопки или из-за возникающих при электрическом микроискр.
Увидеть своими глазами можно с помощью Arduino, что мы и сделаем чуть позже.

Чтобы подключить нормально разомкнутую тактовую кнопку к Arduino, можно поступить самым простым способом: один свободный проводник кнопки соединить с питанием или землёй, другой - с цифровым выводом Arduino. Но, вообще говоря, это неправильно. Дело в том, что в моменты, когда кнопка не замкнута, на цифровом выводе Ардуино будут появляться электромагнитные наводки, и из-за этого возможны ложные срабатывания.
Чтобы избежать наводок, цифровой вывод обычно подключают через достаточно большой резистор (10 кОм) либо к земле, либо к питанию. В первом случае это называется " с подтягивающим резистором", во втором - "схема со стягивающим резистором". Давайте рассмотрим каждую из них.

Сначала подключим к Arduino кнопку по схеме с подтягивающим резистором. Для этого один контакт кнопки соединим с землёй, второй - с цифровым выходом 2. Цифровой выход 2 также подключим через резистор номиналом 10 кОм к питанию +5 В.

Напишем вот такой скетч для обработки нажатий кнопки и загрузим в Arduino.
Теперь встроенный светодиод на выводе 13 постоянно горит, пока не нажата кнопка. Когда нажимаем кнопку, она принимает состояние LOW, и светодиод гаснет.

Теперь соберём схему со стягивающим резистором. Один контакт кнопки соединим с питанием +5 В, второй - с цифровым выходом 2. Цифровой выход 2 подключим через резистор номиналом 10 кОм к земле.
Скетч менять не будем.

Теперь светодиод не горит, пока кнопку не нажали.

Видео по теме

Совет 2: Как избавиться от дребезга контактов при подключении кнопки к Arduino

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

Вам понадобится

  • - Arduino;
  • - тактовая кнопка;
  • - резистор номиналом 10 кОм;
  • - светодиод;
  • - соединительные провода.

Инструкция

"Дребезг" контактов - это явление, свойственное механическим переключателям, кнопкам, тумблерам и реле. Из-за того, что контакты обычно из металлов и сплавов, которые обладают упругостью, при физическом замыкании они не сразу устанавливают надёжное соединение. В течение короткого промежутка времени контакты несколько раз смыкаются и отталкиваются друг от друга. В результате этого электрический ток принимает установившееся значение не моментально, а после череды нарастаний и спадов. Длительность этого переходного эффекта зависит от материала контактов, от их размера и конструкции. На иллюстрации показана типичная осциллограмма при замыкании контактов тактовой кнопки. Видно, что время от момента переключения до установившегося состояния составляет несколько миллисекунд. Это и "дребезгом".

Этот эффект не заметен в электрических управления освещением, или другими инерционными датчиками и приборами. Но в цепях, где идёт быстрое считывание и обработка информации (где частоты того же порядка, что и импульсы "дребезга", или выше), это является проблемой. В частности, Arduino UNO, который работает на частоте 16 МГц, отлично "дребезг" контактов, принимая последовательность единиц и нулей вместо единичного переключения от 0 к 1.

Давайте посмотрим, как дребезг контактов влияет на правильную работу схемы. Подключим к Arduino тактовую кнопку по схеме со стягивающим резистором. Будем по нажатию кнопки зажигать светодиод и оставлять включённым до повторного нажатия кнопки. Для наглядности подключим к цифровому выводу 13 внешний светодиод, хотя можно обойтись и встроенным.

Чтобы реализовать данную задачу, первое, что приходит в голову:
- запоминать предыдущее состояние кнопки;
- сравнивать с текущим состоянием;
- если состояние изменилось, то меняем состояние светодиода.
Напишем такой скетч и загрузим в память Arduino.
При включении схемы в работу, сразу виден эффект от влияния дребезга контактов. Он проявляется в том, что светодиод загорается не сразу после нажатия кнопки, или загорается и тут же гаснет, или не выключается сразу после нажатия кнопки, а продолжает гореть. В общем, схема работает не стабильно. И если для задачи с включением светодиода это не столь критично, то для других, более серьёзных задач, это просто неприемлемо.

Постараемся исправить ситуацию. Мы знаем, что дребезг контактов проявляет себя в течение нескольких миллисекунд после замыкания контактов. Давайте после изменения состояния кнопки выжидать, скажем, 5 мсек. Это время для человека является практически мгновением, и нажатие кнопки человеком обычно происходит значительно дольше - несколько десятков миллисекунд. А Arduino прекрасно работает с такими короткими промежутками времени, и эти 5 мсек позволят ему отсечь дребезг контактов от нажатия кнопки.
В данном скетче мы объявим процедуру debounce() ("bounce" по-английски - это как раз "дребезг", приставка "de" означает обратный процесс), на вход которой мы подаём предыдущее состояние кнопки. Если нажатие кнопки длится более 5 мсек, значит это действительно нажатие.
Определив нажатие, мы меняем состояние светодиода.
Загрузим скетч в плату Arduino. Теперь всё гораздо лучше! Кнопка срабатывает без сбоев, при нажатии светодиод меняет состояние, как мы и хотели.

Аналогичная функциональность обеспечивается специальными библиотеками, например, библиотекой Bounce2. Скачать её можно по ссылке в разделе "Источники" или на сайте https://github.com/thomasfredericks/Bounce2. Для установки библиотеки помещаем её в директорию libraries среды разработки Arduino и перезапускаем IDE.
Библиотека "Bounce2" содержит следующие методы:
Bounce() - инициализация объекта "Bounce";
void interval(мсек) - устанавливает время задержки в миллисекундах;
void attach (номерПина) - задаёт вывод, к которому подключена кнопка;
int update() - обновляет объект и возвращает true, если состояние пина изменилось, и false в противном случае;
int read() - считывает новое состояние пина.
Перепишем наш скетч с использованием библиотеки. Можно также запоминать и сравнивать прошлое состояние кнопки с текущим, но давайте упростим алгоритм. При нажатии кнопки будем считать нажатия, и каждое нечётное нажатие будем включать светодиод, каждое чётное - выключать. Такой скетч смотрится лаконично, его легко прочитать и легко применить.

Источники:

  • Убираем дребезг контактов кнопки, подключённой к Arduino
  • Библиотека Bounce2

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

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

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

Кнопка в разрезе. Видно, что крайние контакты физически соединены с одним выводом, выходящим с двух сторон. Центральный вывод устроен аналогично.

Важно не перепутать, какие контакты соединены (то есть являются единым целом), а какие должны замыкаться при нажатии. Кнопка подключается одним из контактов к любому цифровому пину Arduino, другим контактом к положительному полюсу питания. Далее нужно настроить пин Arduino, как вход, функцией pinMode() и можно считывать значение с вывода с помощью функции digitalRead() . При нажатии кнопки с вывода будет считываться значение HIGH. На этом можно было бы и закончить, если бы не одно но: в разомкнутом состоянии на ввод будут случайным образом подаваться сигналы LOW и HIGH, потому что такой вывод ни к чему не подключён и «висит в воздухе». Для правильного подключения нужно вывод, к которому подключена кнопка, «подтянуть» к одному из значений. В нашем случае при не нажатой кнопке с пина должно считываться значение LOW, поэтому подтягивать будем к земле.

Для этого необходимо подключать параллельно с кнопкой к выбранному выводу большого номинала (10 КОм и больше), через который будет протекать совсем небольшой ток. Тогда при не нажатой кнопке на пине будет чёткое значение LOW, а при нажатии кнопки наш подтягивающий резистор никак не помешает считать HIGH. Потому что через подтягивающий резистор утечёт совсем немного тока по сравнения с током короткого замыкания пина контроллера на положительный полюс питания.

После сборки схемы загрузите в плату следующую программу:

/* Переключаем светодиод при нажатии на кнопку Схема устройства: * Светодиод подключён к 13 пину (встроенный светодиод) * Тактовая кнопка подключена ко 2му пину * Резистор 10кОм используется для подтяжки 2го пина к земле */ //Задаём константы // set pin numbers: 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); } }

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

Схема устройства:

* Светодиод подключён к 13 пину (встроенный светодиод)

* Тактовая кнопка подключена ко 2му пину

* Резистор 10кОм используется для подтяжки 2го пина к земле

//Задаём константы

// set pin numbers:

const int buttonPin = 2 ; // Номер пина, к которому подключена кнопка

const int ledPin = 13 ; // Номер пина, к которому подключен светодиод

//Объявляем переменные

int buttonState = 0 ; // Переменная для хранения статуса кнопки

void setup () {

// Настраиваем вывод, к которому подключён светодиод, как выход

pinMode (ledPin , OUTPUT ) ;

// Настраиваем вывод, к которому подключена кнопка, как вход

pinMode (buttonPin , INPUT ) ;

void loop () {

// Считываем состояние кнопки

buttonState = digitalRead (buttonPin ) ;