入门MicroPython+ESP32:波浪呼吸灯

在科技的世界里,通过代码实现一些有趣的效果总是让人感到兴奋。今天,我们要介绍的是 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)
-10.0
00.5
+11.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)

稍微暂停一下,不然波浪太快你看不清,这个相当于“帧率控制”。

最终效果总结

最终效果就是每个灯以不同步的节奏闪烁,像一条光的波浪,从左到右滚过去,再重复。

一句话总结:这段代码就像在每盏灯上装了一个“呼吸节奏播放器”,每个播放器的节奏稍微错开,就变成了一个“光的波浪”。

如果你想了解更多关于这个项目的详细内容,可以点击下面的链接:
项目详细学习链接

赶紧动手试试,用代码创造出属于你的光的波浪吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值