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

Ju4ka
Offline
Зарегистрирован: 27.09.2022

Добрый день!

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

Вид меню:

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

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

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

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

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

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

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

 

001#define _LCD_TYPE 1                           // Тип подключения дисплея (I2C)
002#include <EncButton.h>                        // Библеотека работы с кнопками
003#include <LiquidCrystal_I2C.h>                // Библиотека работы с дисплеем (I2C 20x04)
004EncButton<EB_TICK, 3> btnUp(INPUT_PULLUP);    // Кнопка вверх
005EncButton<EB_TICK, 2> btnDown(INPUT_PULLUP);  // Кнопка вниз
006 
007LiquidCrystal_I2C lcd(0x27, 20, 4);           // Параметры дисплея
008 
009boolean disp1_y;
010boolean disp1_n;
011boolean disp2_y;
012boolean disp2_n;
013boolean disp3_y;
014boolean disp3_n;
015boolean disp4_y;
016boolean disp4_n;
017 
018void setup() {
019  lcd.init();                                 // Инициализация дисплея
020  lcd.backlight();                            // Включить подсветку
021  main_info();                                // Переход к main_info();
022}
023 
024void main_info() {
025  lcd.clear();
026  lcd.home();
027  lcd.print("TB disp1");
028  lcd.setCursor(0, 2);
029  lcd.print("Yes");
030  lcd.setCursor(0, 3);
031  lcd.print("No");
032  disp1_y = 1;
033  disp1_n = 1;
034}
035 
036void disp1_v_y() {
037  lcd.clear();
038  lcd.home();
039  lcd.print("disp1_v_y");
040  delay(3000);
041  test_dist2();
042}
043 
044void disp1_v_n() {
045  lcd.clear();
046  lcd.home();
047  lcd.print("disp1_v_n");
048  delay(3000);
049  test_dist2();
050}
051 
052void test_dist2() {
053  lcd.print("TB disp2");
054  lcd.setCursor(0, 2);
055  lcd.print("Yes");
056  lcd.setCursor(0, 3);
057  lcd.print("No");
058  disp2_y = 1;
059  disp2_n = 1;
060}
061 
062void disp2_v_y() {
063  lcd.clear();
064  lcd.home();
065  lcd.print("disp2_v_y");
066  delay(3000);
067  test_dist3();
068}
069 
070void disp2_v_n() {
071  lcd.clear();
072  lcd.home();
073  lcd.print("disp2_v_n");
074  delay(3000);
075  test_dist3();
076}
077 
078void test_dist3() {}
079 
080void loop() {
081  btnUp.tick();                               // Обработка кнопки вверх
082  btnDown.tick();                             // Обработка кнопки вниз
083 
084  if (btnUp.tick() && disp1_y == 1) {
085         disp1_y = 0;
086         disp1_n = 0;
087         disp1_v_y();
088  }
089 
090  if (btnDown.tick() && disp1_n == 1) {
091         disp1_y = 0;
092         disp1_n = 0;
093         disp1_v_n();
094  }
095 
096  if (btnUp.tick() && disp2_y == 1) {
097         disp2_y = 0;
098         disp2_n = 0;
099         disp2_v_y();
100  }
101 
102  if (btnDown.tick() && disp2_n == 1) {
103         disp2_y = 0;
104         disp2_n = 0;
105         disp2_v_n();
106  }
107 
108 
109}

 

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

Ju4ka пишет:

исполнять void`ы

Это сильно!

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

Ничего не понял, но очень интересно!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Жучка, ты лучше дом охраняй, не исполняй void-ы, трудно это

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

void - по русски Пустота. Это важнейшая концепция Даосизма.

Пустота

По представлениям даосов, Дао возникает в Пустоте. Пустота порождает пространство и время – Космос. Следовательно, Космос рождается в Пустоте. А Пустота – это не нечто полностью не существующее. Она появляется из Единого и Нераздельного как первый необходимый шаг к раздельности. Чтобы раздельность могла осуществиться, она должна быть отделена от другой раздельности промежутком, который и есть Пустота. Даосские мудрецы понимают ее как Пустоту утробы «матери мира», вмещающей в себя и вскармливающей все сущее; или как пустоту колесной втулки, держащей колесо мирового круговорота. Для того чтобы быть собой до конца, Пустота должна сама опустошиться, чтобы в результате стать полнейшей наполненностью.

---------------------------

Так что нефиг наезжать на просветлённого! Тут вам не прогнивший Запад! У нас - свобода совести, понимаешь!

 

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

Пипей, затролили жучку.)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Это что за такой энкодер финтипуперный, аж с двумя кнопками ?

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

Kakmyc пишет:
аж с двумя кнопками ?

Одна втыкивает, вторая вытыкивает... )))))

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

ТС хотел сказать подпрограммы, неужтонепонятно...

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

ua6em пишет:

ТС хотел сказать подпрограммы, неужтонепонятно...

Если хотел, то почему не сказал? Кто или что помешало?

Так можно сказать, что в посте #1 я хотел полностью решить все настоящие и будущие проблемы ТС, "неужтонепонятно".

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Encbutton примеры еще раз посмотрите, btnUp.tick(); это опрос кнопок, а в условиях нужен click

Также рекомендуется делать сброс флагов resetState() чтобы одно нажатие несколько раз не обрабатывалось (если все флаги в условиях сойдутся, мало ли))) ).

01void loop() {
02  btnUp.tick();                               // Обработка кнопки вверх
03  btnDown.tick();                             // Обработка кнопки вниз
04 
05  if (btnUp.click() && disp1_y == 1) {
06    disp1_y = 0;
07    disp1_n = 0;
08    disp1_v_y();
09    btnUp.resetState();
10  }
11 
12  if (btnDown.click() && disp1_n == 1) {
13    disp1_y = 0;
14    disp1_n = 0;
15    disp1_v_n();
16    btnDown.resetState();
17  }
18 
19  if (btnUp.click() && disp2_y == 1) {
20    disp2_y = 0;
21    disp2_n = 0;
22    disp2_v_y();
23    btnUp.resetState();
24  }
25 
26  if (btnDown.click() && disp2_n == 1) {
27    disp2_y = 0;
28    disp2_n = 0;
29    disp2_v_n();
30    btnDown.resetState();
31  }
32 
33 
34}

 

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

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

"неужтонепонятно"

я о другом, что мы хотим от ТС если мэтры от Adafruit такое пишут:
 

01/*!
02    @brief  Instantiate Adafruit ILI9341 driver with hardware SPI using
03            a specific SPI peripheral (not necessarily default).
04    @param  spiClass  Pointer to SPI peripheral (e.g. &SPI or &SPI1).
05    @param  dc        Data/Command pin # (required).
06    @param  cs        Chip select pin # (optional, pass -1 if unused and
07                      CS is tied to GND).
08    @param  rst       Reset pin # (optional, pass -1 if unused).
09*/
10/**************************************************************************/
11Adafruit_ILI9341::Adafruit_ILI9341(SPIClass *spiClass, int8_t dc, int8_t cs,
12                                   int8_t rst)
13    : Adafruit_SPITFT(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, spiClass, cs, dc,
14                      rst) {}
15#endif // end !ESP8266
16 
17================================================================
18 
19/*!
20    @brief  Instantiate Adafruit ST7735 driver with selectable hardware SPI
21    @param  spiClass  Pointer to an SPI device to use (e.g. &SPI1)
22    @param  cs        Chip select pin #
23    @param  dc        Data/Command pin #
24    @param  rst       Reset pin # (optional, pass -1 if unused)
25*/
26Adafruit_ST7735::Adafruit_ST7735(SPIClass *spiClass, int8_t cs, int8_t dc,
27                                 int8_t rst)
28    : Adafruit_ST77xx(ST7735_TFTWIDTH_128, ST7735_TFTHEIGHT_160, spiClass, cs,
29                      dc, rst) {}
30#endif // end !ESP8266

 

Как думаете за это на костёр или можно ограничится лесоповалом? )))

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

Ой из контекста вырвал, ой ж@па горит )))

maxi_10
Offline
Зарегистрирован: 05.01.2012

Ju4ka пишет:

Добрый день!

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

Вид меню:

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

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

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

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

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

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

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

 

Если еще актуально, вот глянь как я реализовал меню на экодоре и 2004

смотри код в сообщении от Пт, 21/08/2015 - 11:15

https://arduino.ru/forum/proekty/kontroller-dlya-pivovarni-moya-versiya