使用 MicroPython 在 ESP32-S3 上驱动 WS2812 LED 彩虹灯
在 ESP32-S3 上使用 MicroPython 驱动接在 IO48 上的 WS2812 LED 灯。可以很容易的变换各种颜色,也可以实现彩虹一样的渐变效果。
WS2812 通常使用 NeoPixel 库来控制,而 MicroPython 内置了 neopixel 模块。
需要先导入 neopixel 和 machine 模块。ESP32-S3 的 IO48 应该是一个可用的 GPIO 引脚,但需要确认该引脚是否支持 NeoPixel。一般来说,大多数 GPIO 都可以用,但最好避免使用某些特殊功能的引脚。
接下来,需要初始化 NeoPixel 对象,指定引脚和LED数量。板子上只有一个 WS2812,所以数量设为 1。然后设置亮度,可能需要调整。之后,通过填充颜色并写入来显示颜色。例如,红色、绿色、蓝色,然后关闭。
需要注意的是,WS2812 对时序要求严格,所以确保代码中没有长时间阻塞的操作,比如在循环中使用 time.sleep 时不要太久。另外,ESP32-S3 的工作频率可能会影响时序,但 MicroPython 的neopixel 库应该已经处理好了。
以下是使用 MicroPython 在 ESP32-S3 上驱动 WS2812 LED 的示例代码:
from machine import Pin
import neopixel
import time# 初始化NeoPixel,参数说明:
# pin: 使用的GPIO引脚(IO48)
# n: LED数量(这里假设使用1个LED)
# bpp: 色彩模式(3为RGB,4为RGBW)
np = neopixel.NeoPixel(Pin(48), n=1, bpp=3)# 设置亮度(0-255,建议不要超过150以避免过流)
BRIGHTNESS = 64def color_show(r, g, b):# 设置颜色并显示np[0] = (r, g, b)np.write()def cycle_colors():# 循环显示不同颜色color_show(BRIGHTNESS, 0, 0) # 红色time.sleep(1)color_show(0, BRIGHTNESS, 0) # 绿色time.sleep(1)color_show(0, 0, BRIGHTNESS) # 蓝色time.sleep(1)color_show(0, 0, 0) # 关闭LEDtime.sleep(1)# 主程序
try:while True:cycle_colors()
except KeyboardInterrupt:color_show(0, 0, 0) # 安全退出时关闭LED
关键点说明:
-
硬件连接:
-
确保 WS2812 的 DIN 引脚接在 IO48
-
供电建议:
-
少量 LED 可直接用开发板 3.3V 供电
-
多于 3 个 LED 建议使用外部供电
-
-
-
参数调整:
-
n
参数:根据实际 LED 数量修改 -
BRIGHTNESS
:建议范围2 0-150,避免过流 -
bpp
参数:默认 RGB 模式,如果是 RGBW 灯珠需改为 4
-
-
扩展功能:
生成彩虹渐变效果
# 生成彩虹渐变效果 def wheel(pos):if pos < 85:return (pos * 3, 255 - pos * 3, 0)elif pos < 170:pos -= 85return (255 - pos * 3, 0, pos * 3)else:pos -= 170return (0, pos * 3, 255 - pos * 3)def rainbow_cycle():for j in range(255):for i in range(1): # 根据LED数量修改rc_index = (i * 256 // 1) + j # 计算颜色位置np[i] = wheel(rc_index & 255)np.write()time.sleep_ms(20)
常见问题处理:
-
LED 不亮:
-
检查接线顺序(DIN 接 GPIO48,有的板子可能连接 IO38,需要自己确认。)
-
测量供电电压(3.3-5V)
-
尝试降低亮度值
-
-
颜色异常:
-
检查 bpp 设置(RGB/RGBW)
-
尝试交换颜色顺序:
# 如果颜色顺序异常,可修改颜色排列顺序 np[0] = (g, r, b) # GRB顺序示例
-
-
供电不足:
-
添加 470Ω 电阻在数据线上
-
并联 1000μF 电容在电源端
-
建议首次使用时先连接单个 LED 测试,确认正常工作后再连接更多 LED 。
老徐,2025/04/19