Стасик.
Маленький квадратный гаджет на M5Stack: экран, три кнопки и динамик. Размером с печенье — 54 миллиметра в ширину.
Я написал для него свою прошивку: меню-карусель, игры, кубики для настолок, часы и таймер лимитов Claude. То, что сейчас на экране модели, — настоящая прошивка: тот же код на C++, собранный в WebAssembly. Нажмите на кнопки.
Железо.
Внутри — ESP32 на 240 МГц и 520 КБ памяти. Ни видеокарты, ни дополнительной памяти: на целый кадр 320×240 её просто не хватает. Поэтому экран рисуется полосами по 40 строк, и каждая полоса уезжает на дисплей по SPI, пока рисуется следующая.
Скорость.
Первые кубики крутились на 14 кадрах в секунду — заметно дёргались. Я замерил каждую часть кадра и переписал самое дорогое: скругления рисуются построчно, а не толстыми линиями, а полосы уходят на экран через DMA — процессор в это время уже рисует следующую.
- Кадр целиком
78 →20 мс - Кубики
14 →38 к/с - Скруглённые фигуры
50 →6 мс - Пересылка на экран
12,7 →0,6 мс
Плавность.
Стандартные дуги и треугольники библиотеки рисуются «лесенкой». Сглаживание пришлось написать самому: кольца, дуги и скруглённые многоугольники считают покрытие только на краях, поэтому остаются дешёвыми.
Иконки и надписи рисуются один раз в маску, а дальше кадр только накладывает её нужным цветом. Плавная анимация — системный режим до 50 кадров в секунду, и когда батарея садится, Стасик сам его выключает.
Подземелье
Книга-игра
Счётчик здоровья
Кубики
Часы
Таймер Клод
Луна
Настройки