Проблема с меню настроек
- Войдите на сайт для отправки комментариев
Пнд, 15/08/2022 - 00:26
Новичок, первая неделя. Проект по просьбе друга. Инкубатор для рептилий.
Сейчас пытаюсь сделать меню для настройки начальных данных с записью значении в eeprom. В целом все получается, но после прохождения цикла пунктов меню не возвращается к начальному экрану ( просто чистый экран и по нажатию кнопки снова заходит в настойки ), где будут отображаться данные с датчиков.
Помогите с определением проблемы и возможно советами по оптимизации. Целевая платформа Nano.
#include "U8glib.h" #include <EEPROM.h> U8GLIB_ST7920_128X64_4X u8g(10); #define KEY_NONE 0 #define KEY_PREV 1 #define KEY_NEXT 2 #define KEY_SELECT 3 uint8_t uiKeyPrev = 8; uint8_t uiKeyNext = 9; uint8_t uiKeySelect = 12; uint8_t uiKeyCodeFirst = KEY_NONE; uint8_t uiKeyCodeSecond = KEY_NONE; uint8_t uiKeyCode = KEY_NONE; int dInk = 0; int egg = 0; int alarmTemp = 0; int fanTemp = 0; boolean needSave; boolean menu; 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 } 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 uiKeyCodeFirst = KEY_NONE; if ( uiKeyCodeSecond == uiKeyCodeFirst ) uiKeyCode = uiKeyCodeFirst; else uiKeyCode = KEY_NONE; } #define MENU_ITEMS 5 const char *menu_strings[MENU_ITEMS] = {"SETTINGS", "DAY INK", "EGG SETUP", "ALARM D.TEMP", "FAN D.TEMP" }; const int menu_ee[MENU_ITEMS] = {0, 100, 110, 106, 108 }; int menu_value[MENU_ITEMS]; 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(5, i * h, menu_strings[i]); u8g.setPrintPos(105, i * h); u8g.print(menu_value[i]); } } void updateMenu(void) { if ( uiKeyCode != KEY_NONE && last_key_code == uiKeyCode ) { return; } last_key_code = uiKeyCode; switch ( uiKeyCode ) { case KEY_SELECT: menu_current++; if ( menu_current >= MENU_ITEMS ) { menu_redraw_required = 0; menu_current = 0; menu = 0; break; } if ( needSave == 1 ) { //Serial.println(menu_ee[menu_current - 1]); //Serial.println(menu_value[menu_current - 1]); EEPROM_int_write(menu_ee[menu_current - 1], menu_value[menu_current - 1]); needSave = 0; } menu = 1; menu_redraw_required = 1; break; case KEY_NEXT: //if ( menu_current == 0 ) // menu_current = MENU_ITEMS; menu_value[menu_current]++; menu_redraw_required = 1; needSave = 1; break; case KEY_PREV: //if ( menu_current == 0 ) // menu_current = MENU_ITEMS; menu_value[menu_current]--; menu_redraw_required = 1; needSave = 1; break; } Serial.print("menu_current="); Serial.println(menu_current); } void readSet() { menu_value[1] = EEPROM_int_read(100); menu_value[2] = EEPROM_int_read(110); menu_value[3] = EEPROM_int_read(106); menu_value[4] = EEPROM_int_read(108); //if (dInk > 36 || dInk < 0) { // dInk = 0; // } void draw(void) { u8g.setFont(u8g_font_unifont); u8g.drawStr( 07, 18, "Incubator 0.1"); u8g.drawStr( 07, 58, "with Arduino"); } void setup() { Serial.begin(115200); readSet(); menu = 0; //u8g.firstPage(); // do { // draw(); // } while ( u8g.nextPage() ); //menu_value[MENU_ITEMS] = { dInk, egg, alarmTemp, fanTemp }; uiSetup(); // setup key detection and debounce algorithm menu_redraw_required = 0; // force initial redraw } void loop() { Serial.println("loop"); uiStep(); // check for key press //u8g.firstPage(); //do { // draw(); //} while ( u8g.nextPage() ); if ( menu == 0 ) { u8g.firstPage(); do { draw(); Serial.println("draw"); } while ( u8g.nextPage() ); //menu_redraw_required = 0; } else { u8g.firstPage(); do { drawMenu(); } while ( u8g.nextPage() ); menu_redraw_required = 1; } Serial.print("menu="); Serial.println(menu); Serial.print("menu_redraw_required="); Serial.println(menu_redraw_required); updateMenu(); // update menu bar delay(100); } int EEPROM_int_read(int addr) { byte raw[2]; for (byte i = 0; i < 2; i++) raw[i] = EEPROM.read(addr + i); int &num = (int&)raw; return num; } void EEPROM_int_write(int addr, int num) { byte raw[2]; (int&)raw = num; for (byte i = 0; i < 2; i++) EEPROM.write(addr + i, raw[i]); }
Строка #108 всегда обращает menu в 1, обесценивая действие в #99.
Нет, проблема не в этом, после Menu 0 происходит прерывание цикла.
Переделал цикл, но проблема почему то не решается и не вижу почему
...
Нет, проблема не в этом, после Menu 0 происходит прерывание цикла.
Противоречивые утверждения, не кажется?
По логам видно что заходит в нужный цикл отрисовки начального экрана, но отрисовка не происходит.
/sites/default/files/u67798/snimok_ekrana_2022-08-15_v_09.16.25.png
Может u8g_font_unifont кривой или строки выводятся не туда.
#152 в #145 откопируйте - проверите появится вообще хоть что-то на экране или нет.
https://wokwi.com/projects/340049691659993683. Сделал в эмуляторе для проверки.
Спасибо большое, долго бы до меня доходило, что картинка есть, но с установкой цвета проблема.