Загрузка данных


#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

#define OLED_CS     10
#define OLED_DC     9
#define OLED_RESET  8

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &SPI, OLED_DC, OLED_RESET, OLED_CS);

// Идеально ровная монета (13 символов в ширину, 8 строк в высоту)
// Каждая строка ровно 21 символ (для идеального центрирования на экране)
const char* coinFrames[8][8] = {
  // Кадр 0: Монета плашмя (круглая)
  {
    "       .-@@@-.       ",
    "     .:#@@@@@#:.     ",
    "    .:@@@@@@@@@:.    ",
    "    :@@@#@@@#@@@:    ",
    "    :@@@#@@@#@@@:    ",
    "    .:@@@@@@@@@:.    ",
    "     .:#@@@@@#:.     ",
    "       .-@@@-.       "
  },
  // Кадр 1: Легкий поворот
  {
    "        .-@@-.       ",
    "      .:##@@##:.     ",
    "     .:@@@@@@@@:.    ",
    "     :@@@#@@#@@@:    ",
    "     :@@@#@@#@@@:    ",
    "     .:@@@@@@@@:.    ",
    "      .:##@@##:.     ",
    "        .-@@-.       "
  },
  // Кадр 2: Сильный поворот
  {
    "         .-@-.       ",
    "       .:#@@@#:.     ",
    "      .:@@@@@@@:.    ",
    "      :@@@#@@@#:     ",
    "      :@@@#@@@#:     ",
    "      .:@@@@@@@:.    ",
    "       .:#@@@#:.     ",
    "         .-@-.       "
  },
  // Кадр 3: Почти ребро
  {
    "          .-.        ",
    "        .:@@@@:.     ",
    "        :@@@@@:      ",
    "        :@@#@@:      ",
    "        :@@#@@:      ",
    "        :@@@@@:      ",
    "        .:@@@@:.     ",
    "          .-.        "
  },
  // Кадр 4: Идеальное ребро (тонкая полоска)
  {
    "           .         ",
    "          :@:        ",
    "          :#:        ",
    "          :#:        ",
    "          :#:        ",
    "          :#:        ",
    "          :@:        ",
    "           .         "
  },
  // Кадр 5: Возврат (как 3)
  {
    "          .-.        ",
    "        .:@@@@:.     ",
    "        :@@@@@:      ",
    "        :@@#@@:      ",
    "        :@@#@@:      ",
    "        :@@@@@:      ",
    "        .:@@@@:.     ",
    "          .-.        "
  },
  // Кадр 6: Возврат (как 2)
  {
    "         .-@-.       ",
    "       .:#@@@#:.     ",
    "      .:@@@@@@@:.    ",
    "      :@@@#@@@#:     ",
    "      :@@@#@@@#:     ",
    "      .:@@@@@@@:.    ",
    "       .:#@@@#:.     ",
    "         .-@-.       "
  },
  // Кадр 7: Возврат (как 1)
  {
    "        .-@@-.       ",
    "      .:##@@##:.     ",
    "     .:@@@@@@@@:.    ",
    "     :@@@#@@#@@@:    ",
    "     :@@@#@@#@@@:    ",
    "     .:@@@@@@@@:.    ",
    "      .:##@@##:.     ",
    "        .-@@-.       "
  }
};

const int numFrames = 8;
int currentFrame = 0;
unsigned long lastUpdate = 0;
const int frameDelay = 80; // Скорость вращения

void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC)) {
    Serial.println(F("Ошибка SSD1306"));
    for(;;);
  }
  display.clearDisplay();
  display.setTextSize(1);      // Стандартный шрифт, чтобы все символы стояли ровно
  display.setTextColor(SSD1306_WHITE);
  display.setTextWrap(false);  // Отключаем перенос строк
}

void loop() {
  if (millis() - lastUpdate > frameDelay) {
    lastUpdate = millis();
    display.clearDisplay();
    
    // Выводим 8 строк строго по центру
    for (int i = 0; i < 8; i++) {
      display.setCursor(0, i * 8); // Координата X = 0, так как строки уже отцентрированы пробелами
      display.print(coinFrames[currentFrame][i]);
    }
    
    display.display();
    
    // Переход к следующему кадру
    currentFrame++;
    if (currentFrame >= numFrames) {
      currentFrame = 0;
    }
  }
}