Добрый день В цикле Loop крутится счетчик. Есть Аналоговая кнопка, при нажатии она отдает цифру 2 const byte UP=2; когда она не нажата то отдает значение >= 900 Как сделать, чтобы при первом нажатии была цифра 1 При втором нажатии цифра 2, при этом если нажать и держать кнопку, цифра не менялась, до следующего нажатия. Код (C++): void counter_menu(int counts) { button_key = getKey(); if(button_key==2) { if(lines ==5) { lines=1;} lines++; delay(500); } } }
Аналоговая кнопка это как? Считывается АЦП что ли? А вообще такие задачи решаются триггером - некоей переменной которая сначала равна например 0, после первого считывания приравнивается к 1, исходя из ее состояния и делаются выводы какое действие предпринять. А для того чтобы не менялась при удержании вычислять сам факт нажатия, то есть переход от значения 900 к 2. При этом хорошо бы проверку состояния делать с определенным периодом, например 50 мс.
Кнопки аналоговые, вычисляются интервалами значений напряжения, если не ошибаюсь. Вот пример Код (C++): byte getKey() { int val_analog = 0; byte button_key = 0; val_analog = analogRead(keypadPin); if ( val_analog <= 30) { button_key = SELECT; } else if ( (val_analog >= 35) && (val_analog <=60) ) { button_key = DOWN;} else if ( (val_analog >= 100) && (val_analog <= 150 ) ) { button_key = UP;} else if ( (val_analog >= 200) && (val_analog <= 280) ) { button_key = RIGHT;} else if ( (val_analog >= 580) && (val_analog <650) ) { button_key = LEFT;} else if (val_analog >= 900) { button_key=NONE;} // По умолчанию если не нажали ни одной кнопки return button_key; } данные из условий передаются через функцию button_key = getKey(); в виде цифр, которые имеют константы. Код (C++): // Global Variables const byte NONE_MENU= 0; // не нажата ни одна кнопка выводим морду const byte LEFT=1; const byte RIGHT= 2; const byte UP=3; const byte DOWN=4; const byte SELECT=5; У нас имеется нажатая кнопка если значение не 0. Если выводится 0 кнопка не нажата. Вот теперь как то необходимо сделать функцию которая при нажатии кнопки 2 будет делать +1 а при нажатии кнопки 4 будет делать минус-1. Сейчас сделал так, хот я это наверное очень грубое решение, и его как то можно переделать. Код (C++): void counter_menu(int counts){ button_key = getKey(); if(button_key==2){ if(lines ==5) { lines=0;} lines++; delay(300); } if(button_key==4){ if(lines == 0) { lines=1;} lines--; delay(300); tft.setTextColor(RED); tft.print(lines); }
Кольцевой буфер глубиной 2 вполне достаточен для отслеживания факта нажатия кнопки. Да, и delay в функциях нежелателен, особенно такой длинный. В начало функции вставить проверку на интервал, если не пора - выходим, если пора читаем кнопку и сравниваем с тем что было в прошлый раз, если было 0 а стало 2 - вот оно нажатие! Далее согласно флажка, если 02 уже было, то игнор, если не было то реакция плюс вкл флажок.
Спасибо буду пробовать реализовать. А не подскажете визуальную программу типа Proteus 8 Professional только чтоб без платы тестировать можно было, но при этом визуально управляемую. Видел FLprog но так и не понял есть ли смысл ее ставить.
Две переменные в которые сквозным образом пропихиваются данные. Как в очереди. Например из 1 во 2, а в 1 извне. Получается такая цепочка: новые и предыдущие, которая постоянно обновляется. Условие для срабатывания должно быть в данном случае: старое 900, новое 2.