#1 2022-10-07 10:19:34

ju4ka
Учасник
Зареєстрований: 2022-10-07
Повідомлень: 7

Простейшее меню выбора на LCD 2004

Добрый день!

Пытаюсь сделать простейшее меню в выбором, но опыта маловато. Прошу помощи.

Вид меню:

================
Заголовок 1

Первый вариант
Второй вариант
================

Соответственно имеется 2 кнопки под выбор вариантов.
Хочется сделать так что бы при выборе "Первый вариант" - запускался один void
А при выборе "Второй вариант" - соответственно другой void

Это я собственно сделал через обработку кнопки с присвоением флагов. И всё работает, но только на первом выборе void`ов.
То есть когда допустим выбираю "Первый вариант" - то меня кидает к нужному void, а затем программа продолжает выполнятся и начинает кидать по далее стоящим void`ам.

Собственно вопрос: как не дать программе исполнять void`ы, допустим до присвоения нужного флага, который будет присвоен в определённый момент.

Понимаю что описал сумбурно, если нужно будет - прикреплю видео с проблемой "в железе".
Код прикладываю (это само собой не основной проект, а лишь отладка работы с меню).

Заранее благодарю за ответ!

#define _LCD_TYPE 1                           // Тип подключения дисплея (I2C)
#include <EncButton.h>                        // Библеотека работы с кнопками
#include <LiquidCrystal_I2C.h>                // Библиотека работы с дисплеем (I2C 20x04)
EncButton<EB_TICK, 3> btnUp(INPUT_PULLUP);    // Кнопка вверх 
EncButton<EB_TICK, 2> btnDown(INPUT_PULLUP);  // Кнопка вниз

LiquidCrystal_I2C lcd(0x27, 20, 4);           // Параметры дисплея

boolean disp1_y;
boolean disp1_n;
boolean disp2_y;
boolean disp2_n;
boolean disp3_y;
boolean disp3_n;
boolean disp4_y;
boolean disp4_n;

void setup() {
  lcd.init();                                 // Инициализация дисплея
  lcd.backlight();                            // Включить подсветку
  main_info();                                // Переход к main_info();
}

void main_info() {
  lcd.clear();
  lcd.home();
  lcd.print("TB disp1");
  lcd.setCursor(0, 2);
  lcd.print("Yes");
  lcd.setCursor(0, 3);
  lcd.print("No");
  disp1_y = 1;
  disp1_n = 1;
}

void disp1_v_y() {
  lcd.clear();
  lcd.home();
  lcd.print("disp1_v_y");
  delay(3000);
  test_dist2();
}

void disp1_v_n() {
  lcd.clear();
  lcd.home();
  lcd.print("disp1_v_n");
  delay(3000);
  test_dist2();
}

void test_dist2() {
  lcd.print("TB disp2");
  lcd.setCursor(0, 2);
  lcd.print("Yes");
  lcd.setCursor(0, 3);
  lcd.print("No");
  disp2_y = 1;
  disp2_n = 1;
}

void disp2_v_y() {
  lcd.clear();
  lcd.home();
  lcd.print("disp2_v_y");
  delay(3000);
  test_dist3();
}

void disp2_v_n() {
  lcd.clear();
  lcd.home();
  lcd.print("disp2_v_n");
  delay(3000);
  test_dist3();
}

void test_dist3() {}






void loop() {
  btnUp.tick();                               // Обработка кнопки вверх
  btnDown.tick();                             // Обработка кнопки вниз

  if (btnUp.tick() && disp1_y == 1) {
         disp1_y = 0;
         disp1_n = 0;
         disp1_v_y();
  }

  if (btnDown.tick() && disp1_n == 1) {
         disp1_y = 0;
         disp1_n = 0;
         disp1_v_n();
  }

  if (btnUp.tick() && disp2_y == 1) {
         disp2_y = 0;
         disp2_n = 0;
         disp2_v_y();
  }

  if (btnDown.tick() && disp2_n == 1) {
         disp2_y = 0;
         disp2_n = 0;
         disp2_v_n();
  }


}

Неактивний

#2 2022-10-07 16:49:03

Васятко
Гість

Re: Простейшее меню выбора на LCD 2004

ju4ka пише:

Понимаю что описал сумбурно, если нужно будет - прикреплю видео с проблемой "в железе".

Давай, прикрепляй

#3 2022-10-07 17:02:27

ju4ka
Учасник
Зареєстрований: 2022-10-07
Повідомлень: 7

Re: Простейшее меню выбора на LCD 2004

Васятко пише:
ju4ka пише:

Понимаю что описал сумбурно, если нужно будет - прикреплю видео с проблемой "в железе".

Давай, прикрепляй

https://www.youtube.com/watch?v=v6gnyaYrsvA

Неактивний

#4 2022-10-07 17:16:09

Васятко
Гість

Re: Простейшее меню выбора на LCD 2004

т.е. нужно чтобі после delay() следующий void xxx() выполнился только после нажатия кнопки?

#5 2022-10-07 17:20:34

ju4ka
Учасник
Зареєстрований: 2022-10-07
Повідомлень: 7

Re: Простейшее меню выбора на LCD 2004

Васятко пише:

т.е. нужно чтобі после delay() следующий void xxx() выполнился только после нажатия кнопки?

не совсем. delay там только для того что бы вообще было понятно порядок выполнения. без него на дисплее мгновенно всё проходит.

мне нужно выполнять определённые void xxx() по нажатию кнопки. и сначала всё так и работает, а потом начинает выполнять следующий void xxx() не по кнопке, а по порядку как написан код. хотя первый void xxx() стоит себе и спокойно ждёт нажатия, как и должен

думал на дребезг контактов, кидал RC цепочку как положено, тестил в Proteus 8 - всё так же

Остання редакція ju4ka (2022-10-07 17:25:47)

Неактивний

#6 2022-10-07 17:27:06

Васятко
Гість

Re: Простейшее меню выбора на LCD 2004

ju4ka пише:

потом начинает выполнять следующий void xxx() не по кнопке, а по порядку как написан код.

Ну так уберите его оттуда. Вместо запуска этого  void xxx() функции взводите соответствующий ей флаг и точно также проверяйте условие - если кнопка нажата и флаг_void_xxx взведен то ...
Или завести переменную-счетчик и менять ее значение по нажатиям кнопок, а в switch-case уже вызывать нужную функцию

#7 2022-10-07 17:34:52

ju4ka
Учасник
Зареєстрований: 2022-10-07
Повідомлень: 7

Re: Простейшее меню выбора на LCD 2004

Васятко пише:
ju4ka пише:

потом начинает выполнять следующий void xxx() не по кнопке, а по порядку как написан код.

Ну так уберите его оттуда. Вместо запуска этого  void xxx() функции взводите соответствующий ей флаг и точно также проверяйте условие - если кнопка нажата и флаг_void_xxx взведен то ...
Или завести переменную-счетчик и менять ее значение по нажатиям кнопок, а в switch-case уже вызывать нужную функцию

Так я так и делаю (взвожу по флагу).
Схема такая:

Воид1:
*код*
*взвод флага на воид2*

Воид2:
*код*
*взвод флага на воид3*

Воид3:
*код*
*взвод флага на воид4*
...

Луп:

проверка кнопки (кнопка нажата и флаг на воид2 == 1)
*сброс флагов*
*переход к воид2*
...

а оно после перехода на воид2 выполняет его и идёт выполнять воид3, хотя флаг на него опущен и кнопка не нажата

Неактивний

#8 2022-10-07 18:11:25

Васятко
Гість

Re: Простейшее меню выбора на LCD 2004

ju4ka пише:

а оно после перехода на воид2 выполняет его и идёт выполнять воид3, хотя флаг на него опущен и кнопка не нажата

Ну а чего вы хотели если у вас постоянно идет опрос tick()? Сделайте так и возможно будет вам щастье
https://wokwi.com/projects/344873097684320851

#9 2022-10-07 18:28:07

ju4ka
Учасник
Зареєстрований: 2022-10-07
Повідомлень: 7

Re: Простейшее меню выбора на LCD 2004

Васятко пише:
ju4ka пише:

а оно после перехода на воид2 выполняет его и идёт выполнять воид3, хотя флаг на него опущен и кнопка не нажата

Ну а чего вы хотели если у вас постоянно идет опрос tick()? Сделайте так и возможно будет вам щастье
https://wokwi.com/projects/344873097684320851

Заработало! Аж стыдно за такую глупость. Опыта программирования: 3 ночи)

Но есть одно НО.
Всё останавливается на переходе ко второму воид (на TB disp2)

https://wokwi.com/projects/344873992096580179 (обновил код)

Посмотрите, пожалуйста, почему так. Спасибо!

Неактивний

#10 2022-10-07 21:03:41

г0cть
Гість

Re: Простейшее меню выбора на LCD 2004

ju4ka пише:

почему так.

Потому что не нужно пользоваться какой от этого автора. Возьмите другую библиотеку или напишите свой обработчик кнопок, всего-то пара строк

#11 2022-10-07 21:07:33

ju4ka
Учасник
Зареєстрований: 2022-10-07
Повідомлень: 7

Re: Простейшее меню выбора на LCD 2004

г0cть пише:
ju4ka пише:

почему так.

Потому что не нужно пользоваться какой от этого автора. Возьмите другую библиотеку или напишите свой обработчик кнопок, всего-то пара строк

Понял. Посоветуйте простую библиотеку для кнопок. Опыта нет, не уверен что не наберу новых проблем с очередной библиотекой. Спасибо!

Неактивний

#12 2022-10-07 22:26:11

г0cть
Гість

Re: Простейшее меню выбора на LCD 2004

https://wokwi.com/projects/344888907889902162
еще желательно добавить обработку дребезга

#13 2022-10-08 06:23:16

ju4ka
Учасник
Зареєстрований: 2022-10-07
Повідомлень: 7

Re: Простейшее меню выбора на LCD 2004

г0cть пише:

https://wokwi.com/projects/344888907889902162
еще желательно добавить обработку дребезга

Огромное спасибо! В Харькове ночью не поспишь, так что сел доделывать проект. Всё замечательно работает. Не могу нарадоваться)

А дребезг поправлю конденсаторами. Мне так легче)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму