求助:修改Raspberry Pi 3 B+的WS2812 LED灯带代码实现闪云效果
实现闪云效果的代码调整方案
原代码存在核心问题:内层死循环会卡在第一个LED、未调用strip.show()刷新显示、无亮度变化逻辑、未模拟云的局部随机闪烁特性。以下是调整后的代码及说明:
修改后的完整代码
from rpi_ws281x import * import random import time # LED strip configuration: LED_COUNT = 20 # Number of LED pixels. LED_PIN = 10 # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0). LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz) LED_DMA = 10 # DMA channel to use for generating signal (try 10) LED_BRIGHTNESS = 255 # 基础亮度上限,实际亮度通过RGB值缩放控制 LED_INVERT = False # True to invert the signal (when using NPN transistor level shift) LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53 # 初始化灯带 strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL) strip.begin() # 初始化所有LED为色域内的基础颜色 for i in range(LED_COUNT): base_r = random.randint(80, 200) base_b = random.randint(150, 255) strip.setPixelColor(i, Color(base_r, 0, base_b)) strip.show() try: while True: # 每次随机选择1-4个LED进行闪烁变化(模拟云的局部闪烁) num_leds_to_change = random.randint(1, 4) for _ in range(num_leds_to_change): led_idx = random.randint(0, LED_COUNT - 1) # 生成指定色域内的随机颜色 r = random.randint(80, 200) b = random.randint(150, 255) # 随机亮度系数(0.3-1.0,实现不同亮度效果) brightness_factor = random.uniform(0.3, 1.0) # 应用亮度缩放 r_bright = int(r * brightness_factor) b_bright = int(b * brightness_factor) # 设置LED颜色 strip.setPixelColor(led_idx, Color(r_bright, 0, b_bright)) # 刷新显示 strip.show() # 控制闪烁间隔,0.1-0.3秒随机,模拟自然闪烁 time.sleep(random.uniform(0.1, 0.3)) except KeyboardInterrupt: # 中断时关闭所有LED for i in range(LED_COUNT): strip.setPixelColor(i, Color(0,0,0)) strip.show()
关键调整说明
- 修复循环逻辑:将死循环移到最外层,确保每次循环能处理多个LED,而非卡在单个LED上
- 添加亮度控制:通过
brightness_factor随机缩放RGB值,实现不同亮度的闪烁效果,符合需求 - 局部闪烁模拟:每次随机选择1-4个LED进行颜色更新,而非全部同步变化,还原视频中云的局部明暗变化特性
- 初始化基础状态:启动时先给所有LED设置色域内的随机颜色,避免初始全黑
- 随机延迟:使用
random.uniform(0.1, 0.3)控制刷新间隔,让闪烁更自然,无固定节奏 - 中断处理:添加KeyboardInterrupt捕获,按下Ctrl+C时能关闭所有LED,避免灯带一直亮着
内容的提问来源于stack exchange,提问作者attmo
相关产品推荐
相关产品推荐

