|
本帖最后由 carlbeven 于 2021-11-8 21:03 编辑
本程序用于测试WS2812不同布局的像素屏幕显示,每个数字像素为3X5像素。
- /*像素屏布局测试,3X5像素数字像素显示
- QQ群913034979
- */
- #include <Adafruit_NeoPixel.h>
- #define PIN 5 /////ws2812 DAT 接的引脚编号,注意开发板不同,=====请更改=====
- #define NUMPIXELS 64 ////ws2812 灯数 =====请更改=====
- int layout[4] = {8, 8, 0, 0};//请修改灯板布局
- /* 参数1:像素屏灯板的长度 灯珠像素
- 参数2:像素屏灯板的宽度
- 参数3:第一个(0号)灯珠在灯板最左侧第一列的
- 上方:0
- 下方:1
- 参数4:像素屏灯板的布局,亮灯时确认:
- 在新启第二列时折返:0 即S型
- 所有灯珠都时往一个方向递增:1 即N型
- 例如一块长14灯珠像素 宽6灯珠像素的像素屏幕灯板 第一个灯珠在左侧上方 S型:
- int layout[4] = {14, 6, 0, 0};
- */
- Adafruit_NeoPixel pad = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);//创建对象,色序号GRB
- uint16_t check[15] = {0x4000, 0x2000, 0x1000, 0x800, 0x400, 0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1};
- uint16_t digital[10] = {0x7b6f, 0x74b2, 0x79cf, 0x73cf, 0x13ed, 0x73e7, 0x7be7, 0x124f, 0x7bef, 0x73ef};
- uint16_t HEART[2] = {0x2d9, 0x4dfa};
- int getLEDS(int X, int Y)
- {
- // 第一象限
- int pos;
- if (layout[3] == 0) //S
- {
- if (layout[2] == 0) //第一个灯珠在上方
- {
- if (X % 2 == 0)pos = (X + 1) * layout[1] - 1 - Y;
- if (X % 2 != 0)pos = X * layout[1] + Y;
- }
- if (layout[2] == 1) //第一个灯珠在下方
- {
- if (X % 2 == 0)pos = X * layout[1] + Y; //第一个灯珠在下方
- if (X % 2 != 0)pos = (X + 1) * layout[1] - 1 - Y;
- }
- }
- if (layout[3] == 1) //N
- {
- if (layout[2] == 0) //第一个灯珠在上方
- {
- pos = (X + 1) * layout[1] - 1 - Y;
- }
- if (layout[2] == 1) //第一个灯珠在下方
- {
- pos = X * layout[1] + Y;
- }
- }
- return pos;
- }
- void showDigital(int d, int x_pos, int y_pos, uint32_t digitalColor)
- {
- for (int i = 0; i < 15; i++)
- {
- if (digital[d] & check[i])
- {
- if ((int(i / 3) + y_pos) < layout[1] && (int(i / 3) + y_pos) > -1)pad.setPixelColor(getLEDS(i % 3 + x_pos, int(i / 3) + y_pos), digitalColor);
- }
- else
- {
- if ((int(i / 3) + y_pos) < layout[1] && (int(i / 3) + y_pos) > -1)pad.setPixelColor(getLEDS(i % 3 + x_pos, int(i / 3) + y_pos), pad.Color(0, 0, 0));
- }
- }
- }
- void showLOGO(uint16_t *logo, int index, int x_pos, int y_pos, uint32_t digitalColor)
- {
- for (int j = 0; j < index; j++)
- {
- for (int i = 0; i < 15; i++)
- {
- if (logo[j] & check[i])
- {
- pad.setPixelColor(getLEDS(i % 3 + x_pos + 3 * j, int(i / 3) + y_pos), digitalColor);
- }
- else
- {
- pad.setPixelColor(getLEDS(i % 3 + x_pos + 3 * j, int(i / 3) + y_pos), pad.Color(0, 0, 0));
- }
- }
- }
- }
- void setup() {
- // put your setup code here, to run once:
- Serial.begin(115200);
- pad.begin();
- pad.setBrightness(150);
- Serial.println("");
- Serial.println("灯珠将会逐个绿色点亮,请记住灯珠点亮的顺序逻辑,并比对布局修改上方的layout数组!");
- for (int k = 0; k < NUMPIXELS; k++)
- {
- pad.setPixelColor(k, pad.Color(0, 255, 0));
- pad.show();
- delay(100);
- }
- pad.clear();
- pad.show();
- }
- unsigned long lastTime;
- int count = 10;
- void loop() {
- if (millis() - lastTime > 1000)
- {
- pad.clear();
- pad.show();
- lastTime = millis();
- if (++count > 19)count = 0;
- if (count < 10)
- {
- pad.clear();
- pad.show();
- showLOGO(HEART, 2, count % 5, 0, pad.Color(255 - count, count, 0));
- pad.show();
- }
- else {
- showDigital((count / 10), 0, 0, pad.Color(0, 255, count));
- showDigital((count % 10), 3, 0, pad.Color(255 - count, count, 0));
- pad.show();
- }
- }
- }
复制代码
|
|