Предупреждение для читателя: Эта статья — не гайд, не туториал, и уж точно не техноблог. Я не инженер, не блогер и не эксперт по микроконтроллерам. Просто человек, который в один вечер решил разобраться с ESP32 и внезапно собрал «Кубик мысли».

Это был абсолютно спонтанный проект. Без чертежей, без цели, без уверенности в успехе. Но в какой-то момент стало ясно: я делаю не просто кусок пластика с экраном. Я делаю нечто… тёплое, ламповое и простое.

В этой статье я расскажу, как появился мой Кубик. Что он делает, из чего собран, как работает и зачем вообще нужен. Если вы ищете сложную электронику или гайды уровня “с нуля в продакшн” — тут не об этом.
Зато, может быть, вы вдохновитесь и сделаете что-то своё. А это уже будет значить, что статья не зря.

С чего всё началось и как я пришёл к такому проекту.

Если честно, никакого плана «сделать что-то мотивирующее» у меня не было. Я просто ждал запчасти для метеостанции — всё должно было быть серьёзно, полезно, с графиками давления и датчиком BME280. Но, как это часто бывает, руки заскучали раньше, чем дошла посылка.

В закромах лежала лишняя ESP32, маленький дисплей, пара сенсорных кнопок и TP4056 с аккумулятором. Казалось бы — набор для чего угодно, только не для смысла жизни. Но я чуть присмотрелся… и шестерёнки в голове начали крутиться. Так появилась идея собрать маленький ламповый проект за вечер — просто чтобы не скучать.

Я сам не фанат мотивационных фраз и всей этой «психологической жвачки». Но один мой друг обожает такие «фразы дня». И, кажется, я подцепил эту особенность.

Так и родилась идея кубика, который говорит тебе то, что ты сам себе забываешь сказать.
Простой. Немного глупый. Но по-своему тёплый.
Порой ведь просто нужно услышать: «Ты справишься» — даже если это говорит кубик

 Готовый «Кубик мысли» в сборке.
Готовый «Кубик мысли» в сборке.

Смысл кубика и что он делает.

По сути, Кубик мысли — это просто экран с фразами. Он не умеет говорить, не показывает погоду и даже не меряет шаги. Он просто... появляется, когда тишина становится слишком громкой.

На его экране — короткие фразы, от тёплых до философских. Что-то вроде цифрового собеседника без лишних слов. Иногда добрые, иногда жёсткие. Иногда такие, какие ты хотел бы услышать от кого-то близкого — но говоришь их себе сам. Или кубик говорит за тебя.

Фразы появляются сами через определённое время, либо по нажатию сенсорной кнопки — вперёд или назад. Текст плавно прокручивается, если он не помещается целиком. Всё просто, но почему-то работает.

Он не нужен.
Но когда он включён — он становится чем-то личным.
И кажется, будто он действительно чуть-чуть чувствует, когда тебе нужна именно эта фраза.

 Одна из фраз, которую может выдать кубик.
Одна из фраз, которую может выдать кубик.

Компоненты и схема подключения.

Внутри кубика — ничего необычного. Просто набор, который мог бы лежать у любого, кто хотя бы раз заказывал что-то с AliExpress.
Вот основные компоненты:

ESP32
Мозг устройства. Подключены:
D22, D21 — дисплей (I²C);
D19, D18 — кнопки TTP223;
GND и питание, естественно.

OLED 0.96" 128×64, I²C
тот самый классический монохромный экран. Чёткий, контрастный, идеально подходит под небольшой текст.

Две сенсорные кнопки TTP223
Реагируют на касание. Одна — "вперёд", вторая — "назад".

TP4056 + аккумулятор 650 мА/ч
Управляют зарядом. Между ними — тумблер для отключения питания.

8 магнитов 6x3 Для крепления нижней части корпуса.

Маленький корпус, спроектированный с нуля в Blender
Именно с нуля. Без гайдов. Без опыта. За 4 часа. (не судите строго)
6 съёмных компонентов, включая место под дисплей, плату и кнопки. Визуально — строго, кубично, аккуратно. В духе идеи.

Подключено всё довольно прямолинейно. ESP32 выдает питание дисплею и кнопкам, а TP4056 следит за зарядом.
Самое сложное — найти, куда воткнуть всё это по GND, когда ESP32 у тебя одна, а земля — на вес золота.

 Начинка: компоненты и подключения внутри корпуса.
Начинка: компоненты и подключения внутри корпуса.
 Начинка: компоненты и подключения внутри корпуса.
Начинка: компоненты и подключения внутри корпуса.

Логика работы и код.

Логика работы кубика простая и понятная, как кружка чая вечером.
Всё держится на Arduino-коде с использованием U8g2lib для работы с дисплеем. Никаких библиотек-монстров.

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

Каждые 30 секунд кубик сам выбирает новую фразу случайным образом.
Или можно переключить вручную — касанием одной из двух сенсорных кнопок (тоже случайным образом).

При старте кубик выбирает случайную фразу и сразу выводит её на экран. Всё максимально просто:

void setup() {
  pinMode(btnNext, INPUT);
  pinMode(btnPrev, INPUT);

  u8g2.begin();
  u8g2.enableUTF8Print();
  u8g2.setFont(u8g2_font_6x13_t_cyrillic);

  randomSeed(analogRead(0));
  int rnd = random(phraseCount);
  history[0] = rnd;
  historyCount = 1;
  drawPhrase(rnd);
  startTime = millis();
}

Если нажать “назад” — фраза берётся из истории.
Да, у кубика есть память. Маленькая, но гордая).

Основная логика в loop(): автопрокрутка текста, смена фраз по времени и отклик на касание кнопок:

void loop() {
  unsigned long now = millis();

  bool btnN = digitalRead(btnNext);
  bool btnP = digitalRead(btnPrev);

  if (now < easterEggDelayUntil) {
    esp_sleep_enable_timer_wakeup(50 * 1000);
    esp_light_sleep_start();
    return;
  }
   // Автопрокрутка
  if (now - lastScrollTime > scrollDelay) {
    currentLine++;
    if (currentLine > totalLines - linesPerPage) currentLine = 0;
    drawText();
    lastScrollTime = now;
  }

  // Автоматическая смена фразы
  if (now - startTime > phraseDuration) {
    nextPhrase();
  }

  // Кнопка вперёд
  if (btnN && !prevBtnNext) {
    nextPhrase();
  }
  prevBtnNext = btnN;

  // Кнопка назад
  if (btnP && !prevBtnPrev) {
    if (historyPos > 0) {
      historyPos--;
      drawPhrase(history[historyPos]);
    }
  }
  prevBtnPrev = btnP;

Текст разбивается на строки и выводится построчно. Если строк больше, чем экран вмещает — срабатывает автопрокрутка:

void drawText() {
  u8g2.clearBuffer();
  for (int i = 0; i < linesPerPage; i++) {
    int lineIndex = currentLine + i;
    if (lineIndex >= totalLines) break;
    u8g2.setCursor(0, 15 + i * 16);
    u8g2.print(lines[lineIndex]);
  }
  u8g2.sendBuffer();
}

Работает всё стабильно, без глюков.
В коде нет ничего сложного — его можно читать как повесть.
Ознакомиться с ним можно на GitHub (там же вы найдёте STL‑модели для печати и файлы формата .blend) — чтобы каждый мог адаптировать под себя.
Или просто поиграться. А вдруг родится что-то своё?

Отдельно отмечу: в написании и структурировании кода мне помог ChatGPT.
Я не специалист в программировании микроконтроллеров, но разбирался, адаптировал и подгонял всё под свой проект вручную.
Так что если что-то работает — спасибо ему.
А если не работает — уже моя вина).

Сборка.

Собиралось всё удивительно просто. Прямо не по канонам DIY, где обычно нужно спаять шесть переходников, рассверлить три отверстия и потом час гуглить, почему не работает. Тут всё реально встало на место само.

Проводов — минимум, пайки почти не было: всё шло через штырьки и проводки с Dupont-коннекторами.
Единственный нюанс — заземление (GND). ESP32, конечно, молодец, но когда к ней начинают проситься дисплей, две сенсорные кнопки и зарядник с аккумулятором — ножки GND быстро заканчиваются. Решение простое: скрутка, капля олова — и вперёд.

Я сознательно делал всё модульно и разборно, в том числе использовал термоклей — вдруг захочется переделать.
Вы, конечно, можете собрать «на века» — с припоем, лаком и благословением паяльника).

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

Корпус и Blender: с наскока в 3D.

Корпус для кубика я сделал в Blender.
Да-да, в том самом Blender, где большинство людей делают 3D-анимации, а не корпуса для самоделок. До этого я даже не открывал его.
Без гайдов. Без опыта. С нулевыми познаниями. Просто сел — и за 4 часа слепил.

В итоге получилось шесть съёмных компонентов, аккуратный внешний вид и чётко подогнанные пазы под экран, ESP32, кнопки, выключатель и модуль зарядки.
Ничего не люфтит, всё вставляется плотненько. И пусть это не промышленный дизайн, но оно работает, выглядит достойно и, главное, моё.

Blender оказался неожиданно удобным: если не бояться, то можно быстро собрать всё, что нужно.
Теперь это мой первый завершённый 3D-проект — и я им искренне горжусь.
Пусть и не идеален. Зато настоящий.

 3D-модель в Blender
3D-модель в Blender
Корпус сзади (чуть промахнулся с размером для разъёма, в модели поправил уже после, но лучше перепроверить перед печать).
Корпус сзади (чуть промахнулся с размером для разъёма, в модели поправил уже после, но лучше перепроверить перед печать).

Возможности развития проекта.

Сейчас это просто кубик с фразами. Но потенциал у него куда больше, чем может показаться.

Можно добавить микрофон и простой ИИ — получится «глупенький собеседник», который реагирует на голос.
Или превратить его в напоминалку, отслеживающую, как долго ты сидишь, и просящую выпрямиться (будем честны, такое нам всем не помешало бы).

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

Ещё идея: подключить гироскоп — и сделать кубик-наставник, который реагирует на встряску или переворот. А там и до простенького робота-игрушки недалеко).
А можно пойти дальше — добавить Wi-Fi, логировать звук, а там, глядишь, и веб‑камера подтянется.
Мини-страж комнаты. Почти как умный дом, только душевнее.

Хотя, может, и не стоит превращать его в умника.
Иногда достаточно, чтобы рядом был кто-то, кто скажет тёплое слово.
Даже если это — кубик.

Заключение.

Этот проект не про технологии. Не про оптимизацию, производительность или какой-то wow-эффект. Это просто кубик, который я собрал в один из вечеров — между делом, между задачами, между мыслями. Он ничего не умеет. И, возможно, именно в этом его сила.

Иногда хочется сделать что-то не потому что нужно, а потому что тепло становится от самого процесса. Собрал — и оно получилось. Не ради пользы. Ради чувства. Ради «а почему бы и нет».

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

(И да, в кубике есть несколько пасхалок. Не советую вчитываться в код слишком внимательно — иногда лучше просто довериться устройству и вспомнить старые коды от игр 90-х, например...)

Спасибо, что дочитали.
Код и STL-файлы будут на GitHub.
Если вам понравился проект — буду рад фидбэку и плюсику на пост.

P.S. этот кубик вы уже могли мельком видеть в моей прошлой статье про первый опыт с 3D-принтером — можно взглянуть здесь.

Комментарии (23)


  1. sergio_nsk
    15.07.2025 02:25

    Какая-то нездоровая тенденция неспособности вставлять код правильно.

    "2x сенсорные кнопки" - это что, две сенсорные кнопки или двух-сенсорные кнопки?

    "Fix bag" - сумку? Вероятно, bug.


    1. Dark_Linked Автор
      15.07.2025 02:25

      Спасибо, что обратили внимание на недочёты!
      С кодом действительно был первый опыт вставки в статью - теперь разобрался и всё поправил.
      Формулировку про "2x сенсорные кнопки" тоже уточнил, чтобы не было путаницы.

      А за Git - подловили метко).
      Да, в одном из коммитов вместо "Fix bug" случайно проскочило "Fix bag". Видимо, баг настолько прочно прижился, что попал даже в подпись. Но думаю, ничего страшного - без мелких огрехов не бывает и прогресса).


      1. sergio_nsk
        15.07.2025 02:25

        теперь разобрался и всё поправил

        Нет, не всё - форматирование кода потеряно, его нужно вставить заново из https://raw.githubusercontent.com/W1spi/CubeOfThought-/refs/heads/main/Cube_of_thougth.ino, и выбрать язык С++ для блоков кода.


        1. Dark_Linked Автор
          15.07.2025 02:25

          Ещё раз спасибо! Теперь точно должно быть всё корректно.


  1. old_bear
    15.07.2025 02:25

    неповторимый оригинал


    1. Dark_Linked Автор
      15.07.2025 02:25

      Ахах, ну почти рядом). Всё же смысл я закладывал иной в проект - он не предсказывает, а поддерживает. Но схожесть какая-то есть, не спорю)


  1. nikolz
    15.07.2025 02:25

    Он просто... появляется, когда тишина становится слишком громкой.

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

    Но все оказалось уж совсем элементарно.


    1. Dark_Linked Автор
      15.07.2025 02:25

      Справедливое замечание).
      Но, признаться, я с самого начала честно предупреждаю: проект простенький, ламповый. Это не претендующий на сложность девайс, а скорее повод поиграться с идеей и поделиться ею.

      Делал его скорее "от скуки", чтобы хоть что-то создать, чтобы вытащить из головы и перенести в реальность. Без амбиций на "умную колонку" или полноценное устройство, которое анализирует тишину и обращается к нам по wi-fi).

      Но в этом и был смысл - сделать что-то очень простое, но с настроением. Кубик, который не пытается быть умным - он просто твой.
      Но в будущем, может, апгрейдну его, пару идей ближе к концу статьи накидал уже.


  1. AndreyDmitriev
    15.07.2025 02:25

    Может он и правда, что-то там чувствует, но я б чувствовал страшный дискомфорт внутреннего перфекциониста, глядя вот на такой перенос строк. Либо знак переноса надо добавить, либо вообще от переноса избавиться и по словам на новую строку перебрасывать.


    1. Dark_Linked Автор
      15.07.2025 02:25

      По словам пробовал, но для такого маленького экранчика всё выливается в узкую стену текста. Так что отказался быстро от этой идеи. А так как с микроконтроллерами не сильно дружу пока, решил сделать самый простой вариант - резать по символам в строке.
      Код и stl в открытом доступе, так что если хотите, можете подредактировать. Я только благодарен буду)


      1. AndreyDmitriev
        15.07.2025 02:25

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


        1. Dark_Linked Автор
          15.07.2025 02:25

          Да я и сам хотел побольше взять сначала). Да вот только под рукой его не оказалось. А ждать пока придёт с Китая - не сильно хотелось. Проект то задумывался просто чтобы руки занять). Но всегда можно обновить экран, напечатать другой корпус и собрать уже более приятную для взаимодействия самоделку.

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

          Сама по себе самоделка относительно перспективная, и прикрутить к ней многое можно)


  1. nikolz
    15.07.2025 02:25

    Так и я о том же. Можно сделать сам кубик очень простым : слушаем микрофон , если тихо читаем с ПК по WiFi и отображаем на экране кубика.

    В интернет ходит ПК.

    Сравнивал Алису и DeepSeek.

    Алиса очень примитивно мыслит.

    А колонки с Алисой очень сильно забивают интернет.


    1. Dark_Linked Автор
      15.07.2025 02:25

      Это тоже интересный путь - особенно с микрофоном и чтением через ПК. Я как раз размышлял о чём-то подобном ближе к финалу статьи, но решил пока оставить "кубик" максимально автономным.

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

      А по поводу Алисы согласен. Порой кажется, что она всё ещё думает по алгоритмам из 2015-го. Зато DeepSeek и GPTшки реально удивляют уже не просто ответами, а контекстом.

      Спасибо за идею, кстати. Кто знает - может, когда-нибудь именно она выстрелит во второй версии)


    1. microArt
      15.07.2025 02:25

      DeepSeek просто так не подключишь, за API надо платить.
      Никто не подскажет, к каким нейросетям можно бесплатно подключиться? Из России (чтобы без ВПН). Отправить текстовый запрос, получить ответ и озвучить.

      Идея постоянно слушать с микрофона мне не очень нравится. Лучше пусть реагирует на что-то (на прикосновение, на нажатие кнопки и т.д.)

      На ютубе интересное устройство попалось: в виде кошачьей мордочки, круглый экранчик-лицо (как у смарт-часов). Соединен с нейросетями (можно спрашивать и получить ответ) и умным домом (можно управлять другими устройствами). Маленькое, выглядит замечательно.


      1. nikolz
        15.07.2025 02:25

        1)Есть бесплатный чат c DeepSeek. Пользуюсь им.

        2) Про микрофон написал, так как в статье про тишину сказано.

        Можно сделать реагирование на пинок и чтобы в ответ не показывал, а говорил (это проще чем микрофон). Можно сделать без WiFi. Записать во флеш набор фраз. Будет очень много и выбирать их случайным образом.


        1. microArt
          15.07.2025 02:25

          Спасибо за ответ.

          "Есть бесплатный чат c DeepSeek. Пользуюсь им".

          Так-то через чат и я им пользуюсь. В рассуждениях он показался мне хуже, чем ЧатГПТ.
          Я говорю про обращение по API из своего собственного скрипта (например, на bash). Отослать ему текст, получить ответ и озвучить. Только это у них платно.
          Я сейчас небольшую программку делаю для себя на php, с помощью ЧатГПТ (потому что языков не знаю). php c bash выбраны, потому что самые легкие (делаю для маломощного устройства). Суть в том, что анализ в фразе идет по ключевым словам и в зависимости от них срабатывает или свой собственный скрипт или этот же вопрос передаем в нейросеть и озвучиваем ответ от нее. Данные (шаблоны фраз, пути к скриптам) хранятся в таблице mysql.


          1. nikolz
            15.07.2025 02:25

            Почему бы в чат не послать из своего скрипта вопрос, получить ответ и озвучить?


            1. microArt
              15.07.2025 02:25

              И как это можно сделать?
              Мне кажется, что если бы все было так просто, то таким способом массово пользовались бы все самодельщики "умных колонок".


              1. nikolz
                15.07.2025 02:25

                Если упрощенно, то реализовать диалог в чате не с клавиатуры, а из скрипта. Технически в этом проблемы нет.

                Но так как мне это не было нужно, то не писал такой скрипт, поэтому отвечаю не конкретно.


  1. Sapsan_Sapsanov
    15.07.2025 02:25

    Убийца Алисы. Автору надо называть его "Весельчак Y" )))


    1. microArt
      15.07.2025 02:25

      Можно назвать "Миелофон". Тоже в черной квадратной коробочке.

      Мне идея нравится. У меня сделано что-то похожее (озвучка случайной фразы), только готовое устройство (не самосборное).


      1. Dark_Linked Автор
        15.07.2025 02:25

        Спасибо! "Миелофон" - кстати, красиво ложится по стилю, и правда перекликается формой и смыслом. А про ваш девайс - очень интересно, особенно если есть возможность где-то посмотреть/почитать. Поделитесь? А то я как-то даже не задавался вопросом, есть ли что-то подобное уже).