Официальный сайт компании Arduino по адресу arduino.cc
HELP! Управление функциями из меню U8GLIB..
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Имеется скетч из библиотеки 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 }
облазил пол интернета и такое ощущение что ардуинщики кроме зажиганий светодиодов ничем не занимаются,
Это очень хорошая новость.
Значит, поисковые системы, наконец, научились выдавать именно то, что нужно пользователю.
Научитесь сначала мигать светодиодом, и тогда в выдаче получите результаты посложнее.
такое ощущение что ардуинщики кроме зажиганий светодиодов ничем не занимаются
Так и есть. Ардуина именно для этого и предназначена.
ардуинщики кроме зажиганий светодиодов ничем не занимаются
хочу добавить функции пунктам из меню, чтобы при нажатии кнопки над определенной строкой выполнялось действие какоето
ну так добавьте. У вас есть процедура update_menu(). в ней обработка нажатия кнопок. Добавьте в switch обработку кнопки SELECT и в зависимости отномера строки меню выполняйте действия
// u8g.setRot180(); хочется чтобы выполнялась эта функция
эти строки там совсем не для этого
А можно поподробнее про добавление, как правильно записать, все так сложно D; для восприятия. Можете пример написать?
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" то при нажатии на селект маркер возвращается на строку фест лайн и больше ничего не происходит ( добавил равно "==" и оставил ноль, меню переворачивается и работает но назад экран не поворачивается, как исправить?
А нет не сработало, при нажатии селекта тупо переворачивается, и на каком пункте стоит без разницы ; | если поставить ноль вместо имени "First Line" то при нажатии на селект маркер возвращается на строку фест лайн и больше ничего не происходит ( добавил равно "==" и оставил ноль, меню переворачивается и работает но назад экран не поворачивается, как исправить?
1. Подумать, что такое menu_current и какие значения оно может принимать глядя вот на такие строчки:
#define MENU_ITEMS 4
menu_current++;
menu_current = 0;
menu_current = MENU_ITEMS;
menu_current--
2. Почитать про IF
Информативность у вашей ссылки нулевая, все примеры для работы с числами или светодиодами, что за бред где нормальные примеры, ну непонятно же, ну узнал я что иф сравнение делает, что дальше? Нет инфы как имена записывать, в каждой библиотеке функции состоят из набора непонятных символов, и получается чтобы пользоватся каждой, нужно каждую учить, ну что за шляпа?
Меню курент = текущее меню как я понял методом тыка, это тот пункт который выделен в данны момент/
есть еще непонятная строчка uint8_t menu_current = 0;
Исходя из логики можно подумать что менюкурент ++ и -- это перемещение по строкам, что значит менюкур = менюитем вообще непонятно.
Так же шляпа с кнопками непонятная:
#define KEY_PREV 1
#define KEY_NEXT 2
#define KEY_SELECT 3
#define KEY_BACK 4 // аналогично хз зачем нужна когда вроде стоит на пине а зчем нужна если в пункты меню нельзя входить и выходить из них, наверное для возврата в предыдущее меню, могли бы пример хотяб добавить
uint8_t uiKeyNext = 3;
uint8_t uiKeySelect = 2;
uint8_t uiKeyBack = 8;
uint8_t uiKeyCodeSecond = KEY_NONE; \\ и это
У меня уже жопа горит от этой херни. Кто эти сверх люди которые делают мега проэкты на ардуине, почему они на формах не сидят.
Информативность у вашей ссылки нулевая
Проблемма на вашей стороне, но это тоже талант из прочитанного не почерпнуть ни толики информации.
все примеры для работы с числами или светодиодами, что за бред где нормальные примеры,
Светодиоды в примерах это только аналогия , вместо включения светодиода может быть все, что угодно - тот же вызов функции
ну непонятно же, ну узнал я что иф сравнение делает, что дальше?
IF проверят верность условий и позволяет выполнить или пропустить некоторый код. И прочитав ссылку можно понять какой код будет выполнен, а какой пропущен.
Исходя из логики можно подумать что менюкурент ++ и -- это перемещение по строкам, что значит менюкур = менюитем вообще непонятно.
Информативность у вашей ссылки нулевая,
Правильно. Вы начните читать не со светодиодов, а с нормального учебника программирования. А когда библиотеки перестанут состоять из непонятных символов, вот тогда и переходите к светодиодам.
в каждой библиотеке функции состоят из набора непонятных символов, и получается чтобы пользоватся каждой, нужно каждую учить, ну что за шляпа?
чтобы пользоватся библиотеками - не только каждую знать надо, надо до этого еще выучить язык программирования. Судя по вашим комментам, знаний у вас нет совсем - это значит, что никакие примеры и ссылки вам не помогут. Прежде чем начать разбиратся в своем меню, вам надо сидеть и читать азы, причем не день и не два, а несколько месяцев.
Я пробовал учить с самого нуля, но как я понял это c++ и там все команды другие нежели в библиотеках, просто удручает тот факт что нужно потратить кучу времени на изучение всего подряд, при том что большая часть вообще не пригодится, а потом сделать разовый проэкт и забыть все со временем, я думал ардуина обойдется малой кровью, а тут я не только бабоса влил немерено на всякую хрень, дак еще и времени убил, непонятно на что дня 3-4 в поисках и чтении. С первого раза хрен запомнишь что функци что имя что переменная и где они должны стоять и как выглядить, какието скобки запятые кавычки, напихали все что можно было, еще и у каждой библиотеки по разному. Есть какойто фаст способ? Хоть кто то может намек кинуть с чего конкретно начать, и что мне реально поможет? Хотя утверждают что ардуина платформа с помощью которой новички могут делать свои проэкты, а на деле нужно 10 лет учить непонятно что, есть похожие проэкты, но там и библиотеки разные и модули. И вообще в скетчах даже намека нет как это моим комплектующим поможет.
Почему во всех ветках одни и те же люди комментируют, вы кто вообще?
потом сделать разовый проэкт и забыть все
проще даже и не вникать. Заказать проектик у skif бесплатно и пользоваца.
Почему во всех ветках одни и те же люди комментируют, вы кто вообще?
Каминтатары
нужно потратить кучу времени на изучение всего подряд, при том что большая часть вообще не пригодится
"Жизнь такова, какова она есть и больше никакова"
я думал ардуина обойдется малой кровью,
Ошибся
времени убил, непонятно на что дня 3-4 в поисках и чтении.
Это разве время? Что начать разбираться - полгода минимум.
Хоть кто то может намек кинуть с чего конкретно начать, и что мне реально поможет?
Конечно. Для начала вот это. Только не "пролистать", а прочитать, разбирая и запуская все приведённые примеры и добиваясь, чтобы они заработали и были полностью понятны. Как закончите, спросите ещё, скажу, что дальше.
Хотя утверждают что ардуина платформа с помощью которой новички могут делать свои проэкты
Весь инетрнет забит стопудоворабочими способами удлинения письки и увеличения потенции. Вы всему, что
на заборахв рекламе написано верите?Да и когда такое пишут, предполагают некоторый начальный уровень. Не думете же Вы, что это сможет делать человек, напрмиер, не умеющий читать. А если начальный уровень, например - информатика средней школы, то да, освоить можно достаточно быстро.
если начальный уровень, например - информатика средней школы, то да, освоить можно достаточно быстро.
И все равно надо понимать, что "достаточно быстро" - это 3-6 месяцев, а не пара дней.
И все равно надо понимать, что "достаточно быстро" - это 3-6 месяцев, а не пара дней.
С учетом его таланта, нулевой впитываемости информации, полугода точно не хватит.
в каждой библиотеке функции состоят из набора непонятных символов, и получается чтобы пользоватся каждой, нужно каждую учить, ну что за шляпа?
красава ) хотел что то к этому добавить, но не смог :)
https://www.youtube.com/watch?v=TuJaj1xWszE
Хотя утверждают что ардуина платформа с помощью которой новички могут делать свои проэкты
Могут. У меня ребенок светофор сделал. Вы просто прыгаете через две ступеньки, экранчик с меню - это потом или сидите разбирайтесь.
там и библиотеки разные и модули
Берете и грызете по одной. Каждую функцию хотя бы на предмет что она делает (у вас голове образуется этакий индекс... когда вам понадобится, к примеру, нарисовать прямоугольник с закругленными краями - будете знать где искать). Ради одного проекта все это бессмысленно - это как права получать чтобы один раз куда то доехать на авто, ну разве что вам таймер нужен какой то или мигалка для гирлянды. Да и проблема ваша не в незнании библиотек, типичная такая проблема когда при изучении нового предмета непонятно вообще ничего и непонятно как связать что то одно с чем то другим - это нормально. У меня такое было недавно когда ЧПУ смастерил, оказалось что нужно дохрена еще чего знать и несколько фрез сломать чтобы выпилить то, что надо, нарисовав в CAD'е с чистого листа (начиная собственно с CADа) :)
злые вы , ещё одного пацана затюкали и ничего за него не сделали.
карма минус, день впустую....
щас как SyxzSyxz всех пошлёт...
Ну, ты, блин, даёшь!
день впустую....
С чего бы это?
Сам же пишешь:
ещё одного пацана затюкали...
Удачный день!
Ой. А вы ещё про case не сказали!
Типа
switch (currentmenu) {
case 1:
//выполняется, когда currentmenu равно 1
break;
case 2:
//выполняется когда currentmenu равно 2
break;
default:
// выполняется, если не выбрана ни одна альтернатива
// default необязателен
}
Сколько ещё изучить можно! Хотя в программе switch есть для кнопок, но можно же ещё раз попробовать использовать!
Может кому дальнейшем понадобится, конечно не на русском но с переводом более мение понятно https://github.com/olikraus/u8glib/wiki/userreference