Code Every Day 🚀
30 subscribers
687 photos
243 videos
22 files
174 links
Просто для развлечения
Download Telegram
Логические модели объектов, которые отрисовываются на RGB матрице, описываются свойствами:
позиция на экране (x,y) координаты, рамер прямоугольной области для заливки объекта - size, цвет заливки и набор дополнительных параметров в отдельной модели RenderParams.

class MovableSprite {
public:
MovableSprite(
int x,
int y,
int size,
uint16_t color
) {
_x = x;
_y = y;
_size = size;
_color = color;
_renderParams = new RenderParams();
};

int x() { return _x; }
int y() { return _y; }
int size() { return _size; }
uint16_t color() { return _color; }

void setX(int x) { _x = x; }
void setY(int y) { _y = y; }
void setColor(uint16_t color) { _color = color; }

RenderParams* getRenderParams() {
return _renderParams;
}

String toString() {
return String(x()) + "," + String(y()) + "," + String(size()) + "," + String(color());
}

void move(int dx, int dy) {
_x += dx;
_y += dy;
}

private:
int _x, _y;
int _size;
uint16_t _color;
RenderParams *_renderParams;
}
;

Соответственно, основная программа содержит список MovableSprite, отрисовывает их на панели.


List<MovableSprite*> sprites = List<MovableSprite*>();
MovableSprite *sprite1 = new MovableSprite(5, 5, 2, 99);
MovableSprite *sprite2 = new MovableSprite(5, 10, 2, 89);
MovableSprite *sprite3 = new MovableSprite(5, 15, 2, 79);
MovableSprite *sprite4 = new MovableSprite(5, 20, 2, 69);

List<Interpolator> interpolators = List<Interpolator>()


Есть специальный метод для перемещения объекта, который меняет координаты объекта с использованием интерполяторов.


void loop() {
if (isRequireGreeting) {
displayGreeting();
isRequireGreeting = false;
} else {
displayMovables();
changeRanderParams();
}
}

...

void changeRanderParams() {
for (int i = 0; i < sprites.getSize(); ++i) {
RenderParams *render = sprites[i]->getRenderParams();
render->changeTime();
}
}

void displayMovables() {
draw();
moving();
}
void moving() {
for (int i = 0; i < sprites.getSize(); ++i) {
MovableSprite *sprite = sprites[i];
RenderParams *render = sprite->getRenderParams();

if (isDebug) {
Serial.println(
"moving: " + String(i) + ", "
+ String(render->getTime()) + ", "
+ String(sprite->x())
);
}

if (sprite->x() >= 64) {
if (render->getCycles() > 3) {
render->resetCycles();
render->resetTime();
sprite->setX(0);
} else {
render->incrementCycles();
}
sprite->setX(sprite->x() - render->getCycles()*64);
}

double time = render->getTime();

int x = Interpolator().calculateX(time);

if (i == 1) {
x = LinearInterpolator().calculateX(time);
} else if (i == 2) {
x = AccelerateInterpolator().calculateX(time);
} else if (i == 3) {
x = BounceInterpolator().calculateX(time);
}

if (i == 0) {
sprite->move(x, 0);
} else {
sprite->setX(x);
}
}
}
👉Если кому-то будет интересно поразбираться, то верхнеуровнево основные моменты описал.
Но такой формат описания не оч хороший, на будущее это учту.
👍1
День 12: Заметка 2: Сувениры на память

👉Рекомендую по ходу дела обзаводиться сувенирами, они будут напоминать об этапах жизни.
🤟Последовал своей же рекомендации.

#Life
🔥2
День 13: Заметка 1: Arduino + Bluetooth = 💪

🤟 Хай, Кодерс!

💪 Уже пару недель, как начал эксперименты с RGB матрицей и Arduino, получается интересно, но нету некоторой интерактивности. А без нее скоро будет скучно.

🎯 На текущий момент в демо видео обычно весь флоу жестко зашит в рамках основной программы. Хотелось бы влиять на ход исполнения программы из вне.

🤔 Размышляя над вариантами решения задачи взаимодействия с Arduino, я остановился на самом удобном:
👉 буду управлять Arduino через Bluetooth из мобильного приложения.

Для этих целей:
💰 закупил bluetooth модуль HC-06;
🛠 собрал прототип на Arduino Uno, подключился к модулю, через простой bluetooth терминал проверил работоспособность, все работает как положено: отправлял сообщение через bluetooth в Arduino, Arduino отправляла это сообщение обратно, то есть своеобразный ping отработал.

🤔 Данная модель модуля может работать как slave, то есть самостоятельно не умеет подключаться у другому устройству.
👉 Но это не беда. Значит, в мобильном приложении попробую сделать сервис и поосле первого подключения сохраню mac адрес модуля для дальнейшего подключения из фонового сервиса. Ну это первое, что пришло в голову. Попробую так сделать.

🤟 По итогу я планирую сделать несколько игр, которые будут отрисовываться на RGB матрице, а в качестве джостика управления будет выступать мобильное приложение.

📷 На фото (в следующем сообщении) собранный прототипчик и сам модуль.

#Arduino
#Bluetooth
👍1
📷 Arduino + Bluetooth = 💪
👍1
Media is too big
VIEW IN TELEGRAM
День 14: Заметка 1: Bubble интерполятор для анимации Arduino и RGBMatrix

🤟 Хай, Кодерс!

💪 Сегодня продолжал работу над анимациям, решил реализовать Bubble интерполятор.

🫧 Bubble анимация представлят собой изменение целевого показателя скачкобразно.
Очень наглядно это заметно на анимации расширения круга. Ее и реализовал.

💡Допустим мы хотим, чтобы круг раздулся от нулевого радиуса до 10 единиц:
👉 в таком случае сналача он раздуется чуть больше, допустим, до 12,
👉 затем сдуется до 8,
👉 затем раздуется до 11,
👉 сдуется до 9
👉 и при следующей итерации выйдет на целевой радиус в 10 .

Выглядит это симпатично, на мой взгляд.

📷 Пример реализации на видео.

#Arduino
🔥2
Code Every Day 🚀
День 14: Заметка 1: Bubble интерполятор для анимации Arduino и RGBMatrix 🤟 Хай, Кодерс! 💪 Сегодня продолжал работу над анимациям, решил реализовать Bubble интерполятор. 🫧 Bubble анимация представлят собой изменение целевого показателя скачкобразно. Очень…
День 14: Заметка 2: Bubble интерполятор, детали реализации

📈 График изменения целевого параметра наглядно выглядит так, как на приложенном изображении. Также приведена функция изменения параметра.
🧑‍💻 Реализация интерполятора описывает формулу изменения параметра

class BubbleInterpolator : public Interpolator {
public:
int type = Interpolator::TYPE_BUBBLE;

double amplitude = 0.5;
double frequancy = 10;

virtual float calculateR(double time) {
float result = (-1 * pow(3.14, -time/amplitude) * cos(frequancy * time)) + 1;
return result;
}
};
👍1
День 14: Заметка 3: Применение Bubble интерполятора

🧑‍💻 Код применениия интерполятора выглядит так

void displayBubbles(
int x,
int y,
int radius,
float timeFrom,
float timeTo,
float timeStep
) {
uint16_t color = getColorRandom();
BubbleInterpolator interpolator = BubbleInterpolator();

for (float i = timeFrom; i <= timeTo; i += timeStep) {
//очистка ранее нарисованного круга (с прошлых итераций)
matrix.fillScreen(0);
// пробобвал очистку делать меньшей области, но, кажется, что это работает дольше
// matrix.fillCircle(
// x, y,
// (int) radius * 1.75, // примерно на глазок прикинул, что в большинстве случаев этого достаточно
// 0
// );

//вычисление отклонения радиуса в зависимости от времени отрисовки
float diffs = interpolator.calculateR(i);
int radiusResult = radius * diffs;

if (appState.isDebug()) {
String logs = String(i) + ", " + String(x) + ", " + String(radiusResult);
Serial.println(logs);
}

// отрисовка текущего состояния радиуса с учетом функции изменения интерполятора
matrix.fillCircle(
x, y,
radiusResult,
color
);

matrix.swapBuffers(false);
}
}
👍1
Code Every Day 🚀
День 14: Заметка 1: Bubble интерполятор для анимации Arduino и RGBMatrix 🤟 Хай, Кодерс! 💪 Сегодня продолжал работу над анимациям, решил реализовать Bubble интерполятор. 🫧 Bubble анимация представлят собой изменение целевого показателя скачкобразно. Очень…
День 14: Заметка 4: Особенности реализации Bubble интерполятора

🤟 А теперь, 🧑‍💻 Кодерс, 🍒 на торте (то есть заключение).

🤔 На видео видно, будто анимация прогрывается неплавно. Давайте разберемся в корне проблемы.

🤔 Кажется (не замерял), на самом деле для данного вида анимации нет трудоемких задач для контроллера, отрисовка должна проходить быстро, а, значит, плавно.

👉 В следующий раз реализую анимацию пульсации, посмотрим, будет ли там плано изменяться радиус. Скорее всего, да. Но вернемся к разбору.

👉 Тут дело в разрешении самой RGB матрицы, а точнее в том, что слишком низкое разрешение для отображения инфо.
Основной метод, который использовался для отрисовки анимации, это

matrix.fillCircle(
int x, int y,
int radius,
uuint16_t color
);


👉 Из сигнатуры метода видно, что в качестве радиуса он принимает целое число. При очередных циклах отрисовки интерполятор при вычислении конкретного радиуса выдает разные float значения, которые несильно отличаются друг от друга, они часто приводятся в int в одно и то же число. Поэтому при отрисовке это выглядит так, что радиус не меняется.

👉 Нет плавности. Такие дела, но и на этом спасибо, все равно воткнуть в какой-нибудь проект можно.
👍1
День 15: Заметка 1: Сила маленьких привычек - Отжимания 💪

🤟 Хай, Кодерс!

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

🏃‍♀️ Можно ходить в зал - это очень хороший шаг в укреплении физической формы.
🏋️‍♂️ Поход в зал требует времени, мотивации; иногда с этим бывает проблема.

🤔 Размышляя на эту тему, я подумал о силе маленьких привычек.
Например, если делать тренировку отжиманий от пола дома 2-3 раза в день по 3-5 подходов, то можно
укрепить мышцы, силу и выносливость. При этом ничего кроме 10 минут на тренировку не надо.
Если это сделать привычкой и так тренироваться 1, 2, 3 месяца, то можно сильно укрепить физическую форму.

💪 Главное в тренировках - это регулярность, отслеживание прогресса и увеличение нагрузки.
В таком случае такими маленькими шагами можно частично решить проблему со спортом.

👉 Чтобы отжимания проходили более плодотворно, купил простой тренажер, который позволяет делать акцент на разные группы мышц: трицепс, дельты, списну, грудь (фото в следующем сообщении).
Вообщем отжимания могут идти интереснее, можно комбинировать варианты отжиманий или менять варианты тренировок по дням.

👉 10 минут жизни можно потратить по-разному.
Можно превратить эти 10 минут в привычку делать упражнения или можно просто ничего не делать.

👉 Выбор каждый делает сам.

🔗 Купил доску для отжиманий здесь, может кому-то будет полезным.

#Life
👍1
📷 Сила маленьких привычек - Отжимания 💪

Штука полезная, на мой взгляд
🔥1
Media is too big
VIEW IN TELEGRAM
День 16: Заметка 1: Solar System ☀️

🤟 Хай, Кодерс!

🤔 Сегодня утром подумал, что нужно срочно запрограммировать солнечную систему.
😎 Вы меня знаете. Сказано-сделано.

🎯 Итак, наша цель сделать анимацию солнечной системы ☀️, что для этого надо:
👉 создаем земной шар, подкрашиваем его в голубой цвет
👉 перемещаем Землю на свою орбиту в начальную точку
👉 создаем Солнце, то есть шар бОльшего радиуса, подкрашиваем в желтый

🤔 Это было easy, скажете вы, и я покорно приму это!
Что дальше? Вот:
👉 начинаем вращать Землю по своей орбите, да, задачка посложнее, тут нужна тригонометрия из школы, но она есть у меня!
👉 иногда подсвечиваем орбиту Земли, чтобы было наглядно, получается неплохо
👉 а что насчет Луны? она есть у меня тоже: создаем Луну рядом с Землей, подкрашиваем, начинаем вращать вокруг Земли и не забываем перемещать ее вслед за Землей, фух, справились, кажись!
👉 🍒 на торте: рандомно в пределах RGB матрицы рисуем звезды - подкрашиваем пиксели.

😎 Занавес.

#Arduino
🔥1