呼吸灯
1.前言
呼吸灯的定义:
够像人的呼吸一样,实现由暗到亮或由亮到暗的变化。
2.实现呼吸灯的原理
2.1理论原理
呼吸灯基本思想是通过脉冲宽度调制(PWM)实现,即通过调节占空比来对模拟信号电平进行数字编码。关于何为PWM,何为占空比,这里就不再赘述了,简单理解就是,占空比越高,LED两端电压越大,LED越亮。这里用一张图简单的介绍一下呼吸灯的实现原理。
基于此,我们使用machine模块里面的PWM类,进行呼吸灯程序的编写。
2.2代码逻辑
我们可以micropython官网的docs中找到相关的示例。
具体的代码我直接给大家拷贝下来。
from machine import Pin, PWM
pwm0 = PWM(Pin(0)) # create PWM object from a pin
freq = pwm0.freq() # get current frequency (default 5kHz)
pwm0.freq(1000) # set PWM frequency from 1Hz to 40MHz
duty = pwm0.duty() # get current duty cycle, range 0-1023 (default 512, 50%)
pwm0.duty(256) # set duty cycle from 0 to 1023 as a ratio duty/1023, (now 25%)
上述示例代码仅供参考使用。
需要注意两个点:
1.使用的GPIO口具备输出功能
2.占空比的数值要在0-1023之间
接下来是我用普中-esp32实现的一个呼吸灯程序。
我使用的是GPIO15,需要一根杜邦线连接到D1。
下面,展示我写的程序。
from machine import Pin,PWM
#定义led 的引脚,其实定义的是核心板的引脚,通过杜邦线接线即可控制任意灯。
#选择核心板引脚的时候一般使用通用引脚
led2= PWM(Pin(15))
#设置频率为1000
led2.freq(1000)
#数值越大,led亮的程度越大
led2.duty(2)
很多人疑惑说怎么没有看到灯的亮度的变化,其实这个程序只是一部分,通过控制duty去修改数值控制灯的亮度。数值越大,灯的亮度越大。
led2.freq(1000):是将PWM的信号频率设置为1000,即每秒1000次的开关变化。
led2.duty(2): 设置了PWM信号的占空比为2,这意味着在每个周期内,LED灯亮的时间占整个周期的2分之一。
我们尝试将duty里面的2改成500,在运行代码, 这个时候,你会发现,灯的亮灭程度会有很大的改变。
from machine import Pin,PWM
#定义led 的引脚,其实定义的是核心板的引脚,通过杜邦线接线即可控制任意灯。
#选择核心板引脚的时候一般使用通用引脚
led2= PWM(Pin(15))
#设置频率为1000
led2.freq(1000)
#数值越大,led亮的程度越大
led2.duty(500)
根据上下两张图片的效果对比,可以清晰的看出灯亮灭程度的变化。
我们将代码完善一下,让它自己实现亮灭的变化。
from machine import Pin,PWM
import time
#定义led 的引脚,其实定义的是核心板的引脚,通过杜邦线接线即可恐怖告知任意灯。
#选择核心板引脚的时候一般使用通用引脚
led2= PWM(Pin(15))
#设置频率为1000
led2.freq(1000)
#通过循环一直改变灯的状态,从不亮到慢慢亮,从亮到慢慢不亮
while True:
#上限 是1023
for i in range(0,1024):
led2.duty(i)
#毫秒延时
time.sleep_ms(2)
for i in range(1023,-1,-1):
led2.duty(i)
#毫秒延时
time.sleep_ms(2)
我们来分析一下:
1.导入machime模块中的PWM类,导入延时模块time。
2.控制GPIO15,并将其初始化为pin对象。
3.在死循环里面,通过修改duty值来控制灯的亮灭变化,两个循环,从灭到亮,一个从亮到灭。每次循环结束时延时2毫秒,并重复执行。
感谢你的阅读,关注我,精彩继续!