Салют на TFT дисплее и Arduino Uno

Всем привет!
В этой статье я расскажу, как сделать интересный проект на Arduino — праздничный салют, отображающийся на цветном TFT дисплее с контроллером ST7735.
Скетч для проекта скопируйте ниже. Вставьте этот код в новый файл в Arduino IDE, сохраните в формате INO, загрузите в плату. Подойдёт любая плата с как минимум одним интерфейсом SPI (самые популярные ардуинки — Uno, Nano, Mega и ESP платы).
Дополнительные библиотеки устанавливать не потребуется — библиотеки для TFT дисплея 1.8 дюйма и интерфейса SPI уже встроены в IDE.
Код для Arduino IDE:
#include <TFT.h> // Подключаем библиотеку TFT
#include <SPI.h> // Библиотека для работы с SPI
// Настройки для экрана
#define CS 10
#define DC 9
#define RST 8
// Пин для пищалки. Если не хотите, можете не подключать пищалку, не обязательно подключать
#define BUZZ 3
TFT myScreen = TFT(CS, DC, RST); // Создаём объект экрана
// Цвета
int R;
int G;
int B;
void setup() {
pinMode(BUZZ, OUTPUT);
// Инициализация экрана
myScreen.begin();
myScreen.background(0, 0, 0); // Чёрный фон
}
void loop() {
// Запускаем анимацию салюта
for (int i = 0; i < 10; i++) { // 10 "залпов" салюта
drawFirework(random(20, 108), random(20, 80)); // Случайные координаты и цвет
delay(500); // Пауза между залпами
}
myScreen.background(0, 0, 0); // Очищаем экран после салюта
delay(1000); // Пауза перед следующим салютом
}
// Функция для рисования одного "залпа" салюта
void drawFirework(int x, int y) {
// Генерируем цвет салюта
R = random(0, 255);
G = random(0, 255);
B = random(0, 255);
// Взлёт снаряда
for (int flight = 128; flight > y; flight = flight - 10){
myScreen.fill(R, G, B);
myScreen.stroke(R, G, B);
myScreen.circle(x, flight, 2);
delay(1);
myScreen.background(0, 0, 0);
}
// Звук взрыва
tone(BUZZ, 100, 100);
// Взрыв
for (int r = 1; r < random(30, 40); r++) {
R = R - 10;
G = G - 10;
B = B - 10;
myScreen.stroke(R, G, B);
myScreen.noFill();
myScreen.circle(x, y, r); // Рисуем расширяющийся круг
delay(10);
}
// Исчезающие частицы
myScreen.fill(0, 0, 0);
for (int i = 0; i < 400; i++) {
int px = x + random(-40, 40);
int py = y + random(-40, 40);
int px2 = x + random(-40, 40);
int py2 = y + random(-40, 128);
myScreen.stroke(0, 0, 0);
myScreen.circle(px, py, 1); // Рисуем случайные точки
myScreen.stroke(55, 155, 255);
myScreen.circle(px2, py2, 1); // Рисуем случайные точки
}
delay(100);
// Очистка экрана
myScreen.background(0, 0, 0);
}
Схема подключения такая:

Если будете подключать пищалку-зуммер, тогда вот такая схема:

Проект проверен на практике, видео демонстрация работы проекта:
Поддержать автора проекта можно донатом на Rutube по кнопке «Поддержать» (минимум 10 руб. России).
Спасибо за поддержку =)