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