Предупреждение для читателя: Эта статья — не гайд, не туториал, и уж точно не техноблог. Я не инженер, не блогер и не эксперт по микроконтроллерам. Просто человек, который в один вечер решил разобраться с 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-проект — и я им искренне горжусь.
Пусть и не идеален. Зато настоящий.


Возможности развития проекта.
Сейчас это просто кубик с фразами. Но потенциал у него куда больше, чем может показаться.
Можно добавить микрофон и простой ИИ — получится «глупенький собеседник», который реагирует на голос.
Или превратить его в напоминалку, отслеживающую, как долго ты сидишь, и просящую выпрямиться (будем честны, такое нам всем не помешало бы).
Можно модернизировать экран: поставить цветной, побольше — и выводить уже картинки, гифки или мемы.
А если ещё добавить интеграцию с сервером — получится мини‑терминал, присылающий ежедневную порцию мемов, фраз или напоминаний.
Ещё идея: подключить гироскоп — и сделать кубик-наставник, который реагирует на встряску или переворот. А там и до простенького робота-игрушки недалеко).
А можно пойти дальше — добавить Wi-Fi, логировать звук, а там, глядишь, и веб‑камера подтянется.
Мини-страж комнаты. Почти как умный дом, только душевнее.
Хотя, может, и не стоит превращать его в умника.
Иногда достаточно, чтобы рядом был кто-то, кто скажет тёплое слово.
Даже если это — кубик.
Заключение.
Этот проект не про технологии. Не про оптимизацию, производительность или какой-то wow-эффект. Это просто кубик, который я собрал в один из вечеров — между делом, между задачами, между мыслями. Он ничего не умеет. И, возможно, именно в этом его сила.
Иногда хочется сделать что-то не потому что нужно, а потому что тепло становится от самого процесса. Собрал — и оно получилось. Не ради пользы. Ради чувства. Ради «а почему бы и нет».
Если этот текст дал вам хотя бы одну идею или одну улыбку — значит, всё не зря. А если соберёте свой кубик — пусть он скажет вам то, чего не хватало.
(И да, в кубике есть несколько пасхалок. Не советую вчитываться в код слишком внимательно — иногда лучше просто довериться устройству и вспомнить старые коды от игр 90-х, например...)
Спасибо, что дочитали.
Код и STL-файлы будут на GitHub.
Если вам понравился проект — буду рад фидбэку и плюсику на пост.
P.S. этот кубик вы уже могли мельком видеть в моей прошлой статье про первый опыт с 3D-принтером — можно взглянуть здесь.
Комментарии (21)
old_bear
15.07.2025 02:25неповторимый оригинал
Dark_Linked Автор
15.07.2025 02:25Ахах, ну почти рядом). Всё же смысл я закладывал иной в проект - он не предсказывает, а поддерживает. Но схожесть какая-то есть, не спорю)
nikolz
15.07.2025 02:25Он просто... появляется, когда тишина становится слишком громкой.
Когда прочитал эту фразу и увидел в тексте ESP32, то подумал , что кубик умеет слушать тишину и когда очень тихо обращается по WiFi в интернет и выдает какую-нибудь фразу.
Но все оказалось уж совсем элементарно.
Dark_Linked Автор
15.07.2025 02:25Справедливое замечание).
Но, признаться, я с самого начала честно предупреждаю: проект простенький, ламповый. Это не претендующий на сложность девайс, а скорее повод поиграться с идеей и поделиться ею.Делал его скорее "от скуки", чтобы хоть что-то создать, чтобы вытащить из головы и перенести в реальность. Без амбиций на "умную колонку" или полноценное устройство, которое анализирует тишину и обращается к нам по wi-fi).
Но в этом и был смысл - сделать что-то очень простое, но с настроением. Кубик, который не пытается быть умным - он просто твой.
Но в будущем, может, апгрейдну его, пару идей ближе к концу статьи накидал уже.
AndreyDmitriev
15.07.2025 02:25Может он и правда, что-то там чувствует, но я б чувствовал страшный дискомфорт внутреннего перфекциониста, глядя вот на такой перенос строк. Либо знак переноса надо добавить, либо вообще от переноса избавиться и по словам на новую строку перебрасывать.
Dark_Linked Автор
15.07.2025 02:25По словам пробовал, но для такого маленького экранчика всё выливается в узкую стену текста. Так что отказался быстро от этой идеи. А так как с микроконтроллерами не сильно дружу пока, решил сделать самый простой вариант - резать по символам в строке.
Код и stl в открытом доступе, так что если хотите, можете подредактировать. Я только благодарен буду)AndreyDmitriev
15.07.2025 02:25Я б просто взял мониторчик чуть побольше. На этом хорошо температуру показывать, а для данной задачи он не очень подходит.
Dark_Linked Автор
15.07.2025 02:25Да я и сам хотел побольше взять сначала). Да вот только под рукой его не оказалось. А ждать пока придёт с Китая - не сильно хотелось. Проект то задумывался просто чтобы руки занять). Но всегда можно обновить экран, напечатать другой корпус и собрать уже более приятную для взаимодействия самоделку.
Собственно, я под конец статьи об этом упомянал. Быть может, чуть позже уже выложу обновлённую версию с доработками и интересными фишками типа интеграции с сервером, web-мордой и т.д.
Сама по себе самоделка относительно перспективная, и прикрутить к ней многое можно)
nikolz
15.07.2025 02:25Так и я о том же. Можно сделать сам кубик очень простым : слушаем микрофон , если тихо читаем с ПК по WiFi и отображаем на экране кубика.
В интернет ходит ПК.
Сравнивал Алису и DeepSeek.
Алиса очень примитивно мыслит.
А колонки с Алисой очень сильно забивают интернет.
Dark_Linked Автор
15.07.2025 02:25Это тоже интересный путь - особенно с микрофоном и чтением через ПК. Я как раз размышлял о чём-то подобном ближе к финалу статьи, но решил пока оставить "кубик" максимально автономным.
В будущем, если будет желание поиграться с серверной частью, можно и такой сценарий реализовать. Кубик с голосом - звучит уже как полноценный спутник по вечерам).
А по поводу Алисы согласен. Порой кажется, что она всё ещё думает по алгоритмам из 2015-го. Зато DeepSeek и GPTшки реально удивляют уже не просто ответами, а контекстом.
Спасибо за идею, кстати. Кто знает - может, когда-нибудь именно она выстрелит во второй версии)
microArt
15.07.2025 02:25DeepSeek просто так не подключишь, за API надо платить.
Никто не подскажет, к каким нейросетям можно бесплатно подключиться? Из России (чтобы без ВПН). Отправить текстовый запрос, получить ответ и озвучить.
Идея постоянно слушать с микрофона мне не очень нравится. Лучше пусть реагирует на что-то (на прикосновение, на нажатие кнопки и т.д.)
На ютубе интересное устройство попалось: в виде кошачьей мордочки, круглый экранчик-лицо (как у смарт-часов). Соединен с нейросетями (можно спрашивать и получить ответ) и умным домом (можно управлять другими устройствами). Маленькое, выглядит замечательно.nikolz
15.07.2025 02:251)Есть бесплатный чат c DeepSeek. Пользуюсь им.
2) Про микрофон написал, так как в статье про тишину сказано.
Можно сделать реагирование на пинок и чтобы в ответ не показывал, а говорил (это проще чем микрофон). Можно сделать без WiFi. Записать во флеш набор фраз. Будет очень много и выбирать их случайным образом.
microArt
15.07.2025 02:25Спасибо за ответ.
"Есть бесплатный чат c DeepSeek. Пользуюсь им".
Так-то через чат и я им пользуюсь. В рассуждениях он показался мне хуже, чем ЧатГПТ.
Я говорю про обращение по API из своего собственного скрипта (например, на bash). Отослать ему текст, получить ответ и озвучить. Только это у них платно.
Я сейчас небольшую программку делаю для себя на php, с помощью ЧатГПТ (потому что языков не знаю). php c bash выбраны, потому что самые легкие (делаю для маломощного устройства). Суть в том, что анализ в фразе идет по ключевым словам и в зависимости от них срабатывает или свой собственный скрипт или этот же вопрос передаем в нейросеть и озвучиваем ответ от нее. Данные (шаблоны фраз, пути к скриптам) хранятся в таблице mysql.nikolz
15.07.2025 02:25Почему бы в чат не послать из своего скрипта вопрос, получить ответ и озвучить?
Sapsan_Sapsanov
15.07.2025 02:25Убийца Алисы. Автору надо называть его "Весельчак Y" )))
microArt
15.07.2025 02:25Можно назвать "Миелофон". Тоже в черной квадратной коробочке.
Мне идея нравится. У меня сделано что-то похожее (озвучка случайной фразы), только готовое устройство (не самосборное).Dark_Linked Автор
15.07.2025 02:25Спасибо! "Миелофон" - кстати, красиво ложится по стилю, и правда перекликается формой и смыслом. А про ваш девайс - очень интересно, особенно если есть возможность где-то посмотреть/почитать. Поделитесь? А то я как-то даже не задавался вопросом, есть ли что-то подобное уже).
sergio_nsk
Какая-то нездоровая тенденция неспособности вставлять код правильно.
"2x сенсорные кнопки" - это что, две сенсорные кнопки или двух-сенсорные кнопки?
"Fix bag" - сумку? Вероятно, bug.
Dark_Linked Автор
Спасибо, что обратили внимание на недочёты!
С кодом действительно был первый опыт вставки в статью - теперь разобрался и всё поправил.
Формулировку про "2x сенсорные кнопки" тоже уточнил, чтобы не было путаницы.
А за Git - подловили метко).
Да, в одном из коммитов вместо "Fix bug" случайно проскочило "Fix bag". Видимо, баг настолько прочно прижился, что попал даже в подпись. Но думаю, ничего страшного - без мелких огрехов не бывает и прогресса).
sergio_nsk
Нет, не всё - форматирование кода потеряно, его нужно вставить заново из https://raw.githubusercontent.com/W1spi/CubeOfThought-/refs/heads/main/Cube_of_thougth.ino, и выбрать язык С++ для блоков кода.
Dark_Linked Автор
Ещё раз спасибо! Теперь точно должно быть всё корректно.