- #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;
- }
- }