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

Еще одним вариантом может быть сокращение средств ввода информации. Например, можно сделать так, чтобы с помощью одной кнопки можно было вводить различную информацию, то есть реализовать концепцию многофункциональной кнопки.
Суть данной концепции заключается в том, что при различном характере нажатия кнопки (одно быстрое нажатие, два быстрых нажатия, одно долговременное нажатие) в цифровую систему поступала бы различная информация. Такую многофункциональную кнопку с Arduino можно реализовать с помощью библиотеки OneButton (https://github.com/mathertel/OneButton). Для ознакомления с принципом работы данной библиотеки можно собрать простую схему, подключив кнопку к линии A1 платы Arduino и светодиод к линии D13 платы Arduno. Различные способы нажатия на кнопку будут влиять на поведение светодиода. Ниже приведен пример кода программы для работы с библиотекой OneButton.
#include "OneButton.h"
// Действия со светодиодом
typedef enum {
ACTION_OFF, // выключить светодиод
ACTION_ON, // включить светодиод
ACTION_SLOW, // медленное мигание светодиода
ACTION_FAST // быстрое мигание светодиода
}
MyActions;
// Назначение OneButton на линию A1.
OneButton button(A1, true);
MyActions nextAction = ACTION_OFF; // без действий при старте
// код настройки
void setup() {
// активировать стандартный светодиод на выводе 13
pinMode(13, OUTPUT); // устанавливаем цифровой вывод в качестве выхода
// связать функцию myClickFunction с вызовом события одного нажатия
button.attachClick(myClickFunction);
// связать функцию doubleclick с вызовом события двойного нажатия
button.attachDoubleClick(myDoubleClickFunction);
// установить 80 мс. время дребезга контактов. Значение по умолчанию - 50 мс.
button.setDebounceTicks(80);
} // конец настройки
// основной код в бесконечном цикле
void loop() {
unsigned long now = millis();
// следить за нажатием кнопки:
button.tick();
// Вы можете реализовать другой код здесь или просто подождать некоторое время
if (nextAction == ACTION_OFF) {
// ничего не делать
digitalWrite(13, LOW);
} else if (nextAction == ACTION_ON) {
// включить светодиод
digitalWrite(13, HIGH);
} else if (nextAction == ACTION_SLOW) {
// медленно мигать
if (now % 1000 < 500) {
digitalWrite(13, LOW);
} else {
digitalWrite(13, HIGH);
}
} else if (nextAction == ACTION_FAST) {
// быстро мигать
if (now % 200 < 100) {
digitalWrite(13, LOW);
} else {
digitalWrite(13, HIGH);
}
}
} // конец бесконечного цикла
// эта функция будет вызываться, когда кнопка была нажата 1 раз, и прошло некоторое время
void myClickFunction() {
if (nextAction == ACTION_OFF)
nextAction = ACTION_ON;
else
nextAction = ACTION_OFF;
} // myClickFunction
// эта функция будет вызываться, когда кнопка была нажата 2 раза за короткий промежуток времени
void myDoubleClickFunction() {
if (nextAction == ACTION_ON) {
nextAction = ACTION_SLOW;
} else if (nextAction == ACTION_SLOW) {
nextAction = ACTION_FAST;
} else if (nextAction == ACTION_FAST) {
nextAction = ACTION_ON;
}
} // myDoubleClickFunction
© digitrode.ru