Найти в Дзене

❤️ Светодиодное сердце на Arduino: проект с романтикой и кодом

Когда кто-то говорит «электроника — это скучно», мы достаём Arduino и светодиодную матрицу, нажимаем «Upload» — и на экране загорается сердце. Красное. Мерцающее. Живущее. И, возможно, даже чуть влюблённое.
Сегодня сделаем проект, в котором техника буквально пульсирует чувствами. 🧩 В главных ролях: Мы создадим красное пиксельное сердце, которое будет биться — словно в груди у вашей Arduino. Это не просто картинка — это сердцебиение. Плавно загорается, гаснет, делает паузу и снова бьётся. Да, техника тоже может быть трогательной. Матрица состоит из 64 светодиодов (8×8), каждый из которых можно включать по отдельности. Мы "рисуем" сердце в массиве heart[8][8], а потом подсвечиваем нужные пиксели красным цветом, изменяя яркость по синусоиде (ну почти). Сердце "бьётся" за счёт плавного увеличения и уменьшения яркости. Полный код для копирования будет в конце. #include <Adafruit_NeoPixel.h> Подключаем библиотеку для управления светодиодами WS2812B. Без неё управлять такой матрицей — как
Оглавление

Когда кто-то говорит «электроника — это скучно», мы достаём Arduino и светодиодную матрицу, нажимаем «Upload» — и на экране загорается сердце. Красное. Мерцающее. Живущее. И, возможно, даже чуть влюблённое.

Сегодня сделаем проект, в котором техника буквально
пульсирует чувствами.

🧩 В главных ролях:

  • Светодиодная матрица 8×8 на WS2812B
  • Arduino Uno
  • Немного кода, капелька терпения и щепотка романтики

💓 Что будет?

Мы создадим красное пиксельное сердце, которое будет биться — словно в груди у вашей Arduino. Это не просто картинка — это сердцебиение. Плавно загорается, гаснет, делает паузу и снова бьётся. Да, техника тоже может быть трогательной.

🧠 Принцип работы

Матрица состоит из 64 светодиодов (8×8), каждый из которых можно включать по отдельности. Мы "рисуем" сердце в массиве heart[8][8], а потом подсвечиваем нужные пиксели красным цветом, изменяя яркость по синусоиде (ну почти).

Сердце "бьётся" за счёт плавного увеличения и уменьшения яркости.

💡 Код с объяснениями

Полный код для копирования будет в конце.

#include <Adafruit_NeoPixel.h>

Подключаем библиотеку для управления светодиодами WS2812B. Без неё управлять такой матрицей — как признаваться в чувствах на ассемблере. Мучительно.

#define PIN 7
#define NUMPIXELS 64

Указываем пин подключения матрицы (у нас это D7) и общее число пикселей (8×8 = 64).

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

Создаём объект strip, через который будем управлять светодиодами.

❤️ Массив heart

int getPixelIndex(int x, int y) {
if (y % 2 == 0) return y * 8 + x;
else return y * 8 + (7 - x);
}

Наша матрица — змейка 🐍. Сначала идут пиксели слева направо, потом справа налево. Эта функция переводит координаты (x, y) в нужный номер светодиода, с учётом этого хитрого порядка.

void setup() {
strip.begin();
strip.show();
}

Инициализация матрицы. Обязательная часть первого свидания с железом.

void loop() {
heartbeat(255, 20);
delay(100);
heartbeat(180, 25);
delay(500);
}

Имитация двух ударов сердца: первый — мощный, второй — помягче. После этого — пауза. Цикл повторяется бесконечно, как плейлист грустных песен.

🫀 Сердцебиение

void heartbeat(int maxBrightness, int stepDelay) {
for (int b = 10; b <= maxBrightness; b += 10) {
drawHeart(b);
delay(stepDelay);
}
for (int b = maxBrightness; b >= 10; b -= 10) {
drawHeart(b);
delay(stepDelay);
}
}

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

✍️ Рисуем сердце

void drawHeart(int brightness) {
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 8; x++) {
int pixel = getPixelIndex(x, y);
if (heart[y][x]) {
strip.setPixelColor(pixel, strip.Color(brightness, 0, 0));
} else {
strip.setPixelColor(pixel, 0);
}
}
}
strip.show();
}

Проходим по каждому пикселю. Если в массиве 1 — зажигаем его красным. Если 0 — выключаем. Цвет создаём с помощью RGB: (яркость, 0, 0) — это чистый красный.

Выбираем нашу плату:

Выбор платы
Выбор платы

Любуемся результатом.

Подключение
Подключение

В темноте еще прекраснее...

Результат
Результат

💬 Заключение

Иногда достаточно одного пина и 64 светодиодов, чтобы сказать "я тебя люблю". Ну или хотя бы: я умею программировать матрицу, и это круто.

Пусть техника вдохновляет вас — и пульсирует с правильной частотой ❤️‍🔥

Полный код:

#include <Adafruit_NeoPixel.h>

#define PIN 7

#define NUMPIXELS 64

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

byte heart[8][8] = {

{0, 1, 0, 0, 0, 0, 1, 0},

{1, 1, 1, 0, 0, 1, 1, 1},

{1, 1, 1, 1, 1, 1, 1, 1},

{1, 1, 1, 1, 1, 1, 1, 1},

{0, 1, 1, 1, 1, 1, 1, 0},

{0, 0, 1, 1, 1, 1, 0, 0},

{0, 0, 0, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0}

};

int getPixelIndex(int x, int y) {

if (y % 2 == 0) return y * 8 + x;

else return y * 8 + (7 - x);

}

void setup() {

strip.begin();

strip.show();

}

void loop() {

heartbeat(255, 20);  // Первый удар — сильный, быстрый

delay(100);

heartbeat(180, 25);  // Второй удар — чуть мягче

delay(500);          // Пауза между "циклами сердцебиения"

}

void heartbeat(int maxBrightness, int stepDelay) {

for (int b = 10; b <= maxBrightness; b += 10) {

drawHeart(b);

delay(stepDelay);

}

for (int b = maxBrightness; b >= 10; b -= 10) {

drawHeart(b);

delay(stepDelay);

}

}

void drawHeart(int brightness) {

for (int y = 0; y < 8; y++) {

for (int x = 0; x < 8; x++) {

int pixel = getPixelIndex(x, y);

if (heart[y][x]) {

strip.setPixelColor(pixel, strip.Color(brightness, 0, 0));

} else {

strip.setPixelColor(pixel, 0);

}

}

}

strip.show();

}