Здравствуйте! Столкнулся с ситуацией, когда на примере использования oled spi дисплея sh1122 разрешением 256*64 точки библиотекой U2g8 lib происходит медленное обновление изображения. Как сделано сейчас(просто для примера)- в цикле на дисплей выводятся рамки, надписи- " напряжение 1=, напряжение 2=, напряжение 3=", тут же цикле опрос трех ацп и тут же вывод значений на дисплей. (Трехканальный вольтметр). Разумнее было бы отправлять на дисплей только обновлённые (изменившиеся)цифровые значения, а фоновые надписи не перерисовать каждый раз, может оформить в виде фоновой картинки. Не могу понять, какой из примеров библиотеки U8g2lib позволяет однократно загрузить статичный фон и обновлять данные только в определённом месте на дисплее? Из всех библиотек для этого дисплея нашлась только U8g2lib. Заранее спасибо, если кто подскажет.
Есть возможность пропускать страницы. В данном примере надпись "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() {}
Спасибо, протестил в железе, код работает хорошо. Но в связи с тем, что дисплей узкий и длинный(64*256 точек), все переменные значения выводятся в одной строке - x,y,w,z. Предлагаемый код очищает указанную строку целиком, даже если указать положение курсора для вывода переменной Z. Задумка была- периодически менять на дисплее значения только одной из переменнрй в строке, которая меняется пару раз в секунду, не перерисовывая весь экран (всю строку с переменными) с таким же периодом- пару раз в секунду.
Я знаю только про возможность смены всей строки в U8G2. В любом случае, это быстрее, чем обновлять весь экран. Попробуйте другой дисплей, где информация обновляется быстрее. Например, ILI9341. В симуляторе Wokwi имеется такой дисплей с примерами работы. https://docs.wokwi.com/parts/wokwi-ili9341
если вы выводите тупо текст, то к чему графическая библиотека? странное предложение... В одном из своих проектов я настолько оптимизировал вывод на обсуждаемый дисплей, что пришлось снизить тактовую частоту процессора до 4 МГц. А у вас 16 МГц и 8 МГц на SPI и вам мало....
На этом видео тоже использована библиотека U8G2 с данным дисплеем. Я бы не сказал, что он сильно медленно выводит картинку. Главное не делать очистку экрана перед обновлением информации. Вы же не делаете очистку, @r0c?
Где можно посмотреть ваш проект? Я вывожу линейный прогресс-бар( как на шкале мультиметра, очень наглядно) и 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 // смещение экрана по вертикали #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() {}
Кстати, в программе обнаружились артефакты. Вылазит что-то лишнее между строк. Устраняется добавлением oled.firstPage() перед oled.setPageCurrTileRow().
в принципе, могу поделиться, но там никаких библиотек нет. Одно сплошное задротство. А, ну и кристалл там ковбойский.
Я прошу прощения, что в чужую тему пишу... А есть ли какая-то возможность подбора шрифта U8G2? А то сейчас я просто прошиваю мк с новым шрифтом и смотрю его на экране. Утомительно и, думается, можно как-то по проще это всё сделать?
я тут тоже озадачился вопросом шрифтов. строка 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"; /*
можно. Ничего сложного нет. Работу со шрифтами где-то уже показывал на примере SSD1306. Но как это сделать в обсуждаемой библиотеке - понятия не имею.
Такое можно сделать. Собрать все шрифты, переключать их кнопками ввер/вниз и смотреть на экране. Только ардуина нужна с памятью побольше.
Так вот есть инфа: https://github.com/olikraus/u8g2/wiki/fntgrpunifont https://github.com/olikraus/u8g2/wiki/fnticons https://github.com/olikraus/u8g2/wiki/fntgrp