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

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

  • автор:

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); >>

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

Подключение кнопки к Arduino. GyverButton v3.8

На сайте есть отдельный подробный урок по работе с кнопками.

Кнопка – простейший орган управления микроконтроллером. Подключить кнопку к Arduino очень просто, но нужно помнить, что пин должен иметь два стабильных состояния – высокое и низкое, GND или VCC. Для этого пин кнопки подтягивают резистором ~10 кОм противоположно подключению кнопки, т.е. если кнопка подключена второй ногой к GND, пин подтягивают к VCC, и наоборот.

Микроконтроллер имеет “встроенную” подтяжку ног к VCC, что даёт возможность подключать кнопку только к GND и пину, но режим работы пина нужно выбрать INPUT_PULLUP. Я, например, всегда подключаю отладочную кнопку на D3 вот таким образом:

blank

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

blank

БИБЛИОТЕКА

Внимание, библиотека устарела! Я разработал новую библиотеку — EncButton, она гораздо легче и быстрее этой, но практически полностью с ней совместима. Скачать и ознакомиться можно на GitHub. × Закрыть это предупреждение.

GyverButton v3.8

Для удобной и многофункциональной работы с кнопкой я написал библиотеку GyverButton. Что она умеет:

  • Работа с нормально замкнутыми и нормально разомкнутыми кнопками
  • Работа с подключением PULL_UP и PULL_DOWN Опрос кнопки с программным антидребезгом контактов (настраиваемое время)
  • Отработка нажатия, удерживания, отпускания, клика по кнопке (+ настройка таймаутов)
  • Отработка одиночного, двойного и тройного нажатия (вынесено отдельно)
  • Отработка любого количества нажатий кнопки (функция возвращает количество нажатий)
  • Функция изменения значения переменной с заданным шагом и заданным интервалом по времени
  • Возможность работы с “виртуальными” кнопками (все возможности библиотеки используются для матричных и резистивных клавиатур)

Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)

Версия 3.5: значительно увеличена производительность для AVR Ardiuno плат

УСТАНОВКА

  • Библиотеку можно найти и установить через менеджер библиотек по названию GyverButton в:
    • Arduino IDE (Инструменты/Управлять библиотеками)
    • Arduino IDE v2 (вкладка “Library Manager”)
    • PlatformIO (PIO Home, вкладка “Libraries”)

    ДОКУМЕНТАЦИЯ

    Список функций

    // Варианты инициализации: // GButton btn; // без привязки к пину (виртуальная кнопка) и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) // GButton btn(пин); // с привязкой к пину и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) // GButton btn(пин, тип подключ.); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и без указания типа кнопки (по умолч. NORM_OPEN) // GButton btn(пин, тип подключ., тип кнопки); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) // GButton btn(BTN_NO_PIN, тип подключ., тип кнопки); // без привязки к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) void setDebounce(uint16_t debounce); // установка времени антидребезга (по умолчанию 80 мс) void setTimeout(uint16_t timeout); // установка таймаута удержания (по умолчанию 300 мс) void setClickTimeout(uint16_t timeout); // установка таймаута между кликами (по умолчанию 500 мс) void setStepTimeout(uint16_t step_timeout); // установка таймаута между инкрементами (по умолчанию 400 мс) void setType(uint8_t type); // установка типа кнопки (HIGH_PULL - подтянута к питанию, LOW_PULL - к gnd) void setDirection(uint8_t dir); // установка направления (разомкнута/замкнута по умолчанию - NORM_OPEN, NORM_CLOSE) void setTickMode(uint8_t tickMode); // (MANUAL / AUTO) ручной или автоматический опрос кнопки функцией tick() // MANUAL - нужно вызывать функцию tick() вручную // AUTO - tick() входит во все остальные функции и опрашивается сама void tick(); // опрос кнопки void tick(boolean state); // опрос внешнего значения (0 нажато, 1 не нажато) (для матричных, резистивных клавиатур и джойстиков) boolean isPress(); // возвращает true при нажатии на кнопку. Сбрасывается после вызова boolean isRelease(); // возвращает true при отпускании кнопки. Сбрасывается после вызова boolean isClick(); // возвращает true при клике. Сбрасывается после вызова boolean isHolded(); // возвращает true при удержании дольше timeout. Сбрасывается после вызова boolean isHold(); // возвращает true при нажатой кнопке, не сбрасывается boolean state(); // возвращает состояние кнопки boolean isSingle(); // возвращает true при одиночном клике. Сбрасывается после вызова boolean isDouble(); // возвращает true при двойном клике. Сбрасывается после вызова boolean isTriple(); // возвращает true при тройном клике. Сбрасывается после вызова boolean hasClicks(); // проверка на наличие кликов. Сбрасывается после вызова uint8_t getClicks(); // вернуть количество кликов uint8_t getHoldClicks();// вернуть количество кликов, предшествующее удерживанию boolean isStep(); // возвращает true по таймеру setStepTimeout, смотри пример void resetStates(); // сбрасывает все is-флаги и счётчики

    Встроенная библиотека AnalogKey.h

    В версии 3.6 библиотеки добавлен новый файл: AnalogKey.h, позволяющий удобно работать с аналоговыми клавиатурами. Пример работы — пример analogKeyboardG

    Инициализация

    Объект создаётся следующим образом: AnalogKey <аналоговый пин, количество кнопок>объект;

    Настройка

    При помощи метода .attach(номер, сигнал) задаются «кнопки» клавиатуры: кнопке под номером номер ставится в соответствие сигнал. Сигнал измеряется предварительно например выводом значений analogRead() в порт. При помощи .setWindow(размер) устанавливается точность обработки сигнала кнопок, по умолчанию равен 20. Что это значит? Ожидаемое нажатие кнопки будет обработано, если сигнал с клавиатуры попадает в промежуток (сигнал-размер, сигнал+размер).

    Опрос

    Метод .status(номер) возвращает true , если нажата кнопка под указанным номером. Метод .pressed() возвращает номер нажатой в данный момент кнопки, если таковых нет — возвращает -1 .

    Пример

    /* Сигналы кнопок 1023 927 856 783 671 632 590 560 504 480 455 440 399 319 255 230 */ #include "AnalogKey.h" // указываем пин и количество кнопок AnalogKey < A0, 16 >keys; void setup() < Serial.begin(9600); // назначаем кнопкам их сигналы keys.attach(0, 1023); keys.attach(1, 927); keys.attach(2, 856); keys.attach(3, 783); keys.attach(4, 671); keys.attach(5, 632); keys.attach(6, 590); keys.attach(7, 560); keys.attach(8, 504); keys.attach(9, 480); keys.attach(10, 455); keys.attach(11, 440); keys.attach(12, 399); keys.attach(13, 319); keys.attach(14, 255); keys.attach(15, 230); >void loop() < // проверяем каждую кнопку в ручном режиме if (keys.status(0)) Serial.println("press 0"); if (keys.status(1)) Serial.println("press 1"); if (keys.status(2)) Serial.println("press 2"); if (keys.status(3)) Serial.println("press 3"); if (keys.status(4)) Serial.println("press 4"); if (keys.status(5)) Serial.println("press 5"); if (keys.status(6)) Serial.println("press 6"); // или выводим номер текущей нажатой (-1 значит ни одна не нажата) if (keys.pressed() != -1) Serial.println(keys.pressed()); delay(10); >

    Интеграция с GyverButton

    Для работы с GButton достаточно передавать в «тик» статус конкретных кнопок, таким образом аналоговую клавиатуру можно обрабатывать со всеми фишками GyverButton.

    // новый пример работы с аналоговой клавиатурой /* Сигналы кнопок 1023 927 856 783 671 632 590 560 504 480 455 440 399 319 255 230 */ #include "AnalogKey.h" // указываем пин и количество кнопок AnalogKey < A0, 3 >keys; #include GButton btn1, btn2, btn3; void setup() < Serial.begin(9600); // указываем сигналы кнопок аналоговой клавы keys.attach(0, 1023); keys.attach(1, 927); keys.attach(2, 856); >void loop() < // тикаем кнопки как статусы аналоговых btn1.tick(keys.status(0)); btn2.tick(keys.status(1)); btn3.tick(keys.status(2)); if (btn1.isClick()) Serial.println("click 0"); if (btn2.isClick()) Serial.println("click 1"); if (btn3.isClick()) Serial.println("click 2"); if (btn1.isHolded()) Serial.println("click 0"); if (btn2.isHolded()) Serial.println("hold 1"); if (btn3.isHolded()) Serial.println("hold 2"); >

    ПРИМЕРЫ

    Остальные примеры смотри в папке examples библиотеки, также примеры можно открыть из Arduino IDE/Файл/Примеры

    Демо — все возможности библиотеки с комментариями

    // Пример использования библиотеки GyverButton, все возможности в одном скетче. #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) #include "GyverButton.h" GButton butt1(BTN_PIN); // Варианты инициализации: // GButton btn; // без привязки к пину (виртуальная кнопка) и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) // GButton btn(пин); // с привязкой к пину и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) // GButton btn(пин, тип подключ.); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и без указания типа кнопки (по умолч. NORM_OPEN) // GButton btn(пин, тип подключ., тип кнопки); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) // GButton btn(BTN_NO_BTN_PIN, тип подключ., тип кнопки); // без привязки к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) int value = 0; void setup() < Serial.begin(9600); butt1.setDebounce(50); // настройка антидребезга (по умолчанию 80 мс) butt1.setTimeout(300); // настройка таймаута на удержание (по умолчанию 500 мс) butt1.setClickTimeout(600); // настройка таймаута между кликами (по умолчанию 300 мс) // HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (BTN_PIN --- КНОПКА --- GND) // LOW_PULL - кнопка подключена к VCC, пин подтянут к GND // по умолчанию стоит HIGH_PULL butt1.setType(HIGH_PULL); // NORM_OPEN - нормально-разомкнутая кнопка // NORM_CLOSE - нормально-замкнутая кнопка // по умолчанию стоит NORM_OPEN butt1.setDirection(NORM_OPEN); >void loop() < butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться if (butt1.isClick()) Serial.println("Click"); // проверка на один клик if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик if (butt1.hasClicks()) // проверка на наличие нажатий Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс) if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс) if (butt1.isHolded()) Serial.println("Holded"); // проверка на удержание if (butt1.isHold()) < // если кнопка удерживается Serial.print("Holding "); // выводим пока удерживается Serial.println(butt1.getHoldClicks()); // можно вывести количество кликов перед удержанием! >//if (butt1.state()) Serial.println("Hold"); // возвращает состояние кнопки if (butt1.isStep()) < // если кнопка была удержана (это для инкремента) value++; // увеличивать/уменьшать переменную value с шагом и интервалом Serial.println(value); // для примера выведем в порт >>

    Демо в авто-режиме

    // Пример использования библиотеки GyverButton, все возможности в одном скетче. // автоматический тик #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) #include "GyverButton.h" GButton butt1(BTN_PIN); // GButton butt1(BTN_PIN, HIGH_PULL, NORM_OPEN); // можно инициализировать так int value = 0; void setup() < Serial.begin(9600); butt1.setDebounce(90); // настройка антидребезга (по умолчанию 80 мс) butt1.setTimeout(300); // настройка таймаута на удержание (по умолчанию 500 мс) // HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (BTN_PIN --- КНОПКА --- GND) // LOW_PULL - кнопка подключена к VCC, пин подтянут к GND // по умолчанию стоит HIGH_PULL butt1.setType(HIGH_PULL); // NORM_OPEN - нормально-разомкнутая кнопка // NORM_CLOSE - нормально-замкнутая кнопка // по умолчанию стоит NORM_OPEN butt1.setDirection(NORM_OPEN); // MANUAL - нужно вызывать функцию tick() вручную // AUTO - tick() входит во все остальные функции и опрашивается сама! butt1.setTickMode(AUTO); >void loop() < // butt1.tick(); // НЕ НУЖНА, в этом режиме (AUTO) она входит в каждую функцию if (butt1.isClick()) Serial.println("Click"); // проверка на один клик if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик if (butt1.hasClicks()) // проверка на наличие нажатий Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс) if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс) if (butt1.isHolded()) Serial.println("Holded"); // проверка на удержание if (butt1.isHold()) Serial.println("Holding"); // проверка на удержание //if (butt1.state()) Serial.println("Hold"); // возвращает состояние кнопки if (butt1.isStep()) < // если кнопка была удержана (это для инкремента) value++; // увеличивать/уменьшать переменную value с шагом и интервалом Serial.println(value); // для примера выведем в порт >>

    Клики + удержания в isStep
    Позволяет реализовать логику работы «клик-клик-удержание» с любым количеством кликов

    // ловим степ с накликиванием #define BTN_PIN 0 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) #include "GyverButton.h" GButton butt1(BTN_PIN); void setup() < Serial.begin(9600); >void loop() < butt1.tick(); // удержание if (butt1.isStep()) < Serial.println("0x"); >// один клик + удержание if (butt1.isStep(1)) < Serial.println("1x"); >// два клика + удержание if (butt1.isStep(2)) < Serial.println("2x"); >>

    Одиночный, двойной и тройной клик

    // Пример использования библиотеки GyverButton, 1- 2- 3- нажатие #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) #include "GyverButton.h" GButton butt1(BTN_PIN); void setup() < Serial.begin(9600); >void loop() < butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик >

    Опрос пяти кнопок

    // Пример использования библиотеки GyverButton // опрос 5 кнопок в ручном режиме // кнопки подключены к земле (PIN --- КНОПКА --- GND) #define BTN1 3 #define BTN2 4 #define BTN3 5 #define BTN4 6 #define BTN5 7 #include "GyverButton.h" GButton butt1(BTN1); GButton butt2(BTN2); GButton butt3(BTN3); GButton butt4(BTN4); GButton butt5(BTN5); void setup() < Serial.begin(9600); >void loop() < // тик в ручном режиме butt1.tick(); butt2.tick(); butt3.tick(); butt4.tick(); butt5.tick(); // проверяем одиночный клик if (butt1.isClick()) Serial.println("Button 1"); if (butt2.isClick()) Serial.println("Button 2"); if (butt3.isClick()) Serial.println("Button 3"); if (butt4.isClick()) Serial.println("Button 4"); if (butt5.isClick()) Serial.println("Button 5"); >

    Пять кнопок в авто режиме

    // Пример использования библиотеки GyverButton // опрос 5 кнопок в автоматическом режиме // кнопки подключены к земле (PIN --- КНОПКА --- GND) #define BTN1 3 #define BTN2 4 #define BTN3 5 #define BTN4 6 #define BTN5 7 #include "GyverButton.h" GButton butt1(BTN1); GButton butt2(BTN2); GButton butt3(BTN3); GButton butt4(BTN4); GButton butt5(BTN5); void setup() < Serial.begin(9600); // устанавливаем опрос на автоматический butt1.setTickMode(AUTO); butt2.setTickMode(AUTO); butt3.setTickMode(AUTO); butt4.setTickMode(AUTO); butt5.setTickMode(AUTO); >void loop() < // проверяем одиночный клик // tick уже сидит внутри опроса if (butt1.isClick()) Serial.println("Button 1"); if (butt2.isClick()) Serial.println("Button 2"); if (butt3.isClick()) Serial.println("Button 3"); if (butt4.isClick()) Serial.println("Button 4"); if (butt5.isClick()) Serial.println("Button 5"); >

    Опрос аналоговой клавиатуры

    // Пример использования библиотеки GyverButton с аналоговой клавиатурой // аналоговая клавиатура подключена на А7 // Схему смотри на странице библиотеки https://alexgyver.ru/gyverbutton/ // также она есть в папке с примером #include "GyverButton.h" // создаём кнопки без привязки к пину GButton myButt1; GButton myButt2; GButton myButt3; void setup() < Serial.begin(9600); // меняем тип на LOW_PULL, потому что по умолчанию стоит HIGH_PULL myButt1.setType(LOW_PULL); myButt2.setType(LOW_PULL); myButt3.setType(LOW_PULL); >void loop() < // читаем значение int analog = analogRead(7); // для начала нужно вывести и запомнить значение для каждой кнопки //Serial.println(analog); // проверяем у каждой кнопки свой диапазон (+- 20 от полученного значения) myButt1.tick(analog < 860 && analog >820); myButt2.tick(analog < 740 && analog >700); myButt3.tick(analog < 650 && analog >600); // проверка на удержание, например if (myButt1.isHolded()) < Serial.println("hold 1"); >if (myButt2.isHolded()) < Serial.println("hold 2"); >if (myButt3.isHolded()) < Serial.println("hold 3"); >delay(10); // задержка тут не нужна, чисто для вывода >

    Опрос кнопки в прерывании

    // Пример использования библиотеки GyverButton, все возможности в одном скетче. // Дополнительный опрос по аппаратному прерыванию #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) #include "GyverButton.h" GButton butt1(BTN_PIN); int value = 0; void setup() < Serial.begin(9600); attachInterrupt(1, isr, CHANGE); butt1.setDebounce(80); // настройка антидребезга (по умолчанию 80 мс) butt1.setTimeout(300); // настройка таймаута на удержание (по умолчанию 500 мс) >void isr() < butt1.tick(); // опрашиваем в прерывании, чтобы поймать нажатие в любом случае >void loop() < butt1.tick(); // опрашиваем в скетче, иначе не будут работать проверки по времени! if (butt1.isClick()) Serial.println("Click"); // проверка на один клик if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик if (butt1.hasClicks()) // проверка на наличие нажатий Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс) if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс) if (butt1.isHolded()) Serial.println("Holded"); // проверка на удержание //if (butt1.isHold()) Serial.println("Hold"); // возвращает состояние кнопки if (butt1.isStep()) < // если кнопка была удержана (это для инкремента) value++; // увеличивать/уменьшать переменную value с шагом и интервалом Serial.println(value); // для примера выведем в порт >>

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

    /* Пример использования библиотеки GyverButton, управляем переменной value при помощи двух кнопок Конструкция с isIncr делает увеличение/уменьшение переменной при нажатой кнопке с шагом по времени */ #define BTN1 2 // кнопка подключена сюда (PIN --- КНОПКА --- GND) #define BTN2 3 // кнопка подключена сюда (PIN --- КНОПКА --- GND) #include "GyverButton.h" GButton butt1(BTN1); GButton butt2(BTN2); int value = 0; void setup() < Serial.begin(9600); >void loop() < butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться butt2.tick(); // обязательная функция отработки. Должна постоянно опрашиваться if (butt1.isClick()) < // одиночное нажатие value++; // инкремент Serial.println(value); // для примера выведем в порт >if (butt2.isClick()) < // одиночное нажатие value--; // декремент Serial.println(value); // для примера выведем в порт >if (butt1.isStep()) < // обработчик удержания с шагами value++; // увеличивать/уменьшать переменную value с шагом и интервалом! Serial.println(value); // для примера выведем в порт >if (butt2.isStep()) < // обработчик удержания с шагами value--; // увеличивать/уменьшать переменную value с шагом и интервалом! Serial.println(value); // для примера выведем в порт >>

    Подключение кнопки к ардуино

    Сегодня поговорим о подключении кнопок к Ардуино. Подключения кнопок бывают 3-х видов.
    План.
    • Быстрое ознакомление с подключением кнопок.
    • Помигаем светодиодами управляя одной кнопкой.
    • Напишем скетч плавного включения светодиода от нажатия кнопки.
    • Подключим библиотеку Bounce2 и научимся с ней работать.
    • Напишем скетч, который будет управлять разными устройствами всего одной кнопкой.
    • Изучим обработчик кнопки с одним, двумя, тремя и длительностью нажатия кнопки.

    Вместо светодиода вы можете подключить любую, другую нагрузку.
    Например, плавно включать и выключать электромоторчик,лампу и другое.
    В этом уроке будет много примеров, так что приготовьтесь.

    Так что же такое кнопка?
    Кнопка – простейшее электромеханическое устройство, замыкающее и размыкающее электрическую цепь.

    Кнопки бывают двух видов.
    Кнопки – переключатели, с фиксированным положением.

    выключатель

    и не фиксированным положением. Они называются — тактовые кнопки.

    Тактовая кнопкаТактовая кнопка-схема
    После отпускания они возвращаются в начальное положение.
    Контакты расположены с двух сторон.
    Вот про них мы сегодня и поговорим.

    В своей работе мы постоянно сталкиваемся с кнопками.
    Обычная тактовая кнопка, применяемая в устройствах на Ардуино выглядит так.

    Существует много различных способов подключить кнопки.

    Если кнопка без дополнительного резистора, то в тот момент когда она не нажата, получается, что один контакт висит в воздухе и на него действуют разные внешние факторы. Например электрические наводки. Даже если просто пошатать провод, то это может изменить состояние кнопки.
    Поэтому используют так называемые подтяжки.
    Верхние (pull-up) Один вывод кнопки подключается к минусу, а другой через резистор 10кОм подключается к плюсу питания.
    Нижние (pull-down) Один вывод кнопки подключается к плюсу питания. а другой через резистор 10кОм подключается к земле.

    PULL-UPPULL-DOWN

    ПОДКЛЮЧЕНИЕ КНОПКИПОДКЛЮЧЕНИЕ КНОПКИ

    Есть ещё внутренняя подтяжка — Internal PULL-UP подтягивающий резистор 20 кОм.

    внутренняя подтяжкавнутренняя подтяжка
    Вот его мы и будем использовать, упростив тем самым схему и уменьшив количество используемых деталей.
    Правда тогда при нажатой кнопке у нас будет сигнал LOW или 0, а при отжатой будет HIGH или 1. Как бы всё наоборот.

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

    Главная проблема кнопок – это дребезг контактов, и чем старея кнопка, тем хуже контакт.
    Механические контакты в кнопках никогда не замыкаются или размыкаются мгновенно.
    В течении нескольких миллисекунд происходит многократное замыкание и размыкание контактов — в итоге на микроконтроллер поступает не один сигнал, а серия импульсов. Самый простой способ избавиться от этого применить задержку в несколько миллисекунд используя, на пример delay().
    Можно также использовать конденсатор параллельно контактам кнопки.

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

    Давайте рассмотрим самый простой пример.
    Зажжём светодиод при нажатой кнопке, и погасим его при отжатой.

    Сначала определяем константы для хранения номеров выводов Ардуино к которым мы подключаем кнопку и светодиод.
    Кнопка у нас будет подключена к выводу 2, а светодиод к выводу 3.

    Указываем, что вывод к которому подключен светодиод должен работать на выход, а кнопка должна работать в режиме внутреннего Internal PULL-UP.
    Считываем значение кнопки функцией digitalRead().
    Так как кнопка у нас подключена к земле, при нажатии мы получим ноль , а нам нужна единица. Поэтому инвертируем значение, то есть переворачиваем.
    Если было 0 то будет 1, и наоборот.
    И делаем небольшую задержку для устранения дребезга.

    // Объявляем константу для кнопки и присваиваем ей значение 2(номер pin(вывода) на плате Ардуино). const int BUTTON_PIN = 2; // Объявляем константу для светодиода и присваиваем ей значение 3(номер pin(вывода) на плате Ардуино). const int LED_PIN = 3; void setup() < // Кнопка.Настраиваем вывод 3 Ардуино на Выход pinMode(LED_PIN, OUTPUT); // Светодиод. Настраиваем вывод 2 - в режиме Входа. Включаем внутренний pull-up резистор pinMode(BUTTON_PIN, INPUT_PULLUP); //подключаем подтягивающий резистор digitalWrite(BUTTON_PIN, HIGH); >void loop() < // считываем состояние кнопки, инвертируем значение и переключаем светодиод digitalWrite(LED_PIN, !digitalRead(BUTTON_PIN)); >

    Второй пример. Будем плавно включать светодиод нажатием на кнопку.

    //Плавно зажигаем светодиод, а затем плавно гасим. // Объявляем константу для кнопки и присваиваем ей значение 2(номер pin(вывода)). const int BUTTON_PIN = 2; // Объявляем константу для светодиода и присваиваем ей значение 3(номер pin(вывода)). const int LED_PIN = 3; int i=0; void setup() < Serial.begin(9600); // Кнопка.Настраиваем вывод 3 Ардуино на Выход pinMode(LED_PIN, OUTPUT); // Настраиваем вывод 2 - в режиме Входа. Включаем pull-up резистор pinMode(BUTTON_PIN, INPUT_PULLUP); digitalWrite(BUTTON_PIN, HIGH); >void loop() < // плавное включение светодиода if(!digitalRead(BUTTON_PIN) == HIGH) < analogWrite(LED_PIN, i); delay(50); // Задержка. Для устранения дребезга контактов кнопки. i++; if(i >255) i=0; // Если значение переменой i больше 255, то обнуляем. Serial.println(i); > // else < // При отпускании кнопки значение переменой i становится равной нулю. // analogWrite(LED_PIN, 0); // i=0; // >>

    У всех этих примеров есть 1 недостаток.
    Все они используют функцию delay(). Она просто тормозит Ардуино и не даёт выполнять программу дальше пока не закончится время указанное в delay()
    Чтобы избавиться от неё надо воспользоваться функцией millis()
    Это функция, возвращающая количество миллисекунд с момента начала выполнения программы на плате Arduino.

    Напишем код, который будет сам плавно зажигать светодиод.
    Для этого нам понадобится выход, на микроконтроллере Ардуино, который поддерживаем ШИМ(PWM).
    Про это у меня тоже были уроки.
    Создаём глобальную переменную i.
    Всё остальное оставляем из прошлого примера без изменения.
    Считываем значение с кнопки и если она нажата, то начинаем увеличивать переменную i на единицу.
    И так пока она не будет равна 255, а затем сбрасываем значение в 0.
    Это максимальное значение.
    0 – это полное выключение светодиода, а 255 самое яркое свечение.
    Этот пример можно использовать для вращения моторчика или для ночника.

    Теперь добавим пару строчек которые будут сбрасывать переменную i в ноль при отпускании кнопки, если снова нажать на кнопку цикл начнётся заново.

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

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

    Как подключить кнопку к 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 не будет опубликован. Обязательные поля помечены *