U8g2 arduino + oled

Тема в разделе "Arduino & Shields", создана пользователем r0c, 6 июн 2023.

  1. r0c

    r0c Гик

    Здравствуйте! Столкнулся с ситуацией, когда на примере использования oled spi дисплея sh1122 разрешением 256*64 точки библиотекой U2g8 lib происходит медленное обновление изображения. Как сделано сейчас(просто для примера)- в цикле на дисплей выводятся рамки, надписи- " напряжение 1=, напряжение 2=, напряжение 3=", тут же цикле опрос трех ацп и тут же вывод значений на дисплей. (Трехканальный вольтметр). Разумнее было бы отправлять на дисплей только обновлённые (изменившиеся)цифровые значения, а фоновые надписи не перерисовать каждый раз, может оформить в виде фоновой картинки. Не могу понять, какой из примеров библиотеки U8g2lib позволяет однократно загрузить статичный фон и обновлять данные только в определённом месте на дисплее? Из всех библиотек для этого дисплея нашлась только U8g2lib. Заранее спасибо, если кто подскажет.
     
  2. User248

    User248 Гик

    Есть возможность пропускать страницы. В данном примере надпись "String 2" заменится на "String 4", а остальное останется не тронутым.
    Код (C++):

    #include <U8g2lib.h>

    // clock, data, reset
    U8G2_SSD1306_128X64_NONAME_1_SW_I2C oled(U8G2_R0, 3, 2, U8X8_PIN_NONE);

    #define OFFSET -3 // смещение экрана по вертикали

    void setup() {
      oled.begin();
      oled.setFont(u8g2_font_t0_16b_tf);

      oled.firstPage();
      do {
        oled.setCursor(0, OFFSET + 16);
        oled.print("String 1");
        oled.setCursor(0, OFFSET + 32);
        oled.print("String 2");
        oled.setCursor(0, OFFSET + 48);
        oled.print("String 3");
      } while ( oled.nextPage());

      printString(2, "String 4");
    }

    void printString(int n, String s) {
      oled.setPageCurrTileRow((n - 1) * 2); // установка стартовой страницы
      int pageIdx = 0;
      do {
        oled.setCursor(0, OFFSET + (n - 1) * 16 + 16);
        oled.print(s);
        pageIdx++;
      } while ( oled.nextPage() && pageIdx < 2); // отрисовка двух страниц
    }

    void loop() {}
     
    U8G2_test.png
     
    Последнее редактирование: 7 июн 2023
    BOOM, r0c и Feofan нравится это.
  3. r0c

    r0c Гик

    Спасибо, добрый человек!
     
  4. r0c

    r0c Гик

    Спасибо, протестил в железе, код работает хорошо.
    Но в связи с тем, что дисплей узкий и длинный(64*256 точек), все переменные значения выводятся в одной строке - x,y,w,z.
    Предлагаемый код очищает указанную строку целиком, даже если указать положение курсора для вывода переменной Z. Задумка была- периодически менять на дисплее значения только одной из переменнрй в строке, которая меняется пару раз в секунду, не перерисовывая весь экран (всю строку с переменными) с таким же периодом- пару раз в секунду.
     

    Вложения:

    Последнее редактирование: 10 июн 2023
  5. User248

    User248 Гик

    Я знаю только про возможность смены всей строки в U8G2. В любом случае, это быстрее, чем обновлять весь экран. Попробуйте другой дисплей, где информация обновляется быстрее. Например, ILI9341. В симуляторе Wokwi имеется такой дисплей с примерами работы.

    https://docs.wokwi.com/parts/wokwi-ili9341
     
    Последнее редактирование: 10 июн 2023
  6. parovoZZ

    parovoZZ Гуру

    если вы выводите тупо текст, то к чему графическая библиотека?
    странное предложение... В одном из своих проектов я настолько оптимизировал вывод на обсуждаемый дисплей, что пришлось снизить тактовую частоту процессора до 4 МГц. А у вас 16 МГц и 8 МГц на SPI и вам мало....
     
  7. User248

    User248 Гик

    На этом видео тоже использована библиотека U8G2 с данным дисплеем. Я бы не сказал, что он сильно медленно выводит картинку. Главное не делать очистку экрана перед обновлением информации. Вы же не делаете очистку, @r0c?

     
    Последнее редактирование: 11 июн 2023
  8. r0c

    r0c Гик

    Где можно посмотреть ваш проект?

    Я вывожу линейный прогресс-бар( как на шкале мультиметра, очень наглядно) и 4 переменных. Поэтому и графическая библиотека. Возможно, это лишнее, не знаю.
     
    Последнее редактирование: 11 июн 2023
  9. r0c

    r0c Гик

    Смена одной строки- все же быстрее и удобнее. Остался вопрос- как в такую строку затолкать "живой" индикатор-шкалу, что бы отслеживать уровень с ацп наглядно, пусть даже с небольшой задержкой?
     
  10. User248

    User248 Гик

    Что-нибудь типа такого:
    Код (C++):

    #include <U8g2lib.h>

    // clock, data, reset
    U8G2_SSD1306_128X64_NONAME_1_SW_I2C oled(U8G2_R0, 3, 2, U8X8_PIN_NONE);

    #define OFFSET -3 // смещение экрана по вертикали
    #define FONT_SIZE 16 // размер шрифта
    #define NUM_PAGES 2 // количество страниц на высоту шрифта

    void setup() {
      oled.begin();
      oled.setFont(u8g2_font_t0_16b_tf);

      oled.firstPage();
      do {
        oled.setCursor(0, OFFSET + 16);
        oled.print("String 1");
        oled.setCursor(0, OFFSET + 32);
        oled.print("String 2");
        oled.setCursor(0, OFFSET + 48);
        oled.print("String 3");
        oled.setCursor(0, OFFSET + 64);
        oled.print("String 4");
      } while ( oled.nextPage());

      printString(2, "String 5");
      drawBoxString(3, 100);
    }

    void printString(int n, String s) {
      oled.firstPage(); // защита от артефактов между строк
      oled.setPageCurrTileRow((n - 1) * NUM_PAGES); // установка стартовой страницы
      int pageIdx = 0;
      do {
        oled.setCursor(0, OFFSET + (n - 1) * FONT_SIZE + FONT_SIZE);
        oled.print(s);
        pageIdx++;
      } while ( oled.nextPage() && pageIdx < NUM_PAGES); // отрисовка страниц в количестве NUM_PAGES
    }

    void drawBoxString(int n, int w) {
      oled.firstPage(); // защита от артефактов между строк
      oled.setPageCurrTileRow((n - 1) * NUM_PAGES); // установка стартовой страницы
      int pageIdx = 0;
      do {
        oled.drawBox(0, (n - 1) * FONT_SIZE + 2, w, FONT_SIZE - 2);
        pageIdx++;
      } while ( oled.nextPage() && pageIdx < NUM_PAGES); // отрисовка страниц в количестве NUM_PAGES
    }

    void loop() {}
     
    u8g2_test_2.png
     
    r0c нравится это.
  11. User248

    User248 Гик

    Кстати, в программе обнаружились артефакты. Вылазит что-то лишнее между строк. Устраняется добавлением oled.firstPage() перед oled.setPageCurrTileRow().
     
  12. parovoZZ

    parovoZZ Гуру

    в принципе, могу поделиться, но там никаких библиотек нет. Одно сплошное задротство.

    А, ну и кристалл там ковбойский.
     
  13. BOOM

    BOOM Нерд

    Я прошу прощения, что в чужую тему пишу...
    А есть ли какая-то возможность подбора шрифта U8G2? А то сейчас я просто прошиваю мк с новым шрифтом и смотрю его на экране. Утомительно и, думается, можно как-то по проще это всё сделать?
     
  14. r0c

    r0c Гик

    я тут тоже озадачился вопросом шрифтов.
    строка oled.setFont(u8g2_font_t0_16b_tf); подключает шрифт из библиотеки.
    В одном шрифтов я нашел красивые буквы, но подключение такого шрифта просто раздувает размер скетча до критических значений.
    А как быть , если из всего этого набора мне нужно только пару букв? Можно же как то вытащить код двух этих символов ?
    Приложу образец для понимания.
    Код (C++):
    const uint8_t u8g2_font_nokiafc22_tf[1558] U8G2_FONT_SECTION("u8g2_font_nokiafc22_tf") =
      "\242\0\2\3\4\4\1\4\5\10\10\0\377\7\377\7\377\1\60\2[\5\371 \5\0q\2!\7rq"
      "r\214\2\42\7#\233\22I\1#\13u\321\226:\246\324\61\245\0$\14\205\317\226\264\42\222\212\314("
      "\2%\17v\361\42Fj(\206d(\206T\241\0&\14v\361\66J\342HM\325*\0'\5!["
      "\42(\11\203\217\32E:\343\0)\12\203\217\22\207\222V\22\0*\13u\321\232\212\254\311J\206\0+"
      "\13U\323\32Ca\31C!\0,\6\62oF\1-\5\24\267B.\5\42qB/\12s\221\232\222"
      "\42)\14\1\60\12u\321\66I\274\244\11\0\61\7s\221V\351\1\62\13u\321BC\262\64\311r\1"
      "\63\13u\321BC\262\64C\262\5\64\11u\321.N\321x+\65\13u\321B\305\20\15\311\262\5\66"
      "\13u\321\66\311\224\304\222&\0\67\12u\321R\213\262(+\1\70\14u\321\66I\224\64I\224\64\1"
      "\71\13u\321\66I,\211\226&\0:\6RqB\22;\7boBS\0<\11t\261\36Jju"
      "\0=\7\64\263BC\4>\11t\261\22k)c\0\77\13u\321BC\242ZF\212\0@\13v\357"
      "F\211\307t\320 \5A\12u\321\66I\254C\242\4B\12u\321BI\226\304\262\0C\10u\321f"
      "\353\206\10D\11u\321BI\274,\0E\11u\321rS\262\272\0F\11u\321rS\262\66\0G\11"
      "u\321\66\311*\226DH\11u\321\42Q\207\304%I\6rq\362\0J\7t\261\252g\5K\14v"
      "\361\42R\22\71\223\222R\0L\7t\261\42\352IM\14w\21\23\203suT\21M\13N\13v\361"
      "\22\223\325\61\225t\0O\12v\361F\211<%\12\0P\12u\321BI,K\226\1Q\12\206\357F"
      "\211\274&\32\24R\12u\321BI,K\212\24S\11t\261V\312\312\12\0T\16v\361b\312\220\14"
      "\311\220\14\311\220\10U\11u\321\42\361%M\0V\14v\361\42\62%\222\226!\21\0W\14w\21#"
      "\263\242C*KI\2X\13v\361\42\222\22-S\42)Y\16v\361\42\222\22-C\62$C\42\0"
      "Z\11u\321R\213\323R.[\7\203\217R\351\65\134\11s\221\22\206b(&]\7\203\217\62\351U"
      "^\7\63\231\26Q\1_\5\26\321b`\6\42{\22\6a\11U\321\66C\222%\21b\12u\321\42"
      "\313\224\304\262\0c\7T\261V\252\7d\11u\321\256\262X\22\1e\11U\321\66I\207\14\21f\10"
      "s\221FUZ\0g\12e\317fQ\22-M\0h\11u\321\42\313\224\304%i\7rq\42\36\3"
      "j\11\203\217&C\272(\0k\11u\321\42\253\254\221Rl\6rq\362\0m\13X\61s\251(\211"
      "\222(\5n\10U\321BI\134\2o\11U\321\66I,i\2p\12e\317BI\224%\313\0q\11"
      "e\317fQ\22\255\0r\10T\261\42\235J\0s\10T\261V\222\25\0t\11s\221\42I\225R\0"
      "u\10U\321\42qI\4v\12U\321\42Q\322\70\207\0w\14W\21#S\21\25I\245$\1x\12"
      "U\321\42Q\322$Q\2y\12e\317\42\261$Z\232\0z\7U\321Rj\27{\7\203\217R\351\65"
      "|\6\202o\362\20}\7\203\217\62\351U~\6%\333\246\5\240\5\0q\2\241\7rq\42\36\3\243"
      "\11u\321:\311JR,\244\13e\321\22G\223DIS\34\245\14v\361\42J\224)\232\62$\2\246"
      "\6\202o\362\20\247\13\204\257\246\242\42*\242T\0\272\7S\225\226\33\32\277\12u\321*#eQ\15"
      "\21\300\13u\321\26\203\361$\35\22%\301\12u\321\236\236\244C\242\4\302\12u\321\32G\321C\242\4"
      "\303\12u\321\246\71I\207D\11\304\13u\321\226FM\322!Q\2\305\13u\321\32G\341$\35\22%"
      "\306\14w\21[\221\222h)%Q\42\307\12\205\317f\353\206\310\20\0\310\12u\321\26\203\341M\311\5"
      "\311\11u\321\236\274)\271\0\312\12u\321\32G\321M\311\5\313\11u\321\226\206oJ.\314\7rq"
      "\22\36\4\315\7rq&\35\3\316\10s\221\226\232t\1\317\10s\221\22\305\220\36\321\12u\321\246\25"
      "R\207D\6\322\14v\361\32\303\61%\62%\12\0\323\14v\361\36C\61D\211L\211\2\324\14v\361"
      "*\207\321\21\62%\12\0\325\14v\361*\245DJdJ\24\0\326\14v\361\26\306HJdJ\24\0"
      "\330\12v\361vRGE^\0\331\13u\321\26\203\241\304%M\0\332\12u\321\236\224\270\244\11\0\333"
      "\13u\321\32G\221\304%M\0\334\12u\321\226\206%.i\2\335\16v\361\16\305P\250\242eH\206"
      "D\0\337\13\205\317\66I\226\304\25\311\0\340\13u\321\32\203\341\14I\226D\341\12u\321\236\236!\311"
      "\222\10\342\13u\321\32GQ-Y\22\1\343\12u\321\246\71C\222%\21\344\13u\321\226F\315\220d"
      "I\4\345\13u\321\32G!-Y\22\1\346\13W\21WCRtD\262\1\347\11d\257V\252\307\10"
      "\0\350\13u\321\26\203\361$\35\62D\351\12u\321\236\236\244C\206\10\352\12u\321\32G\321C\206\10"
      "\353\13u\321\226FM\322!C\4\354\7rq\22\36\4\355\7rq&\35\3\356\10s\221\226\232t"
      "\1\357\10s\221\22\305\220\36\361\11u\321\246EI\134\2\362\14u\321\26\203\361$\261\244\11\0\363\12"
      "u\321\236\236$\226\64\1\364\13u\321\32G\321\305\222&\0\365\12u\321\246\71I,i\2\366\13u"
      "\321\226FM\22K\232\0\370\10U\321f\35\222\5\371\12u\321\26\203\241\304%\21\372\11u\321\236\224"
      "\270$\2\373\12u\321\32G\221\304%\21\374\12u\321\226\206%.\211\0\375\13\205\317\236\224X\22-"
      "M\0\377\14\205\317\226\206%\226DK\23\0\0\0\0\4\377\377\0";
    /*
     
  15. parovoZZ

    parovoZZ Гуру

    можно. Ничего сложного нет. Работу со шрифтами где-то уже показывал на примере SSD1306.
    Но как это сделать в обсуждаемой библиотеке - понятия не имею.
     
  16. User248

    User248 Гик

    Этот шрифт занимает 7% памяти ардуины нано 328. Не так уж и много.
     
  17. BOOM

    BOOM Нерд

    Дополню: НАГЛЯДНАЯ возможность :)
    То есть чтобы просто пролистать и выбрать понравившийся?
     
  18. User248

    User248 Гик

    Такое можно сделать. Собрать все шрифты, переключать их кнопками ввер/вниз и смотреть на экране. Только ардуина нужна с памятью побольше.
     
  19. BOOM

    BOOM Нерд

    Эх, жаль.... Я думал может сайт какой есть или тп.... :( Пичалька.
     
  20. User248

    User248 Гик

    Последнее редактирование: 16 июн 2023