В ардуино понадобилось мне иметь шаблон для обработки кучи кнопок.
Начал было писать сам, но нашел на просторах код, который подстроил под себя. Может кому пригодиться.
Просто подключаете кнопки к массе и пинам ( X + n) количеством сколько хотите правите код и пользуете.
PHP код:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// класс титановый велосипед для тактовой кнопки. (версия 1.0)
// фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.
#include <Arduino.h>
class BUTTON {
public:
//============================================================================================
// константы настроек класса.
static const byte bounce_ = 50; // длительность отслеживания дребезга.
static const byte doubleclick_ = 250; // длительность отслеживания двойного нажатия.
static const unsigned long timer_ = 5000; // длительность отслеживания неактивности.
static const unsigned int retention_ = 2000; // длительность отслеживания нажатия и удержания.
//============================================================================================
unsigned long start; // старт отсчёта времени.
boolean p; // состояние пина кнопки.
boolean s; // программное состояние кнопки.
boolean b; // состояние таймера фильтра дребезга.
byte c; // переменная счётчика двойного нажатия.
boolean t; // состояние таймера неактивности.
boolean r; // состояние таймера нажатия и удержания.
//============================================================
boolean click_down; // событие нажатия.
boolean click_up; // событие отпускания.
boolean doubleclick; // событие двойного нажатия.
boolean timer; // событие неактивности.
boolean retention; // событие нажатия и удержания.
//============================================================
byte _pb;
//============================================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//===================
start = millis();
p = digitalRead(_pb);
// p = !digitalRead(_pb); // отключить тихий старт.
s = p;
b = 0;
c = 0;
t = 0;
r = 0;
//==============
click_down = 0;
click_up = 0;
doubleclick = 0;
timer = 0;
retention = 0;
//==============
}
void read() {
//==============================================================================
boolean np = digitalRead(_pb); // текущее состояние пина кнопки.
unsigned long stop = millis(); // стоп отсчёта времени.
//==============================================================================
click_down = 0;
click_up = 0;
doubleclick = 0;
timer = 0;
retention = 0;
//==============================================================================
if (np != p) {p = np; click(); start = stop; b = 1; t = 1; r = 1;} // состояние цифрового пина изменилось.
//==============================================================================
if (b != 0 ) {if (stop - start > bounce_ ) {b = 0; click(); }} // фильтр дребезга.
if (c != 0 ) {if (stop - start > doubleclick_) {c = 0; }} // обнуление счётчика двойного клика.
if (t != 0 && s == 1) {if (stop - start > timer_ ) {t = 0; timer = 1;}} // неактивность.
if (r != 0 && s == 0) {if (stop - start > retention_ ) {r = 0; retention = 1;}} // нажатие и удержание.
//==============================================================================
}
void click() { // нажатие, отпускание, двойное нажатие.
if (b == 0 && s != p) {s = p;
if (s == 0) {click_down = 1; ++c; if (c == 2) {c = 0; doubleclick = 1;}}
if (s == 1) {click_up = 1; }
}
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//конец кода для чтения состояний кнопок
//Подтяжку на +5В делать не надо, код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
// __________ТУТ НАЗНАЧАЕМ ИМЕНА НАШИХ КНОПОК И К КАКИМ ПИНАМ ОНИ ПОДКЛЮЧЕНЫ__________
BUTTON REDbutton(52); //назначаем красной кнопке ножку 52. То есть один конец конпки подключён на пин 52 ардуины меги, а второй конец конпки подключён на массу (GND) Подтяжку на +5В делать не надо, код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON BLACKbutton (53);//назначаем красной кнопке ножку 53. То есть один конец конпки подключён на пин 52 ардуины меги, а второй конец конпки подключён на массу (GND) Подтяжку на +5В делать не надо, код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600); // ком порт
}
void loop()
{
// Serial.println("___________________start__________________________________ ");
REDbutton.read();
if (REDbutton.click_down) {Serial.println("REDbutton = najata"); } //нажатие кнопки
if (REDbutton.click_up) {Serial.println("REDbutton = otpustily"); } //отпускание кнопки
if (REDbutton.doubleclick) {Serial.println("REDbutton = doubleclick"); } //двойной клик
if (REDbutton.timer) {Serial.println("REDbutton = neaktivnost knopki"); } //неактивность
if (REDbutton.retention) {Serial.println("REDbutton = uderjanie");} // нажатие и удержание
BLACKbutton.read();
if (BLACKbutton.click_down) {Serial.println("BLACKbutton = click_down"); }
if (BLACKbutton.click_up) {Serial.println("BLACKbutton = click_up"); }
if (BLACKbutton.doubleclick) {Serial.println("BLACKbutton = doubleclick"); }
if (BLACKbutton.timer) {Serial.println("BLACKbutton = timer"); }
if (BLACKbutton.retention) {Serial.println("BLACKbutton = retention"); }
// Serial.println("___________________end______________________________ ");
if(REDbutton.click_down==1)//если кнопка REDbutton нажата ... (статус нажатой кнопки == 1)
{
digitalWrite(13,1); //включили диодик
}
if (REDbutton.click_up==1 )//если кнопка REDbutton отпущена .. (статус отпущенной кнопки == 1)
{
digitalWrite(13,0); //выключили диодик
}
}