Меню с переключателем регистров работает некорректно
Надеюсь, это подходящее место для публикации этого вопроса :)
Я пытаюсь отобразить меню на OLED-дисплее SSD1351, к которому я подключаюсь через U8glib. Я пытаюсь получить экран инициализации, а затем долгим нажатием на кнопку (Menu) открыть меню с тремя пунктами (например, option1, option2 и обратно). У меня это работает так:
#include <Button.h> // https://github.com/JChristensen/Button.git
#include "U8glib.h"
#include <Wire.h>
#define PULLUP true
#define INVERT true
#define DEBOUNCE_MS 20
Button ok(2, PULLUP, INVERT, DEBOUNCE_MS);
Button menu(5, PULLUP, INVERT, DEBOUNCE_MS);
Button down(3, PULLUP, INVERT, DEBOUNCE_MS);
Button up(4, PULLUP, INVERT, DEBOUNCE_MS);
U8GLIB_SSD1351_128X128_332 u8g(8, 9, 7);
uint8_t screen = 0;
uint8_t menu_current = 0;
void setup() {
u8g.setFont(u8g_font_unifont);
u8g.setDefaultForegroundColor();
drawScreen();
}
void loop() {
ok.read();
menu.read();
up.read();
down.read();
if (menu.pressedFor(1000) && screen == 0) {
screen = 1;
menu_current = 0;
drawScreen();
}
if (screen == 1) {
if (up.wasReleased()) {
if (menu_current > 0) {
menu_current--;
drawScreen();
}
}
if (down.wasReleased()) {
if (menu_current < 2) {
menu_current++;
drawScreen();
}
}
if (ok.wasReleased()) {
switch (menu_current) {
case 0:
screen = 2;
break;
case 1:
screen = 3;
break;
case 2:
screen = 0;
break;
break;
}
drawScreen();
}
}
if (screen == 2 || screen == 3) {
if (menu.wasReleased()) {
screen = 1;
menu_current = 0;
drawScreen();
}
}
}
void drawScreen() {
u8g.firstPage();
do {
whatToDraw();
} while (u8g.nextPage());
}
void whatToDraw() {
switch (screen) {
case 0: {
u8g.drawStr(0, u8g.getFontLineSpacing(), F("Init"));
} break;
case 1: {
const char *menu_strings[3] = { "option1", "option2", "Back" };
uint8_t i, h;
u8g_uint_t w, d;
u8g.setFontRefHeightText();
u8g.setFontPosTop();
h = u8g.getFontAscent() - u8g.getFontDescent();
w = u8g.getWidth();
for ( i = 0; i < 3; 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]);
}
}
break;
case 2: {
u8g.drawStr(0, u8g.getFontLineSpacing(), F("Option1"));
}
break;
case 3: {
u8g.drawStr(0, u8g.getFontLineSpacing(), F("Option2"));
}
break;
break;
}
}
Вроде бы всё работает, кроме опции «Назад»: при её выборе экран гаснет вместо отображения экрана 0 («Init»). Переменные, похоже, установлены правильно. Есть ли у кого-нибудь идеи, почему это не работает?
Спасибо :)
Дарио
РЕДАКТИРОВАНИЕ: скопировал весь скетч, как и просили :)
@noospy, 👍1
0
Смотрите также:
- Как использовать этот 3-контактный ползунковый переключатель?
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Как переносить/прокручивать текст с помощью U8G2?
- Как подключить трехконтактный переключатель включения-выключения для считывания входных данных?
- digitalRead не читает входной контакт ESP8266-01
- Как переключить 12 В с помощью esp32?
- Использование транзистора NPN в качестве переключателя для включения/выключения двигателя постоянного тока
- Как инициализировать RepRap Discount 12864 на u8glib?