• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

esp8266 + u8glib

N5xx

New member
Всем привет. Кто нибудь подключал эту библиотеку для работы в среде ардуино (я шью esp8266 через ардуину, работаю с https://github.com/squix78/esp8266-oled-ssd1306), но там мало шрифтов. Хочется подключить u8glib, А она там не компилируется) Там возможности по шрифтам получше. Ну или как вариант есть ли русские шрифты под https://github.com/squix78/esp8266-oled-ssd1306 ?
 

AndrF

Active member
Как либо решили вопрос?

Собственно вопрос все тот же - русские фонты!

Формат фонтов данной библиотеки мне непонятнен, а то я бы попробовал конвертнуть имеющийся у меня фонт...
 

AndrF

Active member

Вложения

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

AndrF

Active member
Более завершенный вариант шрифтов. Для корректной работы с ними пришлось немного модифицировать один из файлов библиотеки, зато теперь вывод русских символов делается очень просто:

Код:
  display.setFont(Font5x7);
 
  display.drawString(0, 0, "АБВГДЕЁЖЗИЙКЛМНОПР");
  display.drawString(0, 16, "СТУФХЦЧШЩЪЫЬЭЮЯ111");
  display.drawString(0, 32, "абвгдеёжзийклмнопр");
  display.drawString(0, 48, "стуфхцчшщъыьэюя");

  delay(1000);

  display.clear();
  // Print to the screen
 
  display.setLogBuffer(5, 30);
  display.println("АБВГДЕЁЖЗИЙКЛМНОПР");
  display.println("СТУФХЦЧШЩЪЫЬЭЮЯ111");
  display.println("абвгдеёжзийклмнопр");
  display.println("стуфхцчшщъыьэюя");
  // Draw it to the internal screen buffer
  display.drawLogBuffer(0, 0);
  // Display it on the screen
  display.display();
А не как обычно везде где я находил:
Код:
display.println(utf8rus("Тест"));
То есть вызов utf8rus() стал ненужным.

К сожалению, русский растровый фонт у меня был только один - 5x7 - его конвертнул и вставил. Нужно бы еще два-три, высотой 10, 12, 14. Фонты большего размера я уже, при необходимости, могу получить с помощью генераторов шрифтов, а вот с фонтами вышеуказанного размера они плоховато справляются... У кого есть указанные растровые фонты и кому не жалко - выложите, а я попробую разобраться и конвертнуть, если пойму их формат. Потом сам выложу.
 

Вложения

gerkimuyda

New member
Как создать свой фонт для библиотеки esp8266-oled-ssd1306

Когда заинтересовался написанием своего шрифта для экрана, столкнулся с небольшой проблемой, что формат шрифта у библиотеки esp8266-oled-ssd1306 немного другой, чем описывается в статье
Свой текст для OLED 128x64 и мне пришлось разобраться в различиях.

И так. Из практики мы знаем, что перед выводом текста в скетче надо вызвать функцию [inline]display.setFont();[/inline]
которой в параметре передается имя шрифта. Сами шрифты описываются в файле OLEDDisplayFonts.h

Давайте теперь создадим свой шрифт с одним символом - цифрой ноль. Прописываем в файл следующую конструкцию:
Код:
const char CrystalNumbers_64[] PROGMEM = {
  0x1A, // Width: 26
  0x40, // Height: 64
  0x30, // First Char: 48
  0x01, // Numbers of Chars: 1
Где первый параметр - это ширина символа в пикселях
второй параметр - высота в пикселях
третий параметр - код ASCII первого символа в шрифте (в нашем случае - нуля)
четвертый - количество символов в описываемом шрифте (у нас только один символ)

Это описание шрифта используется и в другой библиотеке (например, от Adafruit), но в отличии от нее - далее идут не изображения символов, а таблица параметров по каждому символу
Код:
 //Address  length width
  0x00, 0x00, 0xD0, 0x1E, //0
Всего 4 байта на каждый символ. Длина данной таблицы = количеству символов из шапки * 4 байт.
Первых два байта - это адрес смещения начала символа в последующих байтах изображений.
Третий байт - длина (размер в байтах) изображения символа.
Четвертый - ширина знакоместа в пикселях (не изображения символа, а места для него до начала
следующего символа (с учетом интервала) - т.е. это значение должно быть немного больше ширины самого символа)

Итак, мы описали 1 символ 26*64 начиная с '0' (ord 48).
Также написали адрес его изображения 0x00:0x00, его длину 13 байт (0xD0) и его ширину 30 пикселей (0x1E) (26 ширина изображения и 4 пикселя отступа).

Теперь идет рисунок самого символа. Он описывается по вертикальным столбцам с правого верхнего угла.
Но пиксели собираются по 8 штук в один байт. Т.е. в первый байт попадают пиксели с координатами
по X=1, Y=8..Y=1, во второй X=1, Y=16..Y=9 и так до крайнего X=1, Y=64..Y=56, после которого
переходим к следующей колонке X=1, Y=9..Y=16 и т.д.
Чтобы удобнее было считать, давайте повернем изображение символа на 90 градусов (тут только верхняя половина):

IMG_2017-12-08_153908.jpg

Теперь описываем первую колонку (X=1):
Код:
  0xE0,0xFF,0xFF,0x1F,0xFC,0xFF,0xFF,0x0F,
Также описываем вторую и последующие колонки:
Код:
  0xF0,0xFF,0xFF,0x3F,0xFE,0xFF,0xFF,0x1F,
  0xF0,0xFF,0xFF,0x3F,0xFE,0xFF,0xFF,0x1F,
  0xE6,0xFF,0xFF,0x1F,0xFC,0xFF,0xFF,0x0F,
  0xCF,0xFF,0xFF,0x0F,0xF8,0xFF,0xFF,0x67,
  0x9F,0xFF,0xFF,0x07,0xF0,0xFF,0xFF,0xF3,
  0x3F,0xFF,0xFF,0x03,0xE0,0xFF,0xFF,0xF9,

  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,
  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
  0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
  0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,

  0x9F,0xFF,0xFF,0x03,0xE0,0xFF,0xFF,0xFC,
  0xCF,0xFF,0xFF,0x07,0xF0,0xFF,0xFF,0xF9,
  0xE6,0xFF,0xFF,0x0F,0xF8,0xFF,0xFF,0xF3,
  0xF0,0xFF,0xFF,0x1F,0xFC,0xFF,0xFF,0x67,
  0xF8,0xFF,0xFF,0x3F,0xFE,0xFF,0xFF,0x0F,
  0xF8,0xFF,0xFF,0x3F,0xFE,0xFF,0xFF,0x0F,
  0xF0,0xFF,0xFF,0x1F,0xFC,0xFF,0xFF,0x07,
Теперь давайте сохраним и проверим:

Код:
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
SSD1306 display(0x3c, D3, D4);

void setup() {
  display.init();
  display.flipScreenVertically();
  display.setContrast(255);
  display.clear();
  display.setFont(CrystalNumbers_64);
  display.drawString(0, 0, "0" );
  display.display();
}
void loop() { }
Как видите, все у нас получилось. Подобным образом рисуются остальные символы.
В прикрепленном файле я подготовил шрифт на все цифры, знаки плюс и минус, точку и двоеточие.
А также пример с выводом таймера на экран. Скетч написан так, что можно отключать и подключать экран в любое время "на ходу" (программа его переинициализирует).
IMG_2017-12-13_203221.jpg
(ps: на фотке вывод температуры. Первый символ получен наложением (вывод символа поверх другого).
 

Вложения

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

andrik_zp

Member
у кого есть русский шрифт на на esp8266 с oled ssd1306 поделитесь пожалуйста !
Держи, три шрифта, 14, 16, 24 пикселя в высоту. Только не спрашивай как ими пользоваться, или разберись сам или бросай программирование.
 

Вложения

Vsevolod61

New member
Спасибо в том то и дело что я начинающий , ???
Если еще актуально....
Файлы конвертированы из ttf Windows по алгоритму поста 5 это ветки.
В библиотеке ArduinoIDE ESP8266_and_ESP32_Oled_Driver_for_SSD1306_display необходимо заменить OLEDDisplay.h на файл из вложения.
Изменения в заголовочном файле касаются функции fontTableLookupFunction - она разбирает европейскую страницу UTF8.
В скетче пока использую utf8rus.
Пока так. Дойдут руки - допилю OLEDDisplay.h.
Всем успехов...
 

Вложения

Vsevolod61

New member
Во вложении - допиленная библиотека ESP8266_and_ESP32_Oled_Driver_for_SSD1306_display для работы с русскими шрифтами. Библиотека очень патриотичная - с английской UTF8 не работает!!!
Это - мои личные санкции ГЕЙРОПЕЙЦАМ...
Впрочем нет проблем сделать универсальную. Кто хочет - флаг в руки и барабан на шею :)).
В папке примеров - часть моего проекта RemoteControl, иллюстрирующая применение русских шрифтов. Там-же - шрифты Areal Plant размером 10, 14, 16, 24; Areal Italic размером 10, 16, 24.
Прошу не обращать внимание на сообщение Arduino IDE:
"Arial_10_i.h" содержит неизвестные символы. Если этот код был создан в более старой версии Arduino IDE, попробуйте использовать Инструменты -> Исправить кодировку и перезагрузить, чтобы преобразовать скетч в кодировку UTF-8. В случае неудачи потребуется удалить неизвестные символы вручную, чтобы избавиться от этого предупреждения.

"Arial_14.h" содержит неизвестные символы. Если этот код был создан в более старой версии Arduino IDE, попробуйте использовать Инструменты -> Исправить кодировку и перезагрузить, чтобы преобразовать скетч в кодировку UTF-8. В случае неудачи потребуется удалить неизвестные символы вручную, чтобы избавиться от этого предупреждения.

"Arial_16.h" содержит неизвестные символы. Если этот код был создан в более старой версии Arduino IDE, попробуйте использовать Инструменты -> Исправить кодировку и перезагрузить, чтобы преобразовать скетч в кодировку UTF-8. В случае неудачи потребуется удалить неизвестные символы вручную, чтобы избавиться от этого предупреждения.

"Arial_16_i.h" содержит неизвестные символы. Если этот код был создан в более старой версии Arduino IDE, попробуйте использовать Инструменты -> Исправить кодировку и перезагрузить, чтобы преобразовать скетч в кодировку UTF-8. В случае неудачи потребуется удалить неизвестные символы вручную, чтобы избавиться от этого предупреждения.

"Arial_24.h" содержит неизвестные символы. Если этот код был создан в более старой версии Arduino IDE, попробуйте использовать Инструменты -> Исправить кодировку и перезагрузить, чтобы преобразовать скетч в кодировку UTF-8. В случае неудачи потребуется удалить неизвестные символы вручную, чтобы избавиться от этого предупреждения.

"Arial_24_i.h" содержит неизвестные символы. Если этот код был создан в более старой версии Arduino IDE, попробуйте использовать Инструменты -> Исправить кодировку и перезагрузить, чтобы преобразовать скетч в кодировку UTF-8. В случае неудачи потребуется удалить неизвестные символы вручную, чтобы избавиться от этого предупреждения.

Это - результат работы конвертера шрифтов (см. топик 5 этой ветки - шрифтов можно наделать дофига и больше!!!). Использовать "Инструменты -> Исправить кодировку и перезагрузить" не рекомендую - убъете русский текст в файле RemoteControl.ino. Если сильно достает - удалите кракозябры из файлов Arial_10_i.h, Arial_14.h, Arial_16.h и т.п. по образу и подобию Arial_10.h.

Однако эти предупреждения компилятору совсем не мешают
 

Вложения

7fks

New member
Приветствую.
Файлы конвертированы из ttf Windows по алгоритму поста 5 это ветки
Никак не могу разобраться с программой fontcreator из 5-ого поста.
1. Java 8... установлена
2. Скачал по ссылке:
3. Распаковал архив и запустил gradlew.bat (он там чо-то наколдовал в командной строке и закрылся)
4. Файл fontcreator.bat нигде не появился. После чтения товарища arcao (создатель проги) Added download section · arcao/esp8266-oled-ssd1306-font-creator@129b59b , понял что в папке с прогой должна появиться папка build и в ней install\fontcreator. У меня этого не появилось (пробовал на 2-ух ПК windows 7 и 10).
5. Сам создал путь, скачал архив zip arcao/esp8266-oled-ssd1306-font-creator и распаковал в build/install/fontcreator/
Собственно вопрос, куда в файле fontcreator.bat прописать команду -o Arial_10.h -c cp1251 -s 10 Arial
 

Vsevolod61

New member
Собственно вопрос, куда в файле fontcreator.bat прописать команду -o Arial_10.h -c cp1251 -s 10 Arial
Дня доброго.
В файле fontcreator.bat ничего не прописывайте.
Во вложении - архив с моим каталогом fontcreator.
Там в ...\fontcreator\bin лежит файл fontcreator_1.bat . Откройте - там все понятно.
Т.е. ключи -o Arial_10.h -c cp1251 -s 10 Arial являются параметрами файла fontcreator.bat.
Заголовочные файлы с фонтами получите в том-же каталоге, из которого запускали fontcreator_1.bat
Естественно и fontcreator.bat и fontcreator_1.bat должны находится в одном каталоге.
Успехов.
 

Вложения

7fks

New member
@Vsevolod61, спасибо, всё получилось.
До этого пол дня сидел - не разобрался.
Сейчас немного забуксовал: в образовавшемся файле нового шрифта потребовалось заменить char на uint8_t

2018-12-13 23-38-50.JPG
 

Vsevolod61

New member
Не за что.
А вот, что в описании шрифта char обязательно меняется на uint8_t это я забыл написать. Вам спасибо за дополнение.
Успехов.
 

VLT

New member
Всем доброго вечера/ночера.
Нашел несколько очень мелких шрифтов (TinyText + MiniText + 3Text by RhythmLynx) - но в виде спрайтов. Есть ли человеческий способ сделать из них шрифт для SSD1306. Спасибо.
 

Вложения

aidar_i

New member
Vsevolod61, спасибо, за Ваши наработки! На первом варианте с utf8rus (на второй у Вас большой комментарий, не стал разбираться, я в кодах не программирую) собрал библиотеку для печатания кириллицы.
Собрал все шрифты кириллицы (с обоих вариантов) в одну папку OLEDDisplayFonts_rus (родные выкинул), вставил Ваш измененный https://esp8266.ru/forum/attachments/oleddisplay-h.6780/, еще подправил то, что просил ардуино иде. И все прекрасно работает, с первого раза. Вставил в свой проект ESP8266 RADIO.
Сделал пользовательский блок для программы Работа ESP8266 c дисплеями OLED. -
Выложу для начинающих библиотеку.
Добавил пример SSD1306Cyrillic_text в библиотеку.
 

Вложения

aidar_i

New member
7fks, не смог запустить fontcreator, пытаюсь ,как в сообщениях выше, не получается. Не сможете описать последовательность установки и запуска программы.
 
Сверху Снизу