U8glib забавная проблема
У меня странная проблема с библиотекой u8glib. Вот код:
void void_Menu_draw_func_men()
{
if ( menu_redraw_required != 0 ) {
u8g.firstPage();
do {
Menu_draw_func_men();
} while( u8g.nextPage() );
menu_redraw_required = 0;
}
}
void Menu_draw_func_men()
{
u8g.setFont(u8g_font_6x13);
u8g.drawStr(30, 0, "Funkcje");
u8g.drawStr(15, 15, "Zerowanie modulu");
u8g.drawStr(15, 30, "Modul na max");
if(menu_pos == 0){u8g.setCursorFont(u8g_font_cursor); u8g.setCursorStyle(144); u8g.enableCursor(); u8g.setCursorPos(10,20);}
if(menu_pos == 1){u8g.setCursorFont(u8g_font_cursor); u8g.setCursorStyle(144); u8g.enableCursor(); u8g.setCursorPos(10,35);}
u8g.setPrintPos(5, 50); u8g.print("R: "); u8g.print(pot_R , 2); u8g.print(" L: "); u8g.print(pot_L , 2);
Serial.println("func md");//just for check...
}
А на OLED-дисплее отображается только курсор, и я могу перемещать его, изменяя значение menu_pos. Но на экране не отображаются ни буквы, ни значения. Только курсор...
Если я скопирую и вставлю только код из void Menu_draw_func_men(); в другую часть моей программы:
void void_Menu_draw_test_man()
{
if ( menu_redraw_required != 0 ) {
u8g.firstPage();
do {
Menu_draw_test_man();
} while( u8g.nextPage() );
menu_redraw_required = 0;
}
}
void Menu_draw_test_man()
{
u8g.setFont(u8g_font_6x13); //заменить эти две строки
u8g.drawStr(0, 0, "wykonywanie tefsdfs man...");
}
Все работает идеально... Я пытался изменить имя void, и не знаю, в чем проблема... Это на Arduino Uno; у меня используется 66% программной памяти и 60% динамической памяти. Может быть, у вас есть какие-то идеи?...
@Jakub, 👍0
2 ответа
Ваша функция void_Menu_draw_test_man() проверяет menu_redraw_required
Обновляет ли эта переменная другая часть программы? Вызываете ли вы функцию void_Menu_draw_test_man() из функции loop()?
Может быть полезно показывать полный код, а не небольшие сегменты, поскольку есть переменные, такие как menu_redraw_required, которые не изменяются нигде в видимой части.
Также обратите внимание, что u8glib больше не обновляется в пользу u8g2
menu_redraw_required присутствует в каждом сегменте кода, но все сегменты заключены в цикл while, поэтому нет возможности обновить menu_redraw_required в разных частях кода... Мой код теперь довольно большой... но когда я вхожу в Menu_draw_func_men(), курсор включается, и я могу его перемещать. Я также добавляю Serial.print();, чтобы быть уверенным, что я вхожу в этот void Menu_draw_func_men();. И я всегда получаю подтверждение в консоли.
Вот как я перехожу на выбранный экран из главного меню:
if (digitalRead(KEY_SELECT) == LOW)
{
in_mmenu = false;
switch(menu_current)
{
case 0:
menu_redraw_required = 1;
key_choose();
break;
case 1:
menu_redraw_required = 1;
test_auto();
break;
case 2:
menu_redraw_required = 1;
test_man();
break;
case 3:
menu_redraw_required = 1;
pot_read_menu();
break;
case 4:
menu_redraw_required = 1;
other_options(); **//ранее я был function_menu**
break;
}
Все экраны работают правильно, практически на одном и том же коде, проблема только с последним экраном в меню...
Посмотрите на фотографии, как это выглядит. Я также добавляю код в меню «Выбор ключа». Просто распечатайте часть.

Как войти в void_Menu_draw... на других экранах всё работает нормально. Только небольшая часть для ввода метода.
if(digitalRead(KEY_NEXT) == LOW)
{unit++; if(unit >= UNIT_ITEMS + 1)
{unit = 1;}
menu_redraw_required = 1; void_Menu_draw_keyMenu(); delay(200);}
и
void void_Menu_draw_keyMenu()
{
if ( menu_redraw_required != 0 ) {
u8g.firstPage();
do {
Menu_draw_keyMenu();
} while( u8g.nextPage() );
menu_redraw_required = 0;
}
}
void Menu_draw_keyMenu()
{
u8g.setFont(u8g_font_6x13);
u8g.drawStr(30, 0, "Wybor klucza");
u8g.drawStr(15, 15, "Zespol: "); u8g.drawStr(60, 15, menu_unit_num[unit - 1]);
u8g.drawStr(15, 30, "Numer mod: "); u8g.drawStr(78, 30, menu_mod_num[module - 1]);
u8g.drawStr(8, 50, "Modul to 2 silniki!");
if(menu_pos == 0 && in == false){u8g.setCursorFont(u8g_font_cursor); u8g.setCursorStyle(144); u8g.enableCursor(); u8g.setCursorPos(10,20);}
if(menu_pos == 1 && in == false){u8g.setCursorFont(u8g_font_cursor); u8g.setCursorStyle(144); u8g.enableCursor(); u8g.setCursorPos(10,35);}
if(menu_pos == 0 && in == true){u8g.setCursorFont(u8g_font_cursor); u8g.setCursorStyle(148); u8g.enableCursor(); u8g.setCursorPos(110,20);}
if(menu_pos == 1 && in == true){u8g.setCursorFont(u8g_font_cursor); u8g.setCursorStyle(148); u8g.enableCursor(); u8g.setCursorPos(110,35);}
}

Показываю вам ещё два кода. Они одинаковые: этот void_Menu_draw_test_man работает, а этот Menu_other_options — нет. Обратите внимание, что я изменил имя с functions_men на other_option, чтобы убедиться, что оно не вызывает эту проблему. Я также обновил u8glib до последней версии. Я пытаюсь использовать библиотеку u8g2, но мне придётся изменить почти всё...
void test_man()
{
menu_redraw_required = 1; void_Menu_draw_test_man();
while(digitalRead(KEY_BACK) == HIGH)
{
if(digitalRead(KEY_PREV) == LOW){menu_pos = 1; menu_redraw_required = 1; void_Menu_draw_test_man(); delay(200);}
if(digitalRead(KEY_NEXT) == LOW){menu_pos = 0; menu_redraw_required = 1; void_Menu_draw_test_man(); delay(200);}
}
menu_redraw_required = 1;
u8g.disableCursor();
in_mmenu = true;
}
void void_Menu_draw_test_man()
{
if ( menu_redraw_required != 0 ) {
u8g.firstPage();
do {
Menu_draw_test_man();
} while( u8g.nextPage() );
menu_redraw_required = 0;
}
}
void Menu_draw_test_man()
{
u8g.setFont(u8g_font_6x13);
u8g.drawStr(40, 0, "Funkcje");
u8g.drawStr(15, 15, "Zerowanie modulu");
u8g.drawStr(15, 30, "Modul na max");
if(menu_pos == 0){u8g.setCursorFont(u8g_font_cursor); u8g.setCursorStyle(144); u8g.enableCursor(); u8g.setCursorPos(10,20);}
if(menu_pos == 1){u8g.setCursorFont(u8g_font_cursor); u8g.setCursorStyle(144); u8g.enableCursor(); u8g.setCursorPos(10,35);}
u8g.setPrintPos(5, 50); u8g.print("R: "); u8g.print(pot_R , 2); u8g.print(" L: "); u8g.print(pot_L , 2);
}
и второй
void other_options()
{
menu_redraw_required = 1; void_Menu_other_options();
while(digitalRead(KEY_BACK) == HIGH)
{
if(digitalRead(KEY_PREV) == LOW){menu_pos = 1; menu_redraw_required = 1; void_Menu_other_options(); delay(200);}
if(digitalRead(KEY_NEXT) == LOW){menu_pos = 0; menu_redraw_required = 1; void_Menu_other_options(); delay(200);}
}
menu_redraw_required = 1;
u8g.disableCursor();
in_mmenu = true;
}
void void_Menu_other_options()
{
if ( menu_redraw_required != 0 ) {
u8g.firstPage();
do {
Menu_other_options();
} while( u8g.nextPage() );
menu_redraw_required = 0;
}
}
void Menu_other_options()
{
u8g.setFont(u8g_font_6x13);
u8g.drawStr(40, 0, "Funkcje");
u8g.drawStr(15, 15, "Zerowanie modulu");
u8g.drawStr(15, 30, "Modul na max");
if(menu_pos == 0){u8g.setCursorFont(u8g_font_cursor); u8g.setCursorStyle(144); u8g.enableCursor(); u8g.setCursorPos(10,20);}
if(menu_pos == 1){u8g.setCursorFont(u8g_font_cursor); u8g.setCursorStyle(144); u8g.enableCursor(); u8g.setCursorPos(10,35);}
u8g.setPrintPos(5, 50); u8g.print("R: "); u8g.print(pot_R , 2); u8g.print(" L: "); u8g.print(pot_L , 2);
}
- Почему я не могу распечатать значения логических переменных (0 и 1) с помощью функции println?
- Как переносить/прокручивать текст с помощью U8G2?
- Печать доступна с помощью U8GLib
- Как прочитать и Serial.print содержимое (текущие значения) 8-битного регистра?
- Serial Monitor печатает странные значения и пропускает строки
- Как скрыть команды Serial.write на последовательном мониторе Arduino?
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
Я проверю библиотеку u8g2, возможно, проблема в моей u8glib..., @Jakub
Насчёт циклов, у меня есть функции while, пока я не нажму кнопку "Назад", а затем я вернусь в главное меню. Всё работает отлично., @Jakub