Кнопки разные нужны, кнопки разные важны!

Вопросы не вошедшие в форумы из категории
Oleg M.
Сообщения: 4
Зарегистрирован: 18 апр 2017, 11:59

Кнопки разные нужны, кнопки разные важны!

Сообщение Oleg M. » 23 апр 2017, 20:00

Всем привет!

Большое спасибо автору сайта за интересные и бесплатные(!) уроки, которые помогли расширить знание ООП.
В свою очередь, хочу «поделиться» кнопками с другими алгоритмами обработки, которые пришлось «сделать» для небольшого проекта.
Ведь и в реальной жизни кнопок бывает превеликое множество, начиная от простых кнопок, кнопок с залипанием, кнопок с подсветкой и многих других на все случаи жизни.
Логику обработки состояния контактов кнопок можно прописывать как в основном скетче (loop), так и в самой кнопке, что мне позволило упростить общий алгоритм.
Я "сделал" кнопку «с фиксацией», которая переходит из состояния «ВКЛ» при одном длительном нажатии, и возвращается в состояние «ВЫКЛ» при другом длительном нажатии.
Еще понадобилась «триггерная» кнопка, которая при длительном нажатии вырабатывает сигнал «ВКЛ» при ОТПУСКАНИИ кнопки. Сигал «ВКЛ» вырабатывается на протяжении некоторого короткого интервала, и возвращается в состояние «ВЫКЛ» не зависимо от дальнейшего состояния (аналог одновибратора).
Эти кнопки можно, конечно, объединить в одну универсальную, но для Арудины с ее крохотными мозгами :D лучше использовать только тот «сорт» кнопок, который нужен в конкретной задаче.
Еще особенностью "моих" кнопок стало довольно длительное время удержания (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 ;
}
}
}
}


Вернуться в «Прочее»

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и 0 гостей