Преамбула
Как‑то на просторах интернета мне попалась интересная вещь, а именно — микроконтроллер ESP-32. Ранее я о нем слышал и даже хотел собрать себе простенькую «мыльницу». До этого тыкал ардуино (вспомнил о нем потому, что принцип программирования у них схож). В то время меня это не сильно зацепило, поэтому я бы и в этот раз прошел мимо, если бы не одно but... (Решил добавить немного междунородности в пост ?).
На данный момент я изучаю JS и было дикое желание практиковаться. Писать код в виртуальной среде круто, но и с железками работать мне нравится. Ехх..вот бы можно было писать софт для микроконтроллера на JS...
Погодите...
Дак такое ведь уже есть! Уже давно все придумано, стоило только ввести правильный вопрос в гугл (Яндекс sore)
В общем — это интерпретатор Espruino https://www.espruino.com/
Амбула.

Поехал — купил.
Подключил — прошил.
Короче, слово за слово, Hello об World, начал думать, что именно за сущность я хочу получить.
Решил начать с простого, с задержкой выводить на дисплей приятные(мотивационные) пожелания на день. (Массив фраз, который просто отображается в рандомном порядке)
Проблема №1
Не получилось найти автоматически библиотеку для подключения моего дисплея, но есть две новости:
Хорошая — мы с нее ведро раков сняли (чуть анекдотов вам ?)
после танцев с бубном и ручным подключением библиотеки запустить дисплей получалось.
Плохая — текст разрезан по горизонтали и перепутан верхняя и нижняя части.
Вот так вот было и у меня

Там на видео понятна проблема:
По итогу все решилось перепрошивкой с оф сайта. прям там я просто нажал 3 кнопки и все само перепрошилось. https://www.espruino.com/Espressif+Flash
Проблема №2
Текст начал выводится, ура! Но тут опять 2 стула (как же удивительно...).
Выводится только Английский. Мне то нужен Русский (Русские есть ?)
Пробовал загружать русский шрифт в сам контроллер и использовать его - не работает. https://www.espruino.com/Fonts
Пробовал загружать сторонние библиотеки, например (компактная библиотека для OLED дисплея 128х64 с кириллицей UTF-8) https://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8
Вся загвоздка в том, что Espruino не поддерживает кириллические символы в юникоде (например, «А», «Б»), поскольку Espruino работает с 8-битными строками и использует кодировку, совместимую только с латиницей и символами в пределах диапазона от 0 до 255.
Когда ты передаешь кириллические символы в функцию
drawText
, они не соответствуют никакому из символов в наборе Espruino (который поддерживает только ASCII или ISO8859-1 символы), и поэтому проверка в функции не срабатывает. В результате, функция не может найти нужные битмапы для кириллических символов, и текст не выводится.
Пришлось облазить очень много сайтов, форумов, перешерстить весь ютюб - безрезультатно.
А как же ИИ ?
Пробовал и его, но чат gpt сразу сказал: «Старина...иди нафиг».
Но все таки, стоит отдать должное, он предложил вариант из которого в будущем и появится моя библиотека, а именно он предложил создать буквы как изображения, а потом склеить их в слова, а слова в предложения и тд. Эта информация есть и на офсайте
https://www.espruino.com/Image+Converter
Выглядело это вот так (на примере буквы Б):
I2C1.setup({ scl: D22, sda: D21, bitrate: 400000 });
var font = {
width: 12,
height: 16,
characters: "Б",
data: String.fromCharCode(
0b111111111111, // ████████████
0b100000000000, // █
0b100000000000, // █
0b100000000000, // █
0b100000000000, // █
0b100000000000, // █
0b100000000000, // █
0b111111111110, // ███████████
0b100000000010, // █ █
0b100000000010, // █ █
0b100000000010, // █ █
0b100000000010, // █ █
0b100000000010, // █ █
0b100000000010, // █ █
0b111111111110, // ███████████
0b000000000000 //
)
};
function start() {
g.clear();
g.setFontCustom(font.data, font.characters.charCodeAt(0), font.width, font.height);
g.drawString("Б", 10, 10);
g.flip();
}
let g = require("SH1106").connect(I2C1, start, {
height: 64,
width: 128,
address: 0x3C
});
Но и тут по началу буква просто выводилась лежащей на боку. Эхх, если честно, уже не помню как именно я это пофиксил, но букву я перевернул и буква вывелась на дисплей - это была победа! Хоть и маленькая, но Victori.
Суть
Вы могли начать читать этот текст отсюда, так как именно тут я понял что можно отдельно задать каждой букве ее закрашенные пиксели и поместить все это в массив или объект, который потом вывести в отдельную библиотеку.
Грубо говоря мне придется написать библиотеку кириллицы. Если ее нет в интернете - сделай сам!
На следующий день библиотека была написана, но шрифт был мелковат (5 на 5), увеличил его до 7 на 7.
Как же она работает?
Мы пишем нашу фразу на латинице, по специальному словарю.
Изначально некоторые буквы ( Ш-Я-Ю...) писались с помощью 2-ух английских букв (Sh, Ya..), это усложняло и местами ломало работу скрипта и программы.

Поэтому было решено переписать словарь, чтобы каждой Русской букве соответствовала одна Английская буква\символ.
Вот что получилось:
{
"A": "А", "B": "Б", "V": "В", "G": "Г", "D": "Д", "E": "Е", "E": "Ё",
"J": "Ж", "Z": "З", "I": "И", "Y": "Й", "K": "К", "L": "Л", "M": "М",
"N": "Н", "O": "О", "P": "П", "R": "Р", "S": "С", "T": "Т", "U": "У",
"F": "Ф", "H": "Х", "C": "Ц", "^": "Ч", "W": "Ш", "%": "Щ",
"&": "Ы", "'": "Ь", "#": "Э", "Q": "Ю", "@": "Я"
}
Далее, я сделал JS файл который меняет символы в словах согласно библиотеке выше. Теперь, мы можем запросить 100 фраз у чата gpt на русском, а после загрузить их в наш файл, чтобы формировать наш итоговый массив фраз написаный трнаслитом.

Что мы получили по итогу ?


Я потратил на это около 2-3 вечеров и в процессе поиска информации и написания кода, мое настроение менялось с аццко-горящего, на дофомино-эндорфиновое.
У меня все получилось.
Да, пришлось написать все самому и конечно это не эталонное решение (Скорее этиловое?). Куда важнее сам путь и опыт который я получил, ведь буквально через неделю, я отложил этот проект до лучших времен.
P.S.
Рад поделиться своим творением, надеюсь хоть кому-нибудь я помогу!
Спасибо, что дочитали, долго не мог сесть за написание статьи, но все же, пересилив себя и открыв заметки — она была написана за час. Невозможного не существует, все ограничения только у тебя в голове, видишь цель — не видь препятствий... и.т.д (Это я уже чуть заигрался).

Дос!
Ключевые слова для поиска: библиотека для отображения Русских букв или библиотека русского шрифта/кириллицы для Эспруино Espruino ESP-32.
Саму библиотеку, скрипт для перевода и драйвер можно скачать здесь.
Комментарии (11)
Serj_78
18.08.2025 13:50Как раз и хотел написать что есть спец софт, который генерит для этого дисплея(ssd1306), ищите по этому слову, именно такую процедуру кода из шрифта заданного размера и типа. А также и картинки :) занимался этим лет 8 назад.
vindy
18.08.2025 13:50Делал русские шрифты для Спектрума задолго до всего этого вашего. Тогда приходилось стараться по максимуму переиспользовать английские символы схожего начертания и жертвовать несколькими редко используемыми символами типа @, заменяя их на кириллические, аналога которых в латинском нет. 256 знакомест в результате хватало на все, и на русские сообщения, и на английские.
tormozedison
18.08.2025 13:50POKE 23606...
POKE 23607...
Два числа, которые теперь невозможно забыть.
fp777
18.08.2025 13:50256 кодов хватало на всё без танцев с бубном (КОИ8, CP866 и т.п.)
А проблема с кириллицей у спектрума была в том, что стандартными средствами выводилось только первая половина ASCII. Поэтому некоторые меняли строчную латиницу на прописную кириллицу, кто-то использовал UDG, но UDG не хватало и начинались танцы...
dizatorr
18.08.2025 13:50Вся загвоздка в том, что Espruino не поддерживает кириллические символы в юникоде (например, «А», «Б»), поскольку Espruino работает с 8-битными строками и использует кодировку, совместимую только с латиницей и символами в пределах диапазона от 0 до 255.
Простите, я что-то не понял. Этот латинский шрифт жестко забит в прошивку дисплея или как? Может я чего-то не понимаю, но раньше обходились этими 255 знаками и есть масса кодировок национальных типа KOI8-R или Win1251.
alexs963
18.08.2025 13:50Автор просто не в курсе про однобайтные кодировки.
tormozedison
18.08.2025 13:50Кстати, да. Когда преобладали 7- и 8-битные кодировки, далеко не все программисты знали, что когда-то широко применялись 5-битные. Ну а теперь и о 8-битных знать могут не все.
HEXFFFFFFFF
До чего все таки упал профссианализм прогеров последнее время! Описывать эту фигню как какое то достижение.. подобные библиотеки я писал еще много лет назад, в свободном доступе и правда нормальных библиотек нет, но подход тут несколько другой. Все библитеки которые есть в открытом доступе кривые ,они жрут много памяти, ради одного пикселя перересовывают весь экран, перерисовывают чаще чем надо итд. Есть lvgl но он для сложной графики и ичасто избыточен. И так - общий принцип всех этих дисплеев- они умеет перерисовыаать произвольный квадрат. Поэтому библиотека должна быть устроена так- есть массив номеров символов и их атрибутов( цвет, координаты, яркость итд) и шрифт который представляет из себя битовый массив. Например если знак 8×8 пикселей то это 64 бита. Есть специальный софт для генирации таких массивов из любого компьютерного шрифта. Пользователь может произвольно печатать любые символы хоть тысячу раз в сек, это приводит только к изменению пары байт в массиве. А 30 раз в секунду поток пробегает массив, и перерисовывает на экране только те квадратики которые изменились. Низкоуровневое апи у всех этих дисплеев не сложное, обычно есть несколько команд установки квадрата , управления яркостью, ориентацией итд. Некоторые чипы умеют аппаратно скролить изображение итд. Но для вывода текста все это не нужно.
Rusrst
Вы слишком критичны, видно же, что человек делает первые шаги. Для простого пример вполне пойдёт, а захочет, в дальнейшем по вашему комментарию и узнаёт про обновление частей экран. Может ещё и какой алгоритм сравнения в процессе узнаёт. Главное начать :)