#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
// Пин подключения к TFT
#define TFT_CLK 13
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
const int N = 20;
const int M = 30;
int snow[N][M];
void generate_snows(int n, int m){
for (int i = 0; i < n; i += 1){
for (int j = 0; j < m; j += 1){
snow[i][j] = 0;
}
}
int cnt = 0;
int k = random(5, n);
while (cnt + k < m){
int snow_size = k / 2 * 2 + 1;
int s[snow_size][snow_size];
if (k % 2 == 0){
int a = snow_size;
for (int i = 0; i < a; i ++){
for (int j = 0; j < a; j ++){
s[i][j] = 0;
}
}
for (int i = 0; i < a; i ++){
s[i][i] = 1;
s[i][a - 1 - i] = 1;
s[i][(a - 1) / 2] = 1;
s[(a - 1) / 2][i] = 1;
}
}
else {
int a = snow_size;
for (int i = 0; i < a; i ++){
for (int j = 0; j < a; j ++){
s[i][j] = 0;
}
}
for (int i = 0; i < a; i ++){
s[i][(a - 1) / 2] = 1;
s[(a - 1) / 2][i] = 1;
}
for (int r = (a - 1) / 2; r >= 0; r -= 2){
int cnt1 = (a - 1) / 2;
int cnt2 = (a - 1) / 2;
for (int i = r; i <= (a - 1) / 2; i ++){
s[i][cnt1] = 1;
s[i][cnt2] = 1;
s[a - 1 - i][cnt1] = 1;
s[a - 1 - i][cnt2] = 1;
cnt1 += 1;
cnt2 -= 1;
}
}
}
int place = random(0, n - k);
for (int i = place; i < place + snow_size; i += 1){
for (int j = cnt; j < cnt + snow_size; j += 1){
snow[i][j] = s[i - place][j - cnt];
}
}
cnt += snow_size;
k = random(5, n);
}
}
void drawSnowflake() {
tft.fillScreen(ILI9341_BLACK); // Очистить экран
generate_snows(N, M);
int centerX = (tft.width() - M) / 2;
int centerY = (tft.height() - N) / 2;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (snow[i][j] == 1) {
tft.drawPixel(centerX + j, centerY + i, ILI9341_WHITE);
}
}
}
}
// void setup() {
// // put your setup code here, to run once:
// Serial.begin(9600);
// generate_snows(N, M);
// for (int i = 0; i < N; i += 1){
// for (int j = 0; j < M; j += 1){
// Serial.print(snow[i][j]);
// delay(200);
// }
// Serial.println("");
// delay(200);
// }
// delay(300);
// }
void setup() {
Serial.begin(9600);
tft.begin();
tft.setRotation(1); // Повернуть дисплей, если нужно
drawSnowflake();
}
void loop() {
delay(100);
drawSnowflake();
}