在科技的世界里,通过代码实现一些有趣的效果总是让人感到兴奋。今天,我们要介绍的是 IT 项目网上的《波浪呼吸灯》项目,它能让一组 LED 灯呈现出波浪般的闪烁效果,就像一条光的波浪在流动。
一、运行效果
这个项目实现了波浪的效果,看起来非常酷炫。下面是运行效果的动态图:
二、代码实现
以下是实现波浪呼吸灯效果的代码:
from machine import Pin, PWM
import time
import math
# LED 引脚定义
led_pins = [13, 12, 14, 27, 26, 25]
leds = [PWM(Pin(pin), freq=1000) for pin in led_pins]
# 初始占空比设为 0
for led in leds:
led.duty(0)
# 控制参数
step = 0 # 用于变化时间
speed = 0.2 # 控制速度(越小越快)
wave_gap = 0.8 # 相位间隔(越大波动越明显)
while True:
for i, led in enumerate(leds):
# 使用正弦函数制造平滑波动,注意 duty 只能是 0~1023
brightness = (math.sin(step + i * wave_gap) + 1) / 2 # 范围变为 0~1
duty = int(brightness * 1023)
led.duty(duty)
step += speed
time.sleep(0.03)
代码对应的解释图如下:
三、核心代码讲解
估计最难理解的就是下面这部分代码了:
while True:
for i, led in enumerate(leds):
# 使用正弦函数制造平滑波动,注意 duty 只能是 0~1023
brightness = (math.sin(step + i * wave_gap) + 1) / 2 # 范围变为 0~1
duty = int(brightness * 1023)
led.duty(duty)
step += speed
time.sleep(0.03)
下面我们一步一步来解释:
1. 啥是 math.sin()
?
math.sin(x)
会根据一个数字 x
输出一个“上下波动”的值(从 -1 到 1),就像心电图那样:
上 - 亮起来
下 - 灭下去
我们要把它变成灯的亮度。
2. 亮度 = 正弦 + 1 再除以 2
brightness = (math.sin(step + i * wave_gap) + 1) / 2
这句话的意思是:
step
是整体动画在时间上推进的变量(每帧动一点)。i * wave_gap
是每个灯的位置偏移量,让它们错开(形成“波”)。math.sin()
会输出-1 ~ 1
,所以加 1 变成0 ~ 2
,再除以 2,变成0~1
的亮度值。
这样就让每个灯都在亮—灭—亮之间“来回变化”。
举个例子:
如果 math.sin(step + i * wave_gap)
输出:
值 | 亮度 (brightness) |
---|---|
-1 | 0.0 |
0 | 0.5 |
+1 | 1.0 |
也就是灯从灭 → 半亮 → 最亮 → 半亮 → 灭, 平滑呼吸循环。
3. 把 0 - 1 的亮度变成 0 - 1023 的 PWM 值
duty = int(brightness * 1023)
因为 PWM.duty()
只能接收 0~1023 的整数,所以要进行这样的转换。
4. 设置第 i 个 LED 的亮度
led.duty(duty)
5. 让正弦波“前进”
step += speed
step
不断增加,就像时间向前走,正弦波也就“前进”,灯也就动起来啦~
6. 帧率控制
time.sleep(0.03)
稍微暂停一下,不然波浪太快你看不清,这个相当于“帧率控制”。
最终效果总结
最终效果就是每个灯以不同步的节奏闪烁,像一条光的波浪,从左到右滚过去,再重复。
一句话总结:这段代码就像在每盏灯上装了一个“呼吸节奏播放器”,每个播放器的节奏稍微错开,就变成了一个“光的波浪”。
如果你想了解更多关于这个项目的详细内容,可以点击下面的链接:
项目详细学习链接
赶紧动手试试,用代码创造出属于你的光的波浪吧!