Pull to refresh

Comments 24

Нда, полный звиздец. Никогда так не делайте. В данном случае рисование линий и установка/сброс пикселей - лишняя трата ресурсов.

Если уж надо строку напечатать - разбейте ее на буквы-спрайты и лейте их через i2c напрямую в память экрана, или сначала рисуйте в памяти/буфере потом через dma шлите в экран (благо 128*32 много места в озу не занимает).

(теперь я знаю, что такое векторный велосипед из костылей...)

В чипе для этого дисплея есть команда отправки двоичных данных непосредственно с помещением их в видеопамять. Она предназначена как раз для вывода символов и других растров. Вот ее и нужно использовать. А битовые картинки символов ("знакогенератор") нужно просто помещать в отдельную область памяти.

Я бы понял, если бы хотелось получить произвольную масштабируемость, и не нужна была бы скорость отображения...

Вывод символа - если хочется - можно сделать свой, пусть и с поддержкой utf-8.

ESP32 тоже может в Ардуино, кстати.

Своеобразный подход.

Господа, в самом начале я написал - что просто воспользовался имеющейся библиотекой-основой и, опираясь на её возможности - создал своё решение. Но, разумеется всегда можно пойти и "глубжее" и сделать правильней :-)

В любом случае, выложил свое полностью готовое (и работающее!) решение. Буду рад видеть ваш более продуманный и эффективный вариант ;-)

крутая штука, спасибо!

Вам не кажется что это чуток другое? А точней вообще другое. Еще точней совсем другая весовая категория никак не сравнимая с oled i2c.

Это смотря какой размер экрана и что надо отображать на нем. Для 128*32 может и жирновато будет, но чую что будет меньше жрать памяти и шустрее работать чем реализованное в статье.

В этой библиотеке 16-битка минимумом и 180 килобайт флешки и весьма-весьма неплохой жор оперативки (:
Эта либа более для больших экранов, от 512.

...180 килобайт флешки и весьма-весьма неплохой жор оперативки (:

Для esp32 с ее мегабайтными флэшками это фигня.

Эта либа более для больших экранов, от 512.

Соглашусь что для 128*16 она жирновата. Про 512 - несогласен, как пример - T-Wath (экран 240*240): https://github.com/Xinyuan-LilyGO/TTGO_TWatch_Library

Пожалуй соглашусь про 240, но для цветных.

Я не поленился, скачал библиотеку-основу "OLED_I2C".
В ней есть поддержка работы с текстом, растровые шрифты лежат в файле "DefaultFonts.c".
Каждая буква кодируется 5 байтами (по байту на вертикальную линию символа).
Нужно было только добавить туда русские шрифты.
Пример массива: http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/dorabotka-biblioteki-russkogo-shrifta
Возможно, нужно немного подправить функцию "OLED::_print_char".

Есть и другие библиотеки уже с поддержкой русского: https://github.com/GyverLibs/GyverOLED - там тоже можно таблицу символов посмотреть: https://github.com/GyverLibs/GyverOLED/blob/main/src/charMap.h

void LCD_Chr(u8 ch, u8 invers)
{
   u8 i;   
   lcd_buff_idx=y_cur * 128 + x_cur * 6;    
   if ((ch >= 0x20)&&(ch <= 0x7F)) ch -= 32;
   else if (ch>=0xC0) ch-=96;
   else ch = 95;   
   for (i=0;i<5;i++)
   {
     if(invers)
      lcd_buff[lcd_buff_idx++] = ~(font[ch][i]);
     else
       lcd_buff[lcd_buff_idx++] = font[ch][i];
   }
   ...
}
const  u8 font [][5] =    //
{
{ 0x00, 0x00, 0x00, 0x00, 0x00 },   //   0x20  32
...
{ 0x06, 0x09, 0x09, 0x06, 0x00 },   // ~ 0x7E 126
{ 0x1C, 0x3E, 0x7C, 0x3E, 0x1C },   //   0x7F 127
{ 0x7C, 0x12, 0x11, 0x12, 0x7C },   // А 0xC0 192
{ 0x7F, 0x49, 0x49, 0x49, 0x31 },   // Б 0xC1 193
...
{ 0x7C, 0x10, 0x38, 0x44, 0x38 },   // ю 0xFE 254
{ 0x48, 0x54, 0x34, 0x14, 0x7C }    // я 0xFF 255
};

Надеюсь, идея понятна.

if (temp==176) //буква а
{
lineDrawer (2,1,4,1,x,y, object);
lineDrawer (1,2,1,7,x,y, object);
lineDrawer (5,2,5,7,x,y, object);
lineDrawer (2,4,4,4,x,y, object);

Если вы знаете как все буковки рисуются, вы можете нарисовать их на этапе компиляции в буфер ПЗУ. А потом просто из этого буфера переправить данные в буфер отрисовки. Тогда, скорость отрисовки резко увеличится, поскольку львиная часть работы будет сделана на этапе компиляции и вам не нужен будет внешний генератор.

Как хорошо, что написана такая статья. Вообще, хабр сова торт, в комментариях можно узнать много хороших решений.

В своё время тоже писал большую библиотеку работы с дисплеем.

Почему буквы на фотографиях не соответствуют буквам с картинок?

 одна беда — известные библиотеки для него поддерживают только латинский шрифт. Ситуация усугубляется тем, что я использую его для подключения к esp32, а не Arduino. Поэтому arduino-библиотеки можно сразу отбросить. Что с этим делать и как дальше жить, об этом мы и поговорим в этой статье.

Прежде чем самоотверженно бросаться на создание велосипеда, лучше немного погуглить )))

К Adafruit GFX и U8Glib нормально подключаются русские шрифты

Обе эти библиотеки поддерживают кучу архитектур, в том числе и ESP32

Возможно, я ошибаюсь, но, по-моему, в Esphome для oled displays на базе контроллера 1306 (и не только) реализована возможность трансформации и загрузки произвольного TTF фонта в память дисплея. на таком малыше я не экспериментировал, но на большем размере все работало.

Я конечно вообще не разу не кунг-фу программист микроконтроллеров, но на гитхабе тысячи библиотек для работы с этими дисплеями на любой вкус. Все они так или иначе обслуживают рисование линий кружочков и прочих примитивов, но шрифты - это всегда просто static массив пикселей, который грузится в буфер и пачкой отправляется в экран (i2c, spi не важно). Архитектура микроконтроллера тоже не существенна - заменяется 2 функции - отправка байта и отправка массива в соответствии с выбранным МК. Рисование букв линиями - свежо, новаторски. Но в основном затратно)

  1. Чтобы не мучаться в Corel, для создания таких шрифтов есть программа LCD Vision, она кстати умеет импортировать системные шрифты, и генерировать набор символов в виде массива байт.

  2. Символы лучше хранить в виде массива байт, в вашем случае это выйдет (5*7)/8 = 5 байт на символ. При отрисовке просто передаете эти данные в видеопамять дисплея, предварительно выбрав область видеопамяти.

  3. UTF-8 не лучшее решение, лучше взять кодировку ANSI.

За марку дисплея благодарю, за реализацию - присоединяюсь к критике по поводу решения отрисовывать на растровом дисплее русский текст с матрицей ?х8 (как я понимаю, у Вас шрифт с разной шириной в пикселях).

Ваше решение имеет смысл при использовании масштабируемых шрифтов (привет тем, кто помнит BGI шрифты) или при отрисовке шрифтов большого размера.

В случае использования растрового шрифта Вам бы хватило максимум 7 байт на букву (буква Щ кодируется матрицей 6 на 8 пикселей, плюс 1 байт на ширину).

Желаю Вам творческих успехов и становления как высококлассного программиста, в том числе встраиваемых решений.

Международная конференция хирургов. Доклад русских:
- Мы научились делать операцию по удалению гланд. В зале свист, возмущение,
дескать что там гланды, все умеем.
- Через анальный проход...
- О-оооо, зачем через анус?
- А у нас все через жопу делается.

Модель дисплея секретная что ли? Нигде в тексте не вижу. Про готовые библиотеки на гитхабе, пересылку данных из виртуального буфера и самые распространённые названия тут уже отметились, очевидно. Но, надо признать, ситуация со шрифтами не такая однозначная.

Конкретно под этот дисплей, конечно, можно сделать вообще шик-блеск по эффективности, если принять высоту шрифта кратной 8 и у-координата левого верхнего угла символа всегда кратна 8. В этом случае можно закодировать бинарные данные символа вертикально и напрямую слать в контроллер.

На счёт шрифтов я таки озаботился конвертором из TTF. Отличные матричные шрифты получаются из terminus ttf чётных размеров. Пример: https://github.com/jef-sure/ili9341_dgx/blob/main/components/dgx/src/fonts/TerminusTTFMedium12.c

В этом же гитхаб-репозитории моя экспериментальная библиотека с поддержкой разных типов дисплеев и шрифтов, а так же проект с красивым морфингом чисел на часах.

Sign up to leave a comment.