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]