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

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

Добрый день!

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

Вид меню:

================
Заголовок 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();
  }


}

 

ЕвгенийП
ЕвгенийП аватар
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() чтобы одно нажатие несколько раз не обрабатывалось (если все флаги в условиях сойдутся, мало ли))) ).

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

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

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

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

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


}

 

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

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

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

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

/*!
    @brief  Instantiate Adafruit ILI9341 driver with hardware SPI using
            a specific SPI peripheral (not necessarily default).
    @param  spiClass  Pointer to SPI peripheral (e.g. &SPI or &SPI1).
    @param  dc        Data/Command pin # (required).
    @param  cs        Chip select pin # (optional, pass -1 if unused and
                      CS is tied to GND).
    @param  rst       Reset pin # (optional, pass -1 if unused).
*/
/**************************************************************************/
Adafruit_ILI9341::Adafruit_ILI9341(SPIClass *spiClass, int8_t dc, int8_t cs,
                                   int8_t rst)
    : Adafruit_SPITFT(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, spiClass, cs, dc,
                      rst) {}
#endif // end !ESP8266

================================================================

/*!
    @brief  Instantiate Adafruit ST7735 driver with selectable hardware SPI
    @param  spiClass  Pointer to an SPI device to use (e.g. &SPI1)
    @param  cs        Chip select pin #
    @param  dc        Data/Command pin #
    @param  rst       Reset pin # (optional, pass -1 if unused)
*/
Adafruit_ST7735::Adafruit_ST7735(SPIClass *spiClass, int8_t cs, int8_t dc,
                                 int8_t rst)
    : Adafruit_ST77xx(ST7735_TFTWIDTH_128, ST7735_TFTHEIGHT_160, spiClass, cs,
                      dc, rst) {}
#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