128 × 64 СВЕТОДИОДА · ESP32-S3 · LUA

Океанариум

Окно в большой океанариум размером с книжную полку. Больше сотни видов морских обитателей живут там своей жизнью: приплывают и уплывают, прячутся, охотятся, спят. Свет в воде меняется вместе с настоящим временем суток.

Океанариум днём: косяки жёлтых рыб, акула в толще воды, риф с кораллами и солнечные лучи

12:00Полдень на панели, в настоящем темпе, 15 кадров в секунду. Ни одна рыба здесь не следует сценарию.

Каждый сам по себе

Это не мультфильм, который крутится по кругу. У каждого жителя своя маленькая программа. Она решает, куда плыть дальше, в какой части аквариума держаться, когда пора уходить. Рифовые рыбы кружат у кораллов, скаты и тунцы идут в открытой воде, крабы и омары бродят по песку.

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

Если в комнате есть человек, радар присутствия это видит. Самые любопытные (групер, рыба-наполеон, рыбы-летучие мыши, черепаха, иглобрюх, осьминог) подплывают к стеклу туда, где вы стоите, и поворачиваются к вам. Резко махнёте рукой — мелкие рыбы спрячутся, иглобрюх раздуется шаром, а садовые угри втянутся в песок.

Сутки в аквариуме

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

День
ДЕНЬСолнечные лучи и блики на песке
Вечер с подсветкой
ВЕЧЕРВключена подсветка аквариума
Ночь: светящиеся медузы и искры планктона
НОЧЬСветятся медузы, искрит планктон

Как рождается рыба

На экране нет ни одной готовой картинки. Всё, от полосатой рыбы-бабочки до китовой акулы, программа рисует сама, по описанию. У каждого вида есть форма тела (их 12: веретено, диск, шар, коробочка, акула…), окраска спины, боков и брюха, узор (их 20 видов: полосы, пятна, маска, сетка, чешуйки с ободком), плавники, хвост и глаз.

  1. Нарисовать позу один раз. Когда рыба впервые оказывается в новом положении (другой размер, поворот, взмах хвоста), программа рисует её точка за точкой, с объёмом: сверху светлее, по краям темнее, с бликом на боку.
  2. Вырезать как штамп. Готовую позу вырезают из экрана и запоминают. Для этого мы написали в прошивке панели два новых умения, px.grab и px.blit.
  3. Ставить 15 раз в секунду. Дальше рыба ставится одним движением, как штампом. Если плывёт в другую сторону — зеркально. Если далеко — меньше, темнее и синее. Тысяча поз вместо тысячи рисований.

Кнопка

Всё управление — одна кнопка: крутилка на панели или OK на пульте.

Одно нажатие. Включить или выключить подсветку аквариума.

Два быстрых. Сутки за пять минут: смотреть, как меняется свет.

Три быстрых. Вернуться к настоящему времени.

В цифрах

Всё измерено на самой панели или в её точной копии на компьютере.

119видов морских обитателей
134 КБпрограмма на Lua, 2 878 строк и 118 функций
8 192светодиода (128 × 64), каждый любого цвета
15 к/скадров в секунду, каждый рисуется за 37–47 мс
≈680 000команд Lua в секунду днём: около 45 000 на кадр
410 нсна одну команду у крошечного процессора ESP32-S3, по замеру
1 000 000команд при запуске: за 1–2 секунды нарезается весь риф
22декорации рифа, 7 из них колышутся
239появлений за 10 минут днём, 69 разных видов, до 53 одновременно
1 354поз в памяти через 10 минут, всего 370 КБ картинок
≈0,5 МБпамяти занято из 4 МБ, отведённых эффекту
≈30 минот слова «Вперёд!» до первой рыбы на настоящей панели

Кто там живёт

Рифовые рыбы · 65

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

Акулы · 11

Китовая, молот, черноперая и белопёрая рифовые, серая, песчаная тигровая, зебровая, усатая, эполетовая, пила-рыба и рохля.

Скаты и камбала · 5

Манта, пятнистый орляк, хвостоколы на песке и павлинья камбала.

Медузы · 6

Аурелия, морская крапива, львиная грива, полосатая, «яичница» и радужный гребневик.

Головоногие · 6

Осьминог и синекольчатый осьминог, каракатицы, кальмары и наутилус.

Ракообразные · 6

Лангуст, омар, крабы, креветка-чистильщик и радужная рак-богомол.

Черепахи и коньки · 6

Зелёная черепаха, бисса, логгерхед, два морских конька и лиственный морской дракон.

На дне и стаями · 14

Морские звёзды, ежи, голотурия, морские лилии, мурена в норе, садовые угри, шар из сардин и река анчоусов.

Шесть моментов суток на панели: утро, полдень, закат, вечер с подсветкой, ночь, рассвет

Шесть моментов одних суток: 10:30, 13:00, 19:40, 21:30, 02:00, 06:40.