Search
Write a publication
Pull to refresh

Кубик мысли: простой проект, который говорит вместо тебя

Level of difficultyEasy
Reading time7 min
Views2.8K

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

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+11
Comments25

Articles