ws2812+esp8266像素屏幕布局显示数字测试-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1401|回复: 0

ws2812+esp8266像素屏幕布局显示数字测试

[复制链接]
发表于 2021-11-8 21:00 | 显示全部楼层 |阅读模式
本帖最后由 carlbeven 于 2021-11-8 21:03 编辑

IMG_12843.jpg
本程序用于测试WS2812不同布局的像素屏幕显示,每个数字像素为3X5像素。
  1. /*像素屏布局测试,3X5像素数字像素显示
  2.    QQ群913034979
  3. */

  4. #include <Adafruit_NeoPixel.h>
  5. #define PIN              5                       /////ws2812 DAT 接的引脚编号,注意开发板不同,=====请更改=====
  6. #define NUMPIXELS      64                          ////ws2812 灯数  =====请更改=====

  7. int layout[4] = {8, 8, 0, 0};//请修改灯板布局
  8. /* 参数1:像素屏灯板的长度 灯珠像素
  9.    参数2:像素屏灯板的宽度
  10.    参数3:第一个(0号)灯珠在灯板最左侧第一列的
  11.           上方:0
  12.           下方:1
  13.    参数4:像素屏灯板的布局,亮灯时确认:
  14.           在新启第二列时折返:0    即S型
  15.           所有灯珠都时往一个方向递增:1        即N型

  16.   例如一块长14灯珠像素 宽6灯珠像素的像素屏幕灯板  第一个灯珠在左侧上方 S型:
  17.   int layout[4] = {14, 6, 0, 0};
  18. */

  19. Adafruit_NeoPixel pad = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);//创建对象,色序号GRB
  20. uint16_t check[15] = {0x4000, 0x2000, 0x1000, 0x800, 0x400, 0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1};
  21. uint16_t digital[10] = {0x7b6f, 0x74b2, 0x79cf, 0x73cf, 0x13ed, 0x73e7, 0x7be7, 0x124f, 0x7bef, 0x73ef};
  22. uint16_t HEART[2] = {0x2d9, 0x4dfa};
  23. int getLEDS(int X, int Y)
  24. {
  25.   // 第一象限
  26.   int pos;
  27.   if (layout[3] == 0) //S
  28.   {
  29.     if (layout[2] == 0) //第一个灯珠在上方
  30.     {
  31.       if (X % 2 == 0)pos = (X + 1) * layout[1] - 1 - Y;
  32.       if (X % 2 != 0)pos = X  * layout[1] + Y;
  33.     }
  34.     if (layout[2] == 1) //第一个灯珠在下方
  35.     {
  36.       if (X % 2 == 0)pos = X  * layout[1] + Y; //第一个灯珠在下方
  37.       if (X % 2 != 0)pos = (X + 1)  * layout[1] - 1 - Y;
  38.     }


  39.   }

  40.   if (layout[3] == 1) //N
  41.   {
  42.     if (layout[2] == 0) //第一个灯珠在上方
  43.     {
  44.       pos = (X + 1) * layout[1] - 1 - Y;

  45.     }
  46.     if (layout[2] == 1) //第一个灯珠在下方
  47.     {
  48.       pos = X  * layout[1] + Y;
  49.     }
  50.   }
  51.   return pos;
  52. }



  53. void showDigital(int d, int x_pos, int y_pos, uint32_t digitalColor)
  54. {


  55.   for (int i = 0; i < 15; i++)
  56.   {
  57.     if (digital[d] & check[i])
  58.     {
  59.       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);
  60.     }
  61.     else
  62.     {
  63.       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));
  64.     }
  65.   }
  66. }


  67. void showLOGO(uint16_t *logo, int index, int x_pos, int y_pos, uint32_t digitalColor)
  68. {
  69.   for (int j = 0; j < index; j++)
  70.   {
  71.     for (int i = 0; i < 15; i++)
  72.     {
  73.       if (logo[j] & check[i])
  74.       {
  75.         pad.setPixelColor(getLEDS(i % 3 + x_pos + 3 * j, int(i / 3) + y_pos), digitalColor);

  76.       }
  77.       else
  78.       {
  79.         pad.setPixelColor(getLEDS(i % 3 + x_pos + 3 * j, int(i / 3) + y_pos), pad.Color(0, 0, 0));
  80.       }
  81.     }

  82.   }

  83. }

  84. void setup() {
  85.   // put your setup code here, to run once:
  86.   Serial.begin(115200);
  87.   pad.begin();
  88.   pad.setBrightness(150);
  89.   Serial.println("");
  90.   Serial.println("灯珠将会逐个绿色点亮,请记住灯珠点亮的顺序逻辑,并比对布局修改上方的layout数组!");
  91.   for (int k = 0; k < NUMPIXELS; k++)
  92.   {
  93.     pad.setPixelColor(k, pad.Color(0, 255, 0));
  94.     pad.show();
  95.     delay(100);
  96.   }
  97.   pad.clear();
  98.   pad.show();
  99. }

  100. unsigned long lastTime;
  101. int count = 10;


  102. void loop() {
  103.   if (millis() - lastTime > 1000)
  104.   {
  105.     pad.clear();
  106.     pad.show();
  107.     lastTime = millis();
  108.     if (++count > 19)count = 0;
  109.     if (count < 10)
  110.     {

  111.       pad.clear();
  112.       pad.show();
  113.       showLOGO(HEART, 2, count % 5, 0, pad.Color(255 - count, count, 0));
  114.       pad.show();
  115.     }
  116.     else {

  117.       showDigital((count / 10), 0, 0, pad.Color(0, 255, count));
  118.       showDigital((count % 10), 3, 0, pad.Color(255 - count, count, 0));
  119.       pad.show();
  120.     }

  121.   }

  122. }
复制代码





您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 10:46 , Processed in 0.092026 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表