Хочу сделать прикольный подарок для жены.

mr.Dooku

✩✩✩✩✩✩✩
15 Дек 2025
6
0
На задумку этой идеи навеяло сразу два совпавших в один момент события, я пересматривал на Ютубчике историю о вселенной Warcraft, там как раз шла Истрия короля Лича, для тех кто в теме прекрасно понимает о том что я сейчас скажу. В Синематека посвященный этому персонажу есть очень захватывающая песня, в исполнении соло, толи мальчика толи девочки в таком ЭПИЧЕСКОМ хоровом сеттинге. И в этот момент я смотрел подарок на Новый год своей супруге и в этот момент сходятся две параллели, на экране моего телефона появилось сообщение типа "мы знаем что подарить!" я кликаю, а там колба с искусственной розой известная по мультику студии Disney "красавица и чудовищ " где показывали эту розу с постепенно спадающими листьями в этой колбе. Короче перед глазами у меня эта колба в ушах этот эпический хор и картинка нарисовалась сама по себе в голове.
75cbce57987073243549961fab5f6c2f.jpg
726e5e1d77689fc4b6c081eb64df47af.jpg

А теперь к самой сути:

На всех маркетплейсах этот цветок внешне красив но он не живой, максимум что я видел это в него закидывают светодиодную соплю, ее еще вроде называют гирлянда "роса" по крайней мере так она находится по маркетплейсам
Screenshot_20251215-204759.pngScreenshot_20251215-204754.png
То что я нарисовал себе в голове похоже нет, но мозг нарисовал картинку и раз этого нет, значит надо включать режим самурая и делать это самому.

А именно:
Одна из основных фишек это то как это все должно включаться, а именно, укороченная версия песни из Warcraft Темы короля Лича (38 секунд) три куска подсветки в виде этих светодиодных соплей, разных цветов, пусть будет два куска синей и один розовой подсветки) и вибромоторчик который заныкан в бутоне этого цветка.

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

Ой, да, мысли бегут вперед) про фишку включения. На нижней части этой колбы как вы може видеть на картинке, я хочу разместить "сердечко".
12-127220_big-heart-image-png-heart-red-outline.png
Классическое такое, виде контура, ширина которой будет достаточно чтобы скрыть за собой (подумаю еще каким способом) две сенсорные кнопки.
7267583369.jpg
Почему две, сейчас объясню, сердечко нужно не просто так. Одну кнопку я хочу расположить в верхней точке соприкосновения двух половинок, а вторую внизу, и вот для чего, для того чтобы вся эта шайтан анимация начала работать, нужно, как бы пальцем обрисовать одну половинку, а потом вторую.
12-127220_big-heart-image-png-heart-red-outline (1).jpg
Начиная от точек соприкосновения. Вот тут то эти кнопки и должны как бы зафиксировать движение сначала по одной половине, потом по другой. Причём с какой половины начать как бы должно быть без разницы. Просто когда прикасаешься к верхней кнопки, он ждет когда прикоснуться ко второму, потом нужно повторить. Понятно что не обязательно проводить пальцем именно по контуру сердечка, но кто бы об этом знал) вить я скажу чтобы заработало нужно именно по контуру)
(Вот тут то как раз бы и пригодилась че нибудь помощь в программировании МК, так как я пока не понимаю какими циклами и проверками это реализовать).

После активации этими движениями, должна заиграть мелодия. Мелодия доходит до определённого момента и включается ПЛАВНО увеличивая яркость кусок "сопли" №1, потом в другой момент подключается и так же плавно плавно загорается кусок "сопли" №2, затем они обе немного приглушаются, и включается последняя "сопля" №3 которая в свою очередь засунута и расположена, аккуратно и красиво в самом бутоне. И вот последняя фаза это виброматорчик, засунутый в самую середину бутона. Который определённым образом и временем должен профилировать так чтобы это смотрелось ВАУ, ну тут можно уже будет поэкспериментировать с интенсивностью жужжание и придти к какому-то красивому решению. После того как моторчик отработал свой выход, вместе с мелодией это все медленно затухает.
КОНЕЦ!

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

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

Из того что я понимаю мне нужно:
1. сам Ардуино
2. аудио модуль с флешкой на которой и будет мелодия + динамик
3. Модуль вибромоторчика или просто виброматорчик от старого телефона.
4. куски светосоплей.
5. ну и аккумулятор с модулем зарядки под Tepe-c.

Прошу всех неравнодушных, добрых и отзывчивых людей помочь в проекте "Гондор зовет на помощь!"
 

bort707

★★★★★★✩
21 Сен 2020
3,402
981
@EugeneFrol, Если 5в пускать через ULN, на нагрузку ничего не останется. На самой УЛН до 2х вольт падение при номинальном токе.
Обычно с ULN источник бурут 9-12в и выше, она до 30в тянет
 

EugeneFrol

✩✩✩✩✩✩✩
17 Апр 2024
63
9
50
Вдруг двухцветные гирлянды попадутся, то заменим на MX1508.
 

mr.Dooku

✩✩✩✩✩✩✩
15 Дек 2025
6
0
Смотрите так как из бутона нужно сделать не вибратор, а просто эффект который длится 1-2 секунды, заказал такие модули, по размерам должны прям подойти и почти не заметно сникаться в бутоне, если эффекта будет не достаточно , то думаю прилепить его на каком-нибудь месте стебля, вроде как в теории должно сработать. Этот модуль со своим ключём с возможностью регулировки по ШИМ
 

Вложения

mr.Dooku

✩✩✩✩✩✩✩
15 Дек 2025
6
0
@EugeneFrol, в качестве светодиодов однозначно будут эти сопли, по сути от них нужно только возможность регулировать свою яркость, без всяких там RGB эффект, переливаний и т.д. они и более гармонично смотрятся в колбе. Да и в бутоне почти не заметны будут, если сильно не светить ими.
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
3,402
981
в качестве свето диодов однозначно будут эти сопли, по сути от них нужно только возможность регулировать свою яркость, без всяких там RGB
судя по тому, что они продаются по цветам, никакого РГБ там и нет.
А вот с возможностью регулировать яркость может выйте облом.
Сейчас очень много хитрых светодиодов. Это далеко не "лампочки на проводе". Весьма вероятно, что даже если просто отрезать от гирлянды часть - работать отдельно она не будет.
 

mr.Dooku

✩✩✩✩✩✩✩
15 Дек 2025
6
0
@bort707, у меня были из таких соплей типа палочки что ли волшебной, дочке покупали, точно помню что они плавно тухли и загорались, укорачивать их методом подреза конечно не пробовал. Может и перестанут работать, хотя на том же вб они разной длины продаются и все питаются от таблеток или батареек, так что думаю от длины их работоспособность не влияет, так как в прозрачном отсеке для батареек не видно никакой микросхемы
 

EugeneFrol

✩✩✩✩✩✩✩
17 Апр 2024
63
9
50
Спрошу у кореша. Он их кромсает в букеты и заливает потом эпоксидкой. Прикольные светильники-ночники. Все работает от CR2032.
 
  • Лойс +1
Реакции: mr.Dooku

mr.Dooku

✩✩✩✩✩✩✩
15 Дек 2025
6
0
@bort707,только что попробовал отрезать от нее один светодиод, светиться не перестало) нашел типа гирлянды на Хеллоуин на таких же соплях в виде летучих мышей
 

Мишутк

★✩✩✩✩✩✩
29 Мар 2025
86
35
Продублирую здесь примитивный прототип алгоритма с параллельного форума. Где обсуждение будет продуктивнее, там пусть и развивается. Там, все-таки, своя "атмосфера", для сильных духом.

туть: воквики
 

mr.Dooku

✩✩✩✩✩✩✩
15 Дек 2025
6
0
Оформи код соответствующим тэгом, см. Правила
int light1=9;
int light2=10;
int light3=11;
int music=7;
int vibro=8;
int button=4;

void setup()
{
pinMode(light1, OUTPUT);
pinMode(light2, OUTPUT);
pinMode(light3, OUTPUT);
pinMode(music, OUTPUT);
pinMode(vibro, OUTPUT);
pinMode(button, INPUT_PULLUP);

analogWrite(light1, 0);
analogWrite(light2, 0);
analogWrite(light3, 0);
digitalWrite(music, LOW);
digitalWrite(vibro, LOW);
}

void loop()
{
while (digitalRead(button) != LOW)
{
//просто ожидание нажатия кнопки
}

//включение музыки
digitalWrite(music, HIGH);
//поочередное включение гирлянд за 5 секунд каждая
for (int i=1; i<=255; i++)
{
analogWrite(light1, i);
delay(20);
}
for (int i=1; i<=255; i++)
{
analogWrite(light2, i);
delay(20);
}
for (int i=1; i<=255; i++)
{
analogWrite(light3, i);
delay(20);
}
//моторчик, имитация периодического включения на 4 секунды
for (int i=0; i < 20; i++)
{
digitalWrite(vibro, HIGH);
delay(100);
digitalWrite(vibro, LOW);
delay(100);
}
//одновременное выключение гирлянд за 5 секунд
for (int i=255; i>=0; i--)
{
analogWrite(light1, i);
analogWrite(light2, i);
analogWrite(light3, i);
delay(20);
}
//выключение музыки
digitalWrite(music, LOW);
}rose_lamp.jpg
 

Мишутк

★✩✩✩✩✩✩
29 Мар 2025
86
35
Теперь с кодом из двух кнопок: симуляция
C++:
uint8_t light1=9;
uint8_t light2=10;
uint8_t light3=11;
uint8_t music=7;
uint8_t vibro=8;
uint8_t button1=5;
uint8_t button2=4;

void setup()
{
  pinMode(light1, OUTPUT);
  pinMode(light2, OUTPUT);
  pinMode(light3, OUTPUT);
  pinMode(music, OUTPUT);
  pinMode(vibro, OUTPUT);
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);

  analogWrite(light1, 0);
  analogWrite(light2, 0);
  analogWrite(light3, 0);
  digitalWrite(music, LOW);
  digitalWrite(vibro, LOW);
}

void loop()
{
  //ожидание активации
  waitActivation();

  //включение музыки
  digitalWrite(music, HIGH);
  //поочередное включение гирлянд за 5 секунд каждая
  for (int i=1; i<=255; i++)
  {
    analogWrite(light1, i);
    delay(20);
  }
  for (int i=1; i<=255; i++)
  {
    analogWrite(light2, i);
    delay(20);
  }
  for (int i=1; i<=255; i++)
  {
    analogWrite(light3, i);
    delay(20);
  }
  //моторчик, имитация периодического включения на 4 секунды
  for (int i=0; i < 20; i++)
  {
    digitalWrite(vibro, HIGH);
    delay(100);
    digitalWrite(vibro, LOW);
    delay(100);
  }
  //одновременное выключение гирлянд за 5 секунд
  for (int i=255; i>=0; i--)
  {
    analogWrite(light1, i);
    analogWrite(light2, i);
    analogWrite(light3, i);
    delay(20);
  }
  //выключение музыки
  digitalWrite(music, LOW);
}

void waitActivation()
{
  int buttonState1 = 0;
  int buttonState2 = 0;
  int lastButtonState1 = LOW;
  int lastButtonState2 = LOW;

  unsigned long pressTime = 0;
  unsigned long blinkTime = 0;
  int activationStep = 0;
  int blink = 0;

  int codeDelay=5000; //допустимая задержка между нажатиями кнопок, мс

  while (activationStep < 4)
  {
    buttonState1 = digitalRead(button1);
    buttonState2 = digitalRead(button2);

    if (buttonState1 == LOW && lastButtonState1 == HIGH)
    {
      if (   activationStep == 0
          || activationStep == 2 )
      {
        pressTime = millis();
        activationStep++;
      }
    }

    if (buttonState2 == LOW && lastButtonState2 == HIGH)
    {
      if (   activationStep == 1
          || activationStep == 3 )
      {
        pressTime = millis();
        activationStep++;
      }
    }

    if (   activationStep != 0
        && (millis() - pressTime > codeDelay) )
    {
      activationStep = 0;
    }

    lastButtonState1 = buttonState1;
    lastButtonState2 = buttonState2;
    delay(10);

    //подсказка ввода кода моргает
    if (millis() - blinkTime >= 100)
    {
      if (blink == 0)
      {
        //чем ближе к концу тем слабее подсветка
        blink = ( 255*(codeDelay - (millis()-pressTime)) ) / codeDelay;
      }
      else
      {
        blink = 0;
      }
      blinkTime = millis();
    }

    //чем ближе к правильному коду, тем больше лампочек мигают
    switch (activationStep)
    {
      case 0:
        analogWrite(light1, 0);
        analogWrite(light2, 0);
        analogWrite(light3, 0);
        break;
      case 1:
        analogWrite(light1, blink);
        analogWrite(light2, 0);
        analogWrite(light3, 0);
        break;
      case 2:
        analogWrite(light1, blink);
        analogWrite(light2, blink);
        analogWrite(light3, 0);
        break;
      case 3:
        analogWrite(light1, blink);
        analogWrite(light2, blink);
        analogWrite(light3, blink);
        break;
    }
  } //while

  //выключение подсказки кода
  analogWrite(light1, 0);
  analogWrite(light2, 0);
  analogWrite(light3, 0);
}
Screenshot from 2025-12-16 20-43-08.png
 
Изменено: