1173|0

79

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【得捷电子Follow me第2期】任务4:WS2812B效果控制 [复制链接]

  本帖最后由 aramy 于 2023-9-25 10:06 编辑

分任务2:WS2812B效果控制——完成一个Neopixel(12灯珠或以上)控制器,通过按键和屏幕切换展示效果.

以前淘的灯带,一直放着吃灰。灯带是WS2812B灯珠构成的,一条灯带8颗颗灯珠。WS2812B 是一种智能控制 LED 光源,将控制电路和 RGB 芯片集成在一个 5050 个组件的封装中。内部包括智能数字端口数据锁存和信号整形放大驱动电路。还包括精密的内部振荡器和电压可编程恒流控制部分,有效保证像素点的光色高度一致。数据传输协议采用单 NZR 通信模式。像素上电复位后,DIN 端口从控制器接收数据,第一像素采集初始 24位数据,然后发送给内部数据锁存器,其他经过内部信号整形放大电路整形后的数据通过 DO 端口发送给下一个级联像素。每传输一个像素后,信号减少 24 位。像素采用自整形传输技术,使得像素级联数不受信号传输的限制,只取决于信号传输的速度。复位时>280us,中断时不会误复位。刷新频率更新至 2KHz,无闪烁,提高了出色的显示效果。

 

要想驱动WS2812其实也挺不容易,对时序要求特别的高。但是cpy里已经造好了轮子,直接调用库来驱动就好,就变得特别简单了。这里将两条灯带连起来,构成个环,一共是16颗灯珠。使用杜邦线,接到Adafruit ESP32-S3 TFT Feather板子的D12接口。电源也从开发板上取电。

 

代码流程,使用按键控制灯珠的颜色。按键按键使用轮询方式进行查询。使用轮询方式并不是太好,如果要做灯珠的特效,会导致控制WS2812的时间较长,影响按键响应。cpy的多线程尝试了一下,还是有问题,就放弃放弃了。WS2812显示颜色的同时在屏幕上也显示当前灯珠对应的颜色。

import board
import digitalio
import time
import neopixel
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font


pixel = neopixel.NeoPixel(board.D12, 16)
pixel.brightness = 0.8

button = digitalio.DigitalInOut(board.BUTTON)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
but_in=3

led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT

display = board.DISPLAY
font_file = "fonts/LibreBodoniv2002-Bold-27.bdf"

font = bitmap_font.load_font(font_file)

grape = (190, 75, 219)
pixel.fill(0xFF0000)


# 按键控制LED
def colbutton():
    global but_in
    if(not button.value):
        but_in=but_in+1
    if (but_in>3):
        but_in=0
    
def dispinfo(str):
    if(str=="RED"):
        color = 0xFF0000
        text_area = label.Label(font, text="RED", color=color)
        text_area.x = 100
        text_area.y = 60
        display.show(text_area)
        pixel.fill(color)
        
    elif(str=="GREEN"):
        color = 0x00FF00
        text_area = label.Label(font, text="GREEN", color=color)
        text_area.x = 80
        text_area.y = 60
        pixel.fill(color)
    elif(str=="BLUE"):
        color = 0x0000FF
        text_area = label.Label(font, text="BLUE", color=color)
        text_area.x = 90
        text_area.y = 60
        pixel.fill(color)
    else :
        color = 0xFFFFFF
        text_area = label.Label(font, text="WAITING", color=color)
        text_area.x = 70
        text_area.y = 60
        pixel.fill(color)
    display.show(text_area)


while True:
    colbutton()
    if(but_in==0):
        dispinfo("RED")
    elif(but_in==1):
        dispinfo("BLUE")
    elif(but_in==2):
        dispinfo("GREEN")
    else:
        dispinfo("WAITING")
    time.sleep(0.5)
   

    

 

 

 

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表