Большое спасибо автору сайта за интересные и бесплатные(!) уроки, которые помогли расширить знание ООП.
В свою очередь, хочу «поделиться» кнопками с другими алгоритмами обработки, которые пришлось «сделать» для небольшого проекта.
Ведь и в реальной жизни кнопок бывает превеликое множество, начиная от простых кнопок, кнопок с залипанием, кнопок с подсветкой и многих других на все случаи жизни.
Логику обработки состояния контактов кнопок можно прописывать как в основном скетче (loop), так и в самой кнопке, что мне позволило упростить общий алгоритм.
Я "сделал" кнопку «с фиксацией», которая переходит из состояния «ВКЛ» при одном длительном нажатии, и возвращается в состояние «ВЫКЛ» при другом длительном нажатии.
Еще понадобилась «триггерная» кнопка, которая при длительном нажатии вырабатывает сигнал «ВКЛ» при ОТПУСКАНИИ кнопки. Сигал «ВКЛ» вырабатывается на протяжении некоторого короткого интервала, и возвращается в состояние «ВЫКЛ» не зависимо от дальнейшего состояния (аналог одновибратора).
Эти кнопки можно, конечно, объединить в одну универсальную, но для Арудины с ее крохотными мозгами лучше использовать только тот «сорт» кнопок, который нужен в конкретной задаче.
Еще особенностью "моих" кнопок стало довольно длительное время удержания (200- 500 мсек), что вызано необходимостью избежать ненужного срабатывания при кратковременном случайном нажатии.
Удачи всем!
/*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+*/
/*
Методы обработки нажатия кнопки и очистки от дребезга
путем многократного непрерывного в течение заданного интервала времени
опроса состояния кнопки
*/
/*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+*/
void Button:: set( byte pin, boolean defaultButt, // установка параметров кнопки
boolean pullup, int retention ) {
_digitPin = pin ; // присвоение номера PIN
_defaultButt = defaultButt ; // исходное состояние разомкнуто
_pullup = pullup ; // подтяжка к ПЛЮС
_retention = retention ; // время удержания [ мсек ]
if (_pullup) {
pinMode(_digitPin, INPUT_PULLUP) ;
} else {
pinMode(_digitPin, INPUT) ;
}
}
/*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+*/
void Button:: sScan() { // ПРОСТЕЙШАЯ кнопка SIMPLE
if (digitalRead( _digitPin) == _defaultButt ) { // кнопка в исходном состоянии
timeClick = millis() ; // запоминаем время вызова
pressed = false ; // кнопка не нажата
} else {
if ( millis() — timeClick > _retention ) { // время прошло —
pressed = true ; // и кнопка хорошо нажата
}
}
}
/*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+*/
void Button:: fScan() { // кнопка с фиксацией нажал-отжал FIXED
if (digitalRead( _digitPin) == _defaultButt ) { // кнопка в исходном состоянии
timeClick = millis() ; // запоминаем время вызова
pressed = false ; // кнопка не нажата
_lock = false ;
} else {
if ( millis() — timeClick > _retention ) { // время прошло —
if ( _lock == false ) {
pressed = true ; // и кнопка хорошо нажата
fixing = ! fixing ; // меняем состояние кнопки
_lock = true ;
}
}
}
}
/*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+*/
void Button:: tScan ( ) { // одновибратор 100 мсек (TRIGGER)
static boolean _burst ;
if ( digitalRead( _digitPin) == _defaultButt ) { // кнопка в исходном состоянии ОТЖАТО
timeClick = millis() ; // запоминаем время вызова
pressed = false ; // кнопка не нажата
} else { // НАЖАТО
if ( millis() — timeClick > _retention ) { // время прошло —
pressed = true ; // значит, кнопка хорошо нажата
_burst = true;
}
}
if ( _burst ) { // время нажатия прошло,ждем отпускания
if ( !digitalRead( _digitPin) == _defaultButt ) { // кнопка в !исходном состоянии НАЖАТО
timeBurst = millis() ;
} else { // ОТЖАТО, пошло время
if ( millis() — timeBurst < 100 ) { // 100 мсек прошло —
burst = true ; // меняем состояние кнопки
} else {
_burst = false ;
burst = false ;
}
}
}
}