#include <FastLED.h>
#define LED_PIN 15
#define COLOR_ORDER GRB
#define CHIPSET WS2815
#define NUM_LEDS 450
CRGB leds[NUM_LEDS];
#define MATRIX_WIDTH 30
#define MATRIX_HEIGHT 15
#define BITMAP_WIDTH 96
#define BITMAP_INDEX(x,y) ((14-y)*12 + (x/8) - 1)
#define BITMMAP_POSITION(x) (x%8)
// 颜色定义
const CRGB BACKGROUND_COLOR = CRGB(0x0, 0x0, 0x100); //
const CRGB TEXT_COLOR = CRGB(0xFF, 0x0, 0x00); //
// 点阵数据(已转换格式)
/*96 x 15*/
static const unsigned char textBitmap[] = {
0x33, 0xfc, 0x08, 0x80, 0x11, 0x00, 0x1f, 0xf0, 0x10, 0x40, 0x00, 0xf0,
0x13, 0xfc, 0x08, 0x80, 0x11, 0x00, 0x1f, 0xf0, 0x10, 0x40, 0x1f, 0xf0,
0xfa, 0x04, 0x19, 0xfe, 0x11, 0x00, 0x10, 0x10, 0x13, 0xf8, 0x1f, 0x00,
0xfa, 0x04, 0x11, 0xfe, 0x3f, 0xfc, 0x10, 0x10, 0x1b, 0xf8, 0x11, 0x00,
0x1a, 0x04, 0x33, 0x06, 0x3f, 0xfc, 0x10, 0x10, 0x5c, 0x48, 0x31, 0x00,
0x13, 0xfc, 0x36, 0x24, 0x61, 0x00, 0x10, 0x10, 0x54, 0x48, 0x21, 0x00,
0x3b, 0xfc, 0x74, 0x20, 0xc1, 0x00, 0x1f, 0xf0, 0x50, 0x48, 0x3f, 0xfc,
0x7c, 0x90, 0xd1, 0x28, 0x81, 0x00, 0x1f, 0xf0, 0xd7, 0xfe, 0x3f, 0xfc,
0xd4, 0x90, 0x91, 0x2c, 0x3f, 0xf8, 0x10, 0x10, 0x97, 0xfe, 0x09, 0x20,
0x94, 0x90, 0x13, 0x24, 0x3f, 0xf8, 0x10, 0x10, 0x10, 0xe0, 0x09, 0x30,
0x11, 0x92, 0x12, 0x26, 0x01, 0x00, 0x10, 0x10, 0x10, 0xa0, 0x19, 0x18,
0x11, 0x12, 0x16, 0x22, 0x01, 0x00, 0x10, 0x10, 0x11, 0xb0, 0x31, 0x0c,
0x13, 0x12, 0x14, 0x22, 0x01, 0x00, 0x10, 0x10, 0x11, 0x10, 0x61, 0x04,
0x16, 0x1e, 0x10, 0xa0, 0xff, 0xfe, 0x1f, 0xf0, 0x13, 0x18, 0x45, 0x04,
0x1c, 0x0e, 0x10, 0xe0, 0xff, 0xfe, 0x1f, 0xf0, 0x16, 0x0e, 0x07, 0x00
};
int scrollOffset = 0;
// 蛇形布局坐标转换
int getLedIndex(int x, int y) {
if (x < 0 || x >= MATRIX_WIDTH || y < 0 || y >= MATRIX_HEIGHT) return -1;
if (y % 2 == 0) return y * MATRIX_WIDTH + x;
else return y * MATRIX_WIDTH + (MATRIX_WIDTH - 1 - x);
}
void setup() {
FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(50);
}
void loop() {
static unsigned long lastUpdate = 0;
if (millis() - lastUpdate > 100) {
lastUpdate = millis();
fill_solid(leds, NUM_LEDS, BACKGROUND_COLOR);
for (int x = 0; x < MATRIX_WIDTH; x++) {
int bitmapX = (scrollOffset + x) % BITMAP_WIDTH;
for (int y = 0; y < MATRIX_HEIGHT; y++) {
if ((textBitmap[BITMAP_INDEX(bitmapX,y)] << BITMMAP_POSITION(bitmapX)) &0x80) {
int ledIndex = getLedIndex(x, y);
if (ledIndex != -1) leds[ledIndex] = TEXT_COLOR;
}
}
}
FastLED.show();
scrollOffset = (scrollOffset + 1) % BITMAP_WIDTH;
}
}