Долгое удержание кнопки - вкл/выкл подсветки

maksmkv
Offline
Зарегистрирован: 07.04.2013

Всем привет. Почему может не срабатывать корректно условие:

 

.......

boolean changeFlag = false;
.....

  if (button.isHolded() && changeFlag == false) {
    //mode = 0;
    lcd.backlight();
    changeFlag = true;
  } 

  if (button.isHolded() && changeFlag == true){
   lcd.noBacklight();
   changeFlag = false;
   } 

    

Т.е. по удержанию нажатой кнопки - включить подсветку, при удержании еще  раз выключить подсветку.  Сейчас только  включается (((( 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

"Огласите весь список"

b707
Offline
Зарегистрирован: 26.05.2017

maksmkv пишет:

Всем привет. Почему может не срабатывать корректно условие:

......


boolean changeFlag = false;
.....



переменная changeFlag где описана - в начале loop() ?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Покажи весь код. Вот эта переменная глобальная?

boolean changeFlag = false;

 

maksmkv
Offline
Зарегистрирован: 07.04.2013

Нет, локальная 

b707
Offline
Зарегистрирован: 26.05.2017

maksmkv пишет:

Нет, локальная 

тогда код работает, как написано

не дошло еще?

maksmkv
Offline
Зарегистрирован: 07.04.2013

Выглядит все  так: 

...............
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();
    }
  }
}


    

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018
static boolean changeFlag = false;

попробуй

maksmkv
Offline
Зарегистрирован: 07.04.2013

Нет не работает

b707
Offline
Зарегистрирован: 26.05.2017

maksmkv пишет:

Нет не работает

код из #6 не компилируется, в нет как минимум нет setup()

выложи полный код после всех исправлений

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

maksmkv пишет:

Нет не работает

Весь код выложи.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Строка 13: changeFlag = true; будет выполнено в любом случае, а не только если mode > 1. Почему, сам догадаешься?

 

 

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Хочешь сказать у него isClick() происходит одновременно с isHolded() ? (Гайвер-кнопка чоле?)

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Неважно, что там происходит, важно, как написано ))

sadman41
Offline
Зарегистрирован: 19.10.2016

BOOM пишет:

Хочешь сказать у него isClick() происходит одновременно с isHolded() ? (Гайвер-кнопка чоле?)

После then выполняется только один оператор.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

sadman41 пишет:

BOOM пишет:

Хочешь сказать у него 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();
    }
  }
}

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ТС говорит, что у него срабатывает только на включение, так вот 13 строка ясно говорит, что задуманное им работать не будет. Он, видимо, решил, что раз написал два оператора в одной строке, то и срабатывать они будут по одному условию. Только компилятору на это начхать ))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Иными словами у него по любому isClick() будет changeFlag = true; И никакие isHolded тут уже ничего не решают

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

v258 пишет:
Неважно, что там происходит, важно, как написано ))

неиспользование в ифах фигурных скобок и к не такому приводит

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

v258 пишет:
Иными словами у него по любому isClick() будет changeFlag = true; И никакие isHolded тут уже ничего не решают

А тут уже большой вопрос к ТС: Нажимает ли он один раз при проверке или только долгое удержание....

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Да что там спрашивать - у него чётко написано: только после второго клика. Строка 13 )))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Там такого не написано, так то... ))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Написано. Условие if(mode > 1). А строкой выше mode++ на каждый isClick. Стало быть первый клик пропускается.

b707
Offline
Зарегистрирован: 26.05.2017

v258 пишет:
Написано. Условие if(mode > 1). А строкой выше mode++ на каждый isClick. Стало быть первый клик пропускается.

может у него mode инициализуется единицей :) - этого в коде нет

И вообще, нафига на него время тратить? - он проигнорировал просьбу выложить полный код - до свиданья

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Там чуть ниже есть сравнения mode == 0 и mode == 1. Так что скорее всего нулем

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

И вообще, нафига на него время тратить? - он проигнорировал просьбу выложить полный код - до свиданья


Скучно )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

maksmkv пишет:

Всем привет. Почему может не срабатывать корректно условие:

 

.......

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();
   } 

Уверен, что задумано было не так.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ха, точно ))))

  if (button.isHolded() ) {
    if ( !changeFlag ) {
      //mode = 0;
      lcd.backlight();
      changeFlag = true;
    } else {
      lcd.noBacklight();
      changeFlag = false;
    }
  } 

А я что-то сначала протупил....

Green
Offline
Зарегистрирован: 01.10.2015

Даёшь лаконичность!)

if (button.isHolded())
  (changeFlag = !changeFlag) ? lcd.backlight() : lcd.noBacklight();

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Даёшь лаконичность!)

if (button.isHolded())
  (changeFlag = !changeFlag) ? lcd.backlight() : lcd.noBacklight();

Ну, если лозунг таков, то зачем так длинно?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ЕвгенийП пишет:

зачем так длинно?

Пятница же, можно и по рассуждать )))

ЗЫ: Пробовал, continue в условии не работает (ну я не смог)....

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А может быть break и сработает, не пробовал...

Green
Offline
Зарегистрирован: 01.10.2015

ЕвгенийП пишет:

Ну, если лозунг таков, то зачем так длинно?


Так не Brainfuck всё же ж.)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ЕвгенийП пишет:

Green пишет:

Даёшь лаконичность!)

if (button.isHolded())
  (changeFlag = !changeFlag) ? lcd.backlight() : lcd.noBacklight();

Ну, если лозунг таков, то зачем так длинно?

Не знаю, но еще вариантов подкину:

(button.isHolded() && (changeFlag = !changeFlag)) ? lcd.backlight() : lcd.noBacklight();

И тут уж так, поржать (пятница же):

(button.isHolded() && (digitalWrite(14, !digitalRead(14))) ? lcd.backlight() : lcd.noBacklight();

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Так не Brainfuck всё же ж.)

И то, правда.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOOM пишет:

(button.isHolded() && (changeFlag = !changeFlag)) ? lcd.backlight() : lcd.noBacklight();

Да, у меня-то заход поскромнее был. Если стоит задача лаконичности, то почему вместо 

changeFlag = !changeFlag

не писать

changeFlag ^= 1
Green
Offline
Зарегистрирован: 01.10.2015

ЕвгенийП пишет:

Да, у меня-то заход поскромнее был. Если стоит задача лаконичности, то почему вместо 

changeFlag = !changeFlag

не писать

changeFlag ^= 1


Да, при этом нужно не забывать чему равен true.) Кстати, некоторые компиляторы выдают предупреждение на запись типа changeFlag = !changeFlag. Приведение int к bool им, видите ли, не нравится.

b707
Offline
Зарегистрирован: 26.05.2017

читая заголовок - долгое удержание не полезно....