使用BPI-BIT开发板上的全彩LED矩阵实现数字灯


#1

前言

通过之前的学习,我们学会如何点亮BPI-BIT开发板上面的全彩LED矩阵,在本节中,我们利用之前学过的知识用全彩LED矩阵来制作从10~1的倒计时数字灯。

操作环境

  • 测试使用的开发板: bpi-bit v1.4
  • 应用到的外设: WS2812b
  • 测试使用的软件: vscode上的插件platformIO

代码示例

以上红框内的四个函数是我在main.cpp内封装好的函数,我们需要在<Arduino.h>文件中声明才能在主函数中使用。(函数的含义在代码中会解释)

#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#define PIN 4
Adafruit_NeoPixel strip = Adafruit_NeoPixel(25,PIN,NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.setBrightness(35);//设置亮度
  strip.show();
}

void loop() {
  for(int i=10;i>=1;i--)//循环控制全彩LED矩阵显示从数字10~1
  {
    Number(i);//Number()函数内的参数i表示LED矩阵显示的数字
    delay(1000);
    clean();//清屏
  }
  delay(1000);
}

void Led(int a,int b,int c,int d,int e )//控制每列小灯(总共五列)
{
  if(a==1)
  {
    for(int i =0;i<=4;i++)
    {
      Single(i);
      delay(20);
    }
  }
  if(b==1)
  {
    for(int i =5;i<=9;i++)
    {
      Single(i);
      delay(20);
    }
  }
  if(c==1)
  {
    for(int i =10;i<=14;i++)
    {
      Single(i);
      delay(20);
    }
  }
  if(d==1)
  {
    for(int i =15;i<=19;i++)
    {
      Single(i);
      delay(20);
    }
  }
  if(e==1)
  {
    for(int i =20;i<=24;i++)
    {
      Single(i);
      delay(20);
    }
  }
}

void Single(int x)//点亮小灯的函数
{
  strip.setPixelColor(x, 0,0,255);
  strip.show();
}

void Number(int y)//函数的形参为几,LED矩阵就显示数字几。
{
  switch(y)
  {
    case 10:
      Led(1,0,1,0,1);
      Single(5);
      Single(9);
      delay(20);
      break;
    case 9:
      Led(0,1,0,0,0);
      Single(10);
      Single(12);
      Single(14);
      Single(19);
      for(int i = 15;i<=17;i++)
      {
        Single(i);
      }
      delay(20);
      break;
    case 8:
      Led(0,1,0,1,0);
      Single(10);
      Single(12);
      Single(14);
      delay(20);
      break;
    case 7:
      Led(0,1,0,0,0);
      Single(10);
      Single(15);
      delay(20);
      break;
    case 6:
      Led(0,0,0,1,0);
      Single(5);
      Single(10);
      Single(12);
      Single(14);
      for(int i = 7;i<=9;i++)
      {
        Single(i);
      }
      delay(20);
      break;
    case 5:
      Number(6);
      strip.setPixelColor(18,0,0,0);
      strip.show();
      break;
    case 4:
      Led(0,0,1,0,0);
      for(int i=2;i<=22;i+=5)
      {
        Single(i);
      }
      Single(16);
      delay(20);
      break;
    case 3:
      Led(0,1,0,1,0);
      Single(10);
      Single(12);
      Single(14);
      strip.setPixelColor(16, 0,0,0);
      strip.setPixelColor(18, 0,0,0);
      strip.show();
      delay(20);
      break;
    case 2:
      Led(0,1,0,1,0);
      Single(10);
      Single(12);
      Single(14);
      delay(20);
      strip.setPixelColor(8, 0,0,0);
      strip.setPixelColor(16, 0,0,0);
      strip.show();
      break;
    case 1:
      Led(0,0,1,0,0);
      delay(20);
      break;
  }
}

void clean()//清屏
{
  for(int i = 0;i<=24;i++)
  {
    strip.setPixelColor(i, 0,0,0);
    strip.show();
  }
}

效果图