Долгое удержание кнопки - вкл/выкл подсветки
- Войдите на сайт для отправки комментариев
Втр, 23/08/2022 - 16:19
Всем привет. Почему может не срабатывать корректно условие:
.......
boolean changeFlag = false;
.....
if (button.isHolded() && changeFlag == false) {
//mode = 0;
lcd.backlight();
changeFlag = true;
}
if (button.isHolded() && changeFlag == true){
lcd.noBacklight();
changeFlag = false;
}
Т.е. по удержанию нажатой кнопки - включить подсветку, при удержании еще раз выключить подсветку. Сейчас только включается ((((
"Огласите весь список"
Всем привет. Почему может не срабатывать корректно условие:
......
Покажи весь код. Вот эта переменная глобальная?
Нет, локальная
Нет, локальная
тогда код работает, как написано
не дошло еще?
Выглядит все так:
............... void loop() { modesTick(); } .................... void modesTick() { button.tick(); boolean changeFlag = false; if (button.isClick()) { mode++; if (mode > 1) mode = 0; changeFlag = true; } if (button.isHolded() && changeFlag == false) { //mode = 0; lcd.backlight(); changeFlag = true; } if (button.isHolded() && changeFlag == true){ lcd.noBacklight(); changeFlag = false; } if (changeFlag) { if (mode == 0) { clockTimer1.start(); lcd.clear(); loadClock(); drawClock(hrs, mins, 0, 0); drawData(); DrawBL999(); } if (mode == 1){ clockTimer1.stop(); DrawBME(); } } }попробуй
Нет не работает
Нет не работает
код из #6 не компилируется, в нет как минимум нет setup()
выложи полный код после всех исправлений
Нет не работает
Весь код выложи.
Строка 13:
changeFlag =true; будет выполнено в любом случае, а не только если mode > 1. Почему, сам догадаешься?Хочешь сказать у него isClick() происходит одновременно с isHolded() ? (Гайвер-кнопка чоле?)
Неважно, что там происходит, важно, как написано ))
Хочешь сказать у него isClick() происходит одновременно с isHolded() ? (Гайвер-кнопка чоле?)
После then выполняется только один оператор.
Хочешь сказать у него isClick() происходит одновременно с isHolded() ? (Гайвер-кнопка чоле?)
После then выполняется только один оператор.
А если я его код по нормальному отформатирую?
............... void loop() { modesTick(); } .................... void modesTick() { button.tick(); boolean changeFlag = false; if (button.isClick()) { mode++; if (mode > 1) mode = 0; changeFlag = true; // Зачем сейчас сюда смотреть, если ТС говорит о проблемах с isHolded() ? } if (button.isHolded() && changeFlag == false) { //mode = 0; lcd.backlight(); changeFlag = true; } if (button.isHolded() && changeFlag == true) { lcd.noBacklight(); changeFlag = false; } if (changeFlag) { if (mode == 0) { clockTimer1.start(); lcd.clear(); loadClock(); drawClock(hrs, mins, 0, 0); drawData(); DrawBL999(); } if (mode == 1) { clockTimer1.stop(); DrawBME(); } } }ТС говорит, что у него срабатывает только на включение, так вот 13 строка ясно говорит, что задуманное им работать не будет. Он, видимо, решил, что раз написал два оператора в одной строке, то и срабатывать они будут по одному условию. Только компилятору на это начхать ))
Иными словами у него по любому isClick() будет changeFlag = true; И никакие isHolded тут уже ничего не решают
неиспользование в ифах фигурных скобок и к не такому приводит
А тут уже большой вопрос к ТС: Нажимает ли он один раз при проверке или только долгое удержание....
Да что там спрашивать - у него чётко написано: только после второго клика. Строка 13 )))
Там такого не написано, так то... ))
Написано. Условие if(mode > 1). А строкой выше mode++ на каждый isClick. Стало быть первый клик пропускается.
может у него mode инициализуется единицей :) - этого в коде нет
И вообще, нафига на него время тратить? - он проигнорировал просьбу выложить полный код - до свиданья
Там чуть ниже есть сравнения mode == 0 и mode == 1. Так что скорее всего нулем
И вообще, нафига на него время тратить? - он проигнорировал просьбу выложить полный код - до свиданья
Скучно )))
Всем привет. Почему может не срабатывать корректно условие:
....... boolean changeFlag = false; ..... if (button.isHolded() && changeFlag == false) { //mode = 0; lcd.backlight(); changeFlag = true; } if (button.isHolded() && changeFlag == true){ lcd.noBacklight(); changeFlag = false; }Т.е. по удержанию нажатой кнопки - включить подсветку, при удержании еще раз выключить подсветку. Сейчас только включается ((((
Если условие в строке 6 срабатывает, то changeFlag становится true (строка #9), и тогда условие в строке №12 тоже обязательно срабатывает.
Т.е. всю эту хрень можно смело заменить на
boolean changeFlag = false; ..... if (button.isHolded() && changeFlag == false) { //mode = 0; lcd.backlight(); lcd.noBacklight(); }Уверен, что задумано было не так.
Ха, точно ))))
if (button.isHolded() ) { if ( !changeFlag ) { //mode = 0; lcd.backlight(); changeFlag = true; } else { lcd.noBacklight(); changeFlag = false; } }А я что-то сначала протупил....
Даёшь лаконичность!)
Даёшь лаконичность!)
Ну, если лозунг таков, то зачем так длинно?
зачем так длинно?
Пятница же, можно и по рассуждать )))
ЗЫ: Пробовал, continue в условии не работает (ну я не смог)....
А может быть break и сработает, не пробовал...
Ну, если лозунг таков, то зачем так длинно?
Так не Brainfuck всё же ж.)
Даёшь лаконичность!)
Ну, если лозунг таков, то зачем так длинно?
Не знаю, но еще вариантов подкину:
И тут уж так, поржать (пятница же):
Так не Brainfuck всё же ж.)
И то, правда.
Да, у меня-то заход поскромнее был. Если стоит задача лаконичности, то почему вместо
не писать
Да, у меня-то заход поскромнее был. Если стоит задача лаконичности, то почему вместо
не писать
Да, при этом нужно не забывать чему равен true.) Кстати, некоторые компиляторы выдают предупреждение на запись типа changeFlag = !changeFlag. Приведение int к bool им, видите ли, не нравится.
читая заголовок - долгое удержание не полезно....