#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SNOW_COUNT 20
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
RTC_DS3231 rtc;
// مختصات دونههای برف
int snowX[SNOW_COUNT];
int snowY[SNOW_COUNT];
void setup() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for (;;);
}
if (!rtc.begin()) {
for (;;);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// موقعیت اولیه دونههای برف
for (int i = 0; i < SNOW_COUNT; i++) {
snowX[i] = random(0, SCREEN_WIDTH);
snowY[i] = random(0, SCREEN_HEIGHT);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
}
void loop() {
DateTime now = rtc.now();
display.clearDisplay();
// نمایش ساعت
display.setTextSize(2);
display.setCursor(20, 20);
printTime(now);
// رسم برفها
for (int i = 0; i < SNOW_COUNT; i++) {
display.drawPixel(snowX[i], snowY[i], SSD1306_WHITE);
snowY[i] += 1; // پایین رفتن دونه
if (snowY[i] >= SCREEN_HEIGHT) {
snowY[i] = 0; // دوباره از بالا شروع شود
snowX[i] = random(0, SCREEN_WIDTH); // مکان X تصادفی
}
}
display.display();
delay(100);
}
void printTime(DateTime t) {
if (t.hour() < 10) display.print("0");
display.print(t.hour());
display.print(":");
if (t.minute() < 10) display.print("0");
display.print(t.minute());
display.print(":");
if (t.second() < 10) display.print("0");
display.print(t.second());
}