【得捷电子Follow me第2期】任务3:控制WS2812B
[复制链接]
本帖最后由 walker2048 于 2023-10-2 13:44 编辑
CircuitPython点灯非常简单
adafruit_led_animation库是一个用于控制LED动态效果的库,它有以下优势:
- 易于使用:这个库旨在提供用户友好的接口,使开发人员能够轻松创建各种LED动态效果,而无需深入了解底层硬件细节。
- 跨平台兼容性:该库可以在多种CircuitPython支持的硬件平台上使用,包括微控制器和开发板。这种通用性使得可以在不同的项目和硬件上重用你的LED动画代码。
- 丰富的示例:Adafruit社区提供了大量的示例代码,展示了如何使用这个库来创建各种LED动画效果。这些示例可以作为学习和项目开发的起点。
- 灵活性:库支持多种LED控制方式,包括单色LED、RGB LED和Neopixel LED。这意味着你可以使用不同类型的LED灯条和矩阵来实现各种效果。
- 可定制性:你可以根据自己的需求轻松自定义LED动画效果,包括颜色、速度、亮度和模式等参数。
支持的动态效果
adafruit_led_animation库自带了以下的动态效果,大概介绍一下就是
- blink 闪烁
- chase(追逐) 实际上就是流水灯效果
- CustomColorChase 自定义流水灯
- Color 颜色渐变效果
- Comet 彗星效果
- MulticolorComet 多色彗星效果
- Rain 雨滴效果
- Pulse 脉动效果
- Rainbow 彩虹效果(彩虹流水灯、彩虹彗星、彩虹闪烁等拓展)
- Sparkle 闪烁效果(还有闪烁脉动拓展)
- Volume 音量效果
blink库实战
由于本次活动的开发板子上只有一个ws2812灯,作为入门学习,也没必要了解这么多的动效。所以本次也只学习如何使用blink库。 要使用库,就得先导入库。看一下代码:
-
- import board
-
- import time
-
- from digitalio import DigitalInOut, Direction, Pull
-
- import neopixel
-
- from adafruit_led_animation.animation.blink import Blink
-
- from adafruit_led_animation.color import JADE, BLACK, ORANGE, GOLD, OLD_LACE
这里有两种不同的导入方式,第一种就是import board, 意思是导入board模块,完整调用board这个模块,然后可以使用这个模块提供的所有功能。需要使用对应实例或者函数的时候,就得这样用,例如board.NEOPIXEL。 第二种from adafruit_led_animation.color import JADE, BLACK, ORANGE, GOLD, OLD_LACE,意思是从adafruit_led_animation.color模块里导入JADE, BLACK, ORANGE, GOLD, OLD_LACE这几个符号,其他的不导入,不导入的自然就不能使用了。 通过阅读adafruit_led_animation.color的源码,可以了解到,这几个符号都是不同颜色元组,也可以理解成led灯的颜色。 只导入部分内容,并不会节省内存或者提高执行效率,只是可以少打点字,让代码更清晰罢了。例如现在使用JADE颜色只需要打JADE就可以了。
库导入了,就接下来就应该初始化引脚和像素灯实例了
-
- pixel_pin = board.NEOPIXEL
-
- num_pixels = 1
-
- pixels = neopixel.NeoPixel(
- pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=neopixel.GRB
- )
-
- blink = Blink(pixels, speed=0.5, color=BLACK)
由于这个板子是CircuitPython官方支持的板子,在固件里就固化了板载像素灯和屏幕实例。 我们的代码可以使用board.NEOPIXEL来给引脚赋值,由于板载只有1个像素灯,所以灯的数量也只设置成1。 初始化pixels,是使用了neopixel库的NeoPixel函数来初始化,亮度设置为20%。 NeoPixel函数的第一个参数pixel_pin是像素灯的数据引脚,第二个参数num_pixels是像素灯的数量,第三个参数brightness是像素灯的亮度,第四个参数auto_write是配置是否直接刷新数据,第五个 pixel_order是指定像素灯的RGB数据排列模式(目前是使用GRB模式)。 前面两个参数是必须的,位置也是固定的,后面三个参数使用了指定名称来传递,可以不用管(demo里抄过来的) 然后再给像素灯默认配置成黑色(不点亮)的状态。
接下来配置按键,代码如下
-
- btn = DigitalInOut(board.BOOT0)
-
- btn.direction = Direction.INPUT
-
- btn.pull = Pull.UP
这里使用BOOT0作为按键输入按钮(RST是复位键,不可以当做常规按键使用),并配置IO为上拉模式。 BOOT0按钮按下时接地,IO为低电平,值是0。 最后就是主循环代码了
-
- led_color = 0
-
-
- while True:
-
- if not btn.value:
-
- if led_color % 5 == 0:
- blink = Blink(pixels, speed=0.5, color=JADE)
- print("LED is JADE")
- elif led_color % 5 == 1:
- blink = Blink(pixels, speed=0.5, color=ORANGE)
- print("LED is ORANGE")
- elif led_color % 5 == 2:
- blink = Blink(pixels, speed=0.5, color=GOLD)
- print("LED is GOLD")
- elif led_color % 5 == 3:
- blink = Blink(pixels, speed=0.5, color=OLD_LACE)
- print("LED is OLD_LACE")
- elif led_color % 5 == 4:
- blink = Blink(pixels, speed=0.5, color=BLACK)
- print("LED is BLACK")
-
- led_color = led_color + 1
- else:
-
- pass
-
- time.sleep(0.2)
-
- blink.animate()
这段代码里,先声明了一个led_color状态变量,并将该变量赋值为0。 在while True主循环里,我们每隔一段时间就判断BOOT0按键是否按下(btn.value等于0为按下),假如按下,则对led_color求余数,让led灯分别在绿色,橙色,金色,白色,黑色五个状态进行变化。 实际上就是使用了Blink(pixels, speed=0.5, color=OLD_LACE)这个函数,把blink重新初始化,让blink实例实现不同颜色的闪烁效果,第一个参数pixels是像素灯实例,第二个参数speed是闪烁的频率(0.5秒),第三个参数color是指定颜色。 blink实例初始化完毕并不会马上开始闪烁,直到用户调用了blink.animate()函数,才开始闪烁。
这个代码是不是非常简单呢?只要跟着学一下就懂了。留一个小作业,大家可以试试,将第二次按下按键时的灯效修改成红色,并且闪烁得更慢一些,例如3秒闪烁一次。可以在评论区置顶找到文章代码和color库源码来查找红色的颜色定义。
感谢大家的观看,下一期预告,控制屏幕显示图片、以及中文内容
|