5.4 RGB彩灯

RGB像素灯珠串是非常有趣的一种输出,不仅可以用于照明和产生彩光,还能输出动态的流光溢彩的光效。

BlueFi的LCD屏幕上方有5颗RGB像素灯珠串,你可以利用他们产生各种有趣的光效,包括进度条、剩余电量、彩虹、流动的光等。整体亮度可编程, 每一个像素的颜色独立可编程。本节我们将掌握如何对这个灯珠串编程让他们产生绚丽的、运动的光效。

5.4.1 预设的彩灯动画

BlueFi上有5颗RGB像素灯珠,能够产生多种静态或动态的彩光效果。在BlueFi上我们已经预制了4种动态的彩光效果, 你只需要给定他们的的显示时间,即可产生动态彩光效果。在BlueFi上运行下面示例程序,你将看到4种光效:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import time
from hiibot_bluefi.basedio import NeoPixel
pixels = NeoPixel()
pixels.brightness = 0.3
while True:
    print("show rainbow")
    pixels.showAnimation_rainbow(4)
    pixels.clearPixels()
    time.sleep(1)
    print("show stars")
    pixels.showAnimation_star(4)
    print("show comet")
    pixels.showAnimation_comet(4)
    pixels.clearPixels()
    time.sleep(1)
    print("show wipe")
    pixels.showAnimation_wipe(4)
    pixels.clearPixels()
    time.sleep(1)

运行这个示例程序时,如果你的环境光较暗,可以调低RGB像素灯珠的亮度,即减小程序的第4行等号右边的值,避免眼睛盯着非常明亮的光源。

下面是代码分析:

  • 第1行,导入一个Python内建的模块“time”。
  • 第2行,从“/CIRCUITPY/lib/hiibot_bluefi/basedio.py”模块中导入一个名叫“NeoPixel”的类。
  • 第3行,将导入的“NeoPixel”类实例化为一个实体对象,名叫“pixels”。
  • 第4行,设置pixels的brightness属性(即RGB像素彩灯的整体亮度)为0.3,合理取值范围:0.05 ~ 1.0(亮度最大)。
  • 第5行,开始一个无穷循环的程序块。
  • 第6行,(无穷循环程序块的第1行),在LCD屏幕(控制台)上显示字符串“show rainbow”。
  • 第7行,(无穷循环程序块的第2行),调用pixels的函数showAnimation_rainbow显示动态彩虹光效,并持续时间参数设为4秒。
  • 第8行,(无穷循环程序块的第3行),调用pixels的函数clearPixels,清除所有像素的颜色(即关闭彩灯)。
  • 第9行,(无穷循环程序块的第4行),执行time的sleep方法,参数为1秒。
  • 第10行,(无穷循环程序块的第5行),在LCD屏幕(控制台)上显示字符串“show star”。
  • 第11行,(无穷循环程序块的第6行),调用pixels的函数showAnimation_star显示星星眨眼光效,持续时间参数设为4秒。
  • 第12行,(无穷循环程序块的第7行),在LCD屏幕(控制台)上显示字符串“show comet”。
  • 第13行,(无穷循环程序块的第8行),调用pixels的函数showAnimation_comet显示彗星掠过光效,持续时间参数设为4秒。
  • 第14行,(无穷循环程序块的第9行),调用pixels的函数clearPixels,清除所有像素的颜色(即关闭彩灯)。
  • 第15行,(无穷循环程序块的第10行),执行time的sleep方法,参数为1秒。
  • 第16行,(无穷循环程序块的第11行),在LCD屏幕(控制台)上显示字符串“show wipe”。
  • 第17行,(无穷循环程序块的第12行),调用pixels的函数showAnimation_wipe显示进度条光效,持续时间参数设为4秒。
  • 第18行,(无穷循环程序块的第13行),调用pixels的函数clearPixels,清除所有像素的颜色(即关闭彩灯)。
  • 第19行,(无穷循环程序块的第14行),执行time的sleep方法,参数为1秒。

我们所谓预制的光效,实际上是我们对BlueFi的每一个RGB像素灯珠的颜色进行编程,并通过移位实现动态光效, 每一种光效我们在NeoPixel类中定义一个对应的接口(函数),使用时只需调用对应的函数,并指定持续显示光效时间长度即可。 你可以参考这个类中的这些接口设计更多种光效程序模块,用import的方法导入自己的其他Python程序中使用。

5.4.2 自制灯光效果

除了使用模块中已有的彩灯动画之外,我们也可以自定义RGB彩灯的颜色和显示时间,从而实现自制的灯光效果。

下面我们使用Python语言的列表(list)型变量定义BlueFi的5个RGB像素灯珠的颜色列表,然后显示出来,并逐位移动他们,产生自定义的光效。 示例程序如下:

1
2
3
4
5
6
7
8
9
import time
from hiibot_bluefi.basedio import NeoPixel
pixels = NeoPixel()
pixels.brightness = 0.2
colors = [ (255,0,0), (127,127,0), (0,255,0), (0,127,127), (0,0,255) ]
pixels.drawPattern(colors)
while True:
    pixels.shiftRight()
    time.sleep(0.2)

这个程序是不是很眼熟,是的,这个程序与4.2节中讲解列表方法所用到的程序是类似的。在4.2节中只是对colors列表做了介绍, 而在本节中将会对其余代码做详细介绍:

  • 第1行,导入一个Python内建的模块“time”
  • 第2行,从“/CIRCUITPY/lib/hiibot_bluefi/basedio.py”模块中导入一个名叫“NeoPixel”的类
  • 第3行,将导入的“NeoPixel”类实例化为一个实体对象,名叫“pixels”
  • 第4行,设置pixels的brightness属性(即RGB像素彩灯的整体亮度)为0.2,合理取值范围:0.05(亮度最小)~1.0(亮度最大)
  • 第5行,定义一个颜色列表变量,变量名叫colors,含5个元组型变量分别指定每个像素的三基色
  • 第6行,调用pixels的函数drawPattern,并将颜色列表colors作为输入参数,在BlueFi显示出5种颜色
  • 第7行,开始一个无穷循环的程序块
  • 第8行(无穷循环程序块的第1行),调用pixels的函数shiftRight,让5个RGB像素灯珠的颜色循环右移一次
  • 第9行(无穷循环程序块的第4行),执行time的sleep方法,参数为0.2秒,即系统空操作0.2秒

虽然使用颜色列表和三基色元组定义自制图案非常方便,只需要用colors单个变量就可以把整个彩色图案传给pixels的函数drawPattern, 当然这不是惟一的方法,信息的组织和结构定义始终是计算机科学领域的一项持续研究的、不断进步的工作,随着我们的信息量越来越大、 信息结构越来越复杂,我们就需要更高效的信息组织和结构方法。

你可以使用pixels的shiftLeft函数让彩色图案左移,试一试并观察左移和右移的效果。现在我们每次只是移动1位, 你能自己编写程序实现每次移动2位或更多位吗?

5.4.3 更多的RGB灯珠

有时你需要更多个RGB像素灯珠,BlueFi的5个灯珠完全不够你使用,怎么办?

BlueFi支持你自购兼容WS2812B的RGB像素灯珠串,并准备烙铁、焊锡丝、彩色电线、3.3V/5V直流电源等辅材, 自己动手很容易将自购的彩灯串接入BlueFi,使用上面相同示例程序控制更多彩灯串产生绚丽多彩的光效。自购RGB像素灯珠时, 务必注意需要兼容WS2812B型灯珠,工作电压必须兼容5V和3.3V!

如果使用BlueFi的3V和Gnd输出的3.3V电源为自购灯珠供电,你还需要用到鳄鱼夹电线等辅材。当我们把电路单元连接妥当之后, 我们使用下面示例程序控制这些彩灯产生特定光效:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import time
from hiibot_bluefi.basedio import NeoPixel
pixels = NeoPixel(numPixels=5+10)
pixels.brightness = 0.3
while True:
    print("show rainbow")
    pixels.showAnimation_rainbow(4)
    pixels.clearPixels()
    time.sleep(1)
    print("show stars")
    pixels.showAnimation_star(4)
    print("show comet")
    pixels.showAnimation_comet(4)
    pixels.clearPixels()
    time.sleep(1)
    print("show wipe")
    pixels.showAnimation_wipe(4)
    pixels.clearPixels()
    time.sleep(1)

这不就是本节的第一个示例程序吗!不完全是,我们只是修改了第3行程序,即实例化NeoPixel类的方法略作修改。 原来的实例化方法是“pixels = NeoPixel()”,修改后的实例化方法是“pixels = NeoPixel(numPixels=5+10)”。修改实例化方法的目的是, 指定灯珠串上灯珠的个数为“5+10”。假设你额外级连了10个兼容WS2812B的RGB像素灯珠,加上BlueFi固有的5个,总计15个像素灯珠, 把这个数值赋给NeoPixel类的变量numPixels。

也就是说,实例化NeoPixel类的时候不指定类成员变量numPixels的值,默认为5,当我们额外级连了10个灯珠,就需要指定该变量为15。 NeoPixel类的其他变量、属性和接口函数的用法不变。

当然,在“basedio”模块的“NeoPixel”类中对于RGB灯珠还用很多函数接口,你可以在REPL中输入help(NeoPixel)查看它的所有接口。