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

carlbeven 发表于 2021-11-8 21:00

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

本帖最后由 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 = {8, 8, 0, 0};//请修改灯板布局
/* 参数1:像素屏灯板的长度 灯珠像素
   参数2:像素屏灯板的宽度
   参数3:第一个(0号)灯珠在灯板最左侧第一列的
          上方:0
          下方:1
   参数4:像素屏灯板的布局,亮灯时确认:
          在新启第二列时折返:0    即S型
          所有灯珠都时往一个方向递增:1      即N型

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

Adafruit_NeoPixel pad = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);//创建对象,色序号GRB
uint16_t check = {0x4000, 0x2000, 0x1000, 0x800, 0x400, 0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1};
uint16_t digital = {0x7b6f, 0x74b2, 0x79cf, 0x73cf, 0x13ed, 0x73e7, 0x7be7, 0x124f, 0x7bef, 0x73ef};
uint16_t HEART = {0x2d9, 0x4dfa};
int getLEDS(int X, int Y)
{
// 第一象限
int pos;
if (layout == 0) //S
{
    if (layout == 0) //第一个灯珠在上方
    {
      if (X % 2 == 0)pos = (X + 1) * layout - 1 - Y;
      if (X % 2 != 0)pos = X* layout + Y;
    }
    if (layout == 1) //第一个灯珠在下方
    {
      if (X % 2 == 0)pos = X* layout + Y; //第一个灯珠在下方
      if (X % 2 != 0)pos = (X + 1)* layout - 1 - Y;
    }


}

if (layout == 1) //N
{
    if (layout == 0) //第一个灯珠在上方
    {
      pos = (X + 1) * layout - 1 - Y;

    }
    if (layout == 1) //第一个灯珠在下方
    {
      pos = X* layout + 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 & check)
    {
      if ((int(i / 3) + y_pos) < layout && (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 && (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 & check)
      {
      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();
    }

}

}




页: [1]
查看完整版本: ws2812+esp8266像素屏幕布局显示数字测试