HELP! Управление функциями из меню U8GLIB..

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

Имеется скетч из библиотеки u8glib, который создает меню с возможностью хождения по пунктам с выделением пункта белой полосой, облазил пол интернета и такое ощущение что ардуинщики кроме зажиганий светодиодов ничем не занимаются, помогите разобратся, хочу добавить функции пунктам из меню, чтобы при нажатии кнопки над определенной строкой выполнялось действие какоето, либо включение светодиода, либо разворот изображение дисплея на 180 градусов. В скетче есть закомментированые строки // rotate screen, if required
  // u8g.setRot180(); хочется чтобы выполнялась эта функция при выборе какого то пункта и нажатии кнопки селект которая идет к пину 2. Если кто то может скинуть ссылку на информацию по выполнению таких функций или написать пример к библиотеке буду очень благодарен. Сам скетч: 

#include "U8glib.h"

//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI 
//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI 
  //Две модели дисплея, которые я использую только у второго разрешение 64x32 если кто знает как подогнать библиотеку под такое разрешение напишите пожалуйста

#define KEY_NONE 0
#define KEY_PREV 1
#define KEY_NEXT 2
#define KEY_SELECT 3
#define KEY_BACK 4

// DOGS102 shield configuration values
//uint8_t uiKeyPrev = 2;
//uint8_t uiKeyNext = 4;
//uint8_t uiKeySelect = 5;
//uint8_t uiKeyBack = 3;

// DOGM128-Shield	 configuration values
// DOGXL60-Shield configuration values
uint8_t uiKeyPrev = 7;
uint8_t uiKeyNext = 3;
uint8_t uiKeySelect = 2;
uint8_t uiKeyBack = 8;

uint8_t uiKeyCodeFirst = KEY_NONE;
uint8_t uiKeyCodeSecond = KEY_NONE;
uint8_t uiKeyCode = KEY_NONE;


void uiSetup(void) {
  // configure input keys 
  
  pinMode(uiKeyPrev, INPUT_PULLUP);           // set pin to input with pullup
  pinMode(uiKeyNext, INPUT_PULLUP);           // set pin to input with pullup
  pinMode(uiKeySelect, INPUT_PULLUP);           // set pin to input with pullup
  pinMode(uiKeyBack, INPUT_PULLUP);           // set pin to input with pullup
}

void uiStep(void) {
  uiKeyCodeSecond = uiKeyCodeFirst;
  if ( digitalRead(uiKeyPrev) == LOW )
    uiKeyCodeFirst = KEY_PREV;
  else if ( digitalRead(uiKeyNext) == LOW )
    uiKeyCodeFirst = KEY_NEXT;
  else if ( digitalRead(uiKeySelect) == LOW )
    uiKeyCodeFirst = KEY_SELECT;
  else if ( digitalRead(uiKeyBack) == LOW )
    uiKeyCodeFirst = KEY_BACK;
  else 
    uiKeyCodeFirst = KEY_NONE;
  
  if ( uiKeyCodeSecond == uiKeyCodeFirst )
    uiKeyCode = uiKeyCodeFirst;
  else
    uiKeyCode = KEY_NONE;
}


#define MENU_ITEMS 4
const char *menu_strings[MENU_ITEMS] = { "First Line", "Second Item", "3333333", "abcdefg" };

uint8_t menu_current = 0;
uint8_t menu_redraw_required = 0;
uint8_t last_key_code = KEY_NONE;


void drawMenu(void) {
  uint8_t i, h;
  u8g_uint_t w, d;

  u8g.setFont(u8g_font_6x13);
  u8g.setFontRefHeightText();
  u8g.setFontPosTop();
  
  h = u8g.getFontAscent()-u8g.getFontDescent();
  w = u8g.getWidth();
  for( i = 0; i < MENU_ITEMS; i++ ) {
    d = (w-u8g.getStrWidth(menu_strings[i]))/2;
    u8g.setDefaultForegroundColor();
    if ( i == menu_current ) {
      u8g.drawBox(0, i*h+1, w, h);
      u8g.setDefaultBackgroundColor();
    }
    u8g.drawStr(d, i*h, menu_strings[i]);
  }
}

void updateMenu(void) {
  if ( uiKeyCode != KEY_NONE && last_key_code == uiKeyCode ) {
    return;
  }
  last_key_code = uiKeyCode;
  
  switch ( uiKeyCode ) {
    case KEY_NEXT:
      menu_current++;
      if ( menu_current >= MENU_ITEMS )
        menu_current = 0;
      menu_redraw_required = 1;
      break;
    case KEY_PREV:
      if ( menu_current == 0 )
        menu_current = MENU_ITEMS;
      menu_current--;
      menu_redraw_required = 1;
      break;
  }
}


void setup() {
  // rotate screen, if required
  // u8g.setRot180();
  
  uiSetup();                                // setup key detection and debounce algorithm
  menu_redraw_required = 1;     // force initial redraw
}

void loop() {  

  uiStep();                                     // check for key press
    
  if (  menu_redraw_required != 0 ) {
    u8g.firstPage();
    do  {
      drawMenu();
    } while( u8g.nextPage() );
    menu_redraw_required = 0;
  }

  updateMenu();                            // update menu bar
  
}

 

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

dedmusoroed пишет:
облазил пол интернета и такое ощущение что ардуинщики кроме зажиганий светодиодов ничем не занимаются
Так и есть.

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

dedmusoroed пишет:

облазил пол интернета и такое ощущение что ардуинщики кроме зажиганий светодиодов ничем не занимаются, 

Это очень хорошая новость.

Значит, поисковые системы, наконец, научились выдавать именно то, что нужно пользователю.

Научитесь сначала мигать светодиодом, и тогда в выдаче получите результаты посложнее.

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

dedmusoroed пишет:

 такое ощущение что ардуинщики кроме зажиганий светодиодов ничем не занимаются

Так и есть.  Ардуина именно для этого и предназначена. 

5N62V
Offline
Зарегистрирован: 25.02.2016

dedmusoroed пишет:

 ардуинщики кроме зажиганий светодиодов ничем не занимаются


 

я еще буззером пикать умею! 

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

dedmusoroed пишет:

хочу добавить функции пунктам из меню, чтобы при нажатии кнопки над определенной строкой выполнялось действие какоето

ну так добавьте. У вас есть процедура update_menu(). в ней обработка нажатия кнопок. Добавьте в switch обработку кнопки SELECT и в зависимости отномера строки меню выполняйте действия

dedmusoroed пишет:
В скетче есть закомментированые строки // rotate screen, if required
  // u8g.setRot180(); хочется чтобы выполнялась эта функция

эти строки там совсем не для этого

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

А можно поподробнее про добавление, как правильно записать, все так сложно D; для восприятия. Можете пример написать?

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

  switch ( uiKeyCode ) {
    case KEY_NEXT:
      menu_current++;
      if ( menu_current >= MENU_ITEMS )
        menu_current = 0;
      menu_redraw_required = 1;
      break;
    case KEY_PREV:
      if ( menu_current == 0 )
        menu_current = MENU_ITEMS;
      menu_current--;
      menu_redraw_required = 1;
      break;
    case KEY_SELECT:
     if (menu_current = "First Line")
     u8g.setRot180();
     menu_redraw_required = 1;
     break;

Добавил вроде сработало, после выбора фест лайна экран переворачивается но меню больше неработет, и пункты не выбираются и обратно не переключается вид. Блин вбивал вообще на угад, методом подбора, я бы еще знал как записываются функции, было бы норм, может знаете как уроки найти на эту тему, просто незнаю даже как в гугл забить. Где можно про функции эти прочитать и узнать какие есть вообще.  А нет не сработало, при нажатии селекта тупо переворачивается, и на каком пункте стоит без разницы ; | если поставить ноль вместо имени "First Line" то при нажатии на селект маркер возвращается на строку фест лайн и больше ничего не происходит ( добавил равно "==" и оставил ноль, меню переворачивается и работает но назад экран не поворачивается, как исправить?

     

ven-til
Offline
Зарегистрирован: 13.02.2018

dedmusoroed пишет:

А нет не сработало, при нажатии селекта тупо переворачивается, и на каком пункте стоит без разницы ; | если поставить ноль вместо имени "First Line" то при нажатии на селект маркер возвращается на строку фест лайн и больше ничего не происходит ( добавил равно "==" и оставил ноль, меню переворачивается и работает но назад экран не поворачивается, как исправить?

1. Подумать, что такое menu_current и какие значения оно может принимать глядя вот на такие строчки:

#define MENU_ITEMS 4
menu_current++;
menu_current = 0;
menu_current = MENU_ITEMS;
menu_current--

2. Почитать про IF

 

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

Информативность у вашей ссылки нулевая, все примеры для работы с числами или светодиодами, что за бред где нормальные примеры, ну непонятно же, ну узнал я что иф сравнение делает, что дальше? Нет инфы как имена записывать, в каждой библиотеке функции состоят из набора непонятных символов, и получается чтобы пользоватся каждой, нужно каждую учить, ну что за шляпа?
​Меню курент = текущее меню как я понял методом тыка, это тот пункт который выделен в данны момент/
​есть еще непонятная строчка uint8_t menu_current = 0;

Исходя из логики можно подумать что менюкурент ++ и -- это перемещение по строкам, что значит менюкур = менюитем вообще непонятно.
​Так же шляпа с кнопками непонятная: 

#define KEY_NONE 0 // хз что за кнопка ничего не делает вообще и непонятно зачем нужна
#define KEY_PREV 1
#define KEY_NEXT 2
#define KEY_SELECT 3
#define KEY_BACK 4   // аналогично хз зачем нужна когда вроде стоит на пине а зчем нужна если в пункты меню нельзя входить и выходить из них, наверное для возврата в предыдущее меню, могли бы пример хотяб добавить
 
uint8_t uiKeyPrev = 7;
uint8_t uiKeyNext = 3;
uint8_t uiKeySelect = 2;
uint8_t uiKeyBack = 8;
 
uint8_t uiKeyCodeFirst = KEY_NONE;  // что это вообще?
uint8_t uiKeyCodeSecond = KEY_NONE; \\ и это
uint8_t uiKeyCode = KEY_NONE; || и это тоже? что значит уикей? и uint8_t ??
При попытке что то пробить по гуглу вылазиет либо этот пост, либо куча форумов, где в основном на английском языке, где в портянках присутствуют эти строки и нет пояснений к ним, где инструкцию по библиотеке взять,
с примерами разными и пояснениями почему пишется так а не так, и чтобы не про числа какието то и не светодиоды, а разнообразные, есть же скетч меню в бибилотеке почему нет уроков и инфы по ней на эту тему.
​У меня уже жопа горит от этой херни. Кто эти сверх люди которые делают мега проэкты на ардуине, почему они на формах не сидят.

 

 

 

ven-til
Offline
Зарегистрирован: 13.02.2018

dedmusoroed пишет:

Информативность у вашей ссылки нулевая

Проблемма на вашей стороне, но это тоже талант из прочитанного не почерпнуть ни толики информации.

dedmusoroed пишет:

все примеры для работы с числами или светодиодами, что за бред где нормальные примеры,

Светодиоды в примерах это только аналогия , вместо включения светодиода может быть все, что угодно - тот же вызов функции

dedmusoroed пишет:

ну непонятно же, ну узнал я что иф сравнение делает, что дальше?

IF проверят верность условий и позволяет выполнить или пропустить некоторый код. И прочитав ссылку можно понять какой код будет выполнен, а какой пропущен.

 

dedmusoroed пишет:

Исходя из логики можно подумать что менюкурент ++ и -- это перемещение по строкам, что значит менюкур = менюитем вообще непонятно.

​Исходя из логики можно понять, что в переменной menu_current хранится какое-то число

 

 

 

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

dedmusoroed пишет:

Информативность у вашей ссылки нулевая,

Правильно. Вы начните читать не со светодиодов, а с нормального учебника программирования. А когда библиотеки перестанут состоять из непонятных символов, вот тогда и переходите к светодиодам.

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

dedmusoroed пишет:

в каждой библиотеке функции состоят из набора непонятных символов, и получается чтобы пользоватся каждой, нужно каждую учить, ну что за шляпа?

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

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

Я пробовал учить с самого нуля, но как я понял это c++ и там все команды другие нежели в библиотеках, просто удручает тот факт что нужно потратить кучу времени на изучение всего подряд, при том что большая часть вообще не пригодится, а потом сделать разовый проэкт и забыть все со временем, я думал ардуина обойдется малой кровью, а тут я не только бабоса влил немерено на всякую хрень, дак еще и времени убил, непонятно на что дня 3-4 в поисках и чтении. С первого раза хрен запомнишь что функци что имя что переменная и где они должны стоять и как выглядить, какието скобки запятые кавычки, напихали все что можно было, еще и у каждой библиотеки по разному. Есть какойто фаст способ? Хоть кто то может намек кинуть с чего конкретно начать, и что мне реально поможет? Хотя утверждают что ардуина платформа с помощью которой новички могут делать свои проэкты, а на деле нужно 10 лет учить непонятно что, есть похожие проэкты, но там и библиотеки разные и модули. И вообще в скетчах даже намека нет как это моим комплектующим поможет.

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

Почему во всех ветках одни и те же люди комментируют, вы кто вообще?

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

dedmusoroed пишет:

 потом сделать разовый проэкт и забыть все 

проще даже и не вникать. Заказать проектик у skif бесплатно и пользоваца. 

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

dedmusoroed пишет:

Почему во всех ветках одни и те же люди комментируют, вы кто вообще?

Каминтатары

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

dedmusoroed пишет:

нужно потратить кучу времени на изучение всего подряд, при том что большая часть вообще не пригодится

"Жизнь такова, какова она есть и больше никакова"

dedmusoroed пишет:

я думал ардуина обойдется малой кровью, 

Ошибся

dedmusoroed пишет:

времени убил, непонятно на что дня 3-4 в поисках и чтении. 

Это разве время? Что начать разбираться - полгода минимум.

dedmusoroed пишет:

Хоть кто то может намек кинуть с чего конкретно начать, и что мне реально поможет? 

Конечно. Для начала вот это. Только не "пролистать", а прочитать, разбирая и запуская все приведённые примеры и добиваясь, чтобы они заработали и были полностью понятны. Как закончите, спросите ещё, скажу, что дальше.

dedmusoroed пишет:

Хотя утверждают что ардуина платформа с помощью которой новички могут делать свои проэкты

Весь инетрнет забит стопудоворабочими способами удлинения письки и увеличения потенции. Вы всему, что на заборах в рекламе написано верите?

Да и когда такое пишут, предполагают некоторый начальный уровень.  Не думете же Вы, что это сможет делать человек, напрмиер, не умеющий читать. А если начальный уровень, например - информатика средней школы, то да, освоить можно достаточно быстро.

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

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

 если начальный уровень, например - информатика средней школы, то да, освоить можно достаточно быстро.

И все равно надо понимать,  что "достаточно быстро" - это 3-6 месяцев, а не пара дней.

ven-til
Offline
Зарегистрирован: 13.02.2018

b707 пишет:

И все равно надо понимать,  что "достаточно быстро" - это 3-6 месяцев, а не пара дней.

С учетом его таланта, нулевой впитываемости информации, полугода точно не хватит.

Morroc
Offline
Зарегистрирован: 24.10.2016

dedmusoroed пишет:

в каждой библиотеке функции состоят из набора непонятных символов, и получается чтобы пользоватся каждой, нужно каждую учить, ну что за шляпа?

красава ) хотел что то к этому добавить, но не смог :)

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

dedmusoroed пишет:

Хотя утверждают что ардуина платформа с помощью которой новички могут делать свои проэкты

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

dedmusoroed пишет:

там и библиотеки разные и модули

Берете и грызете по одной. Каждую функцию хотя бы на предмет что она делает (у вас голове образуется этакий индекс... когда вам понадобится, к примеру, нарисовать прямоугольник с закругленными краями - будете знать где искать). Ради одного проекта все это бессмысленно - это как права получать чтобы один раз куда то доехать на авто, ну разве что вам таймер нужен какой то или мигалка для гирлянды. Да и проблема ваша не в незнании библиотек, типичная такая проблема когда при изучении нового предмета непонятно вообще ничего и непонятно как связать что то одно с чем то другим - это нормально. У меня такое было недавно когда ЧПУ смастерил, оказалось что нужно дохрена еще чего знать и несколько фрез сломать чтобы выпилить то, что надо, нарисовав в CAD'е с чистого листа (начиная собственно с CADа) :)

vvadim
Offline
Зарегистрирован: 23.05.2012

злые вы , ещё одного пацана затюкали и ничего за него не сделали.

карма минус, день впустую....

щас как SyxzSyxz всех пошлёт...

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ну, ты, блин, даёшь!

vvadim пишет:

день впустую....

С чего бы это?

Сам же пишешь:

vvadim пишет:

ещё одного пацана затюкали...

Удачный день!

nik182
Offline
Зарегистрирован: 04.05.2015

Ой. А вы ещё про case не сказали!
Типа
switch (currentmenu) {
case 1:
//выполняется, когда currentmenu равно 1
break;
case 2:
//выполняется когда currentmenu равно 2
break;
default:
// выполняется, если не выбрана ни одна альтернатива
// default необязателен
}
Сколько ещё изучить можно! Хотя в программе switch есть для кнопок, но можно же ещё раз попробовать использовать!

GGG
Offline
Зарегистрирован: 07.08.2019

Может кому дальнейшем понадобится, конечно не на русском но с переводом более мение понятно https://github.com/olikraus/u8glib/wiki/userreference