Загрузка данных
#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;
}
}
}