esp32之micropython实现PWM呼吸灯


呼吸灯

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毫秒,并重复执行。

感谢你的阅读,关注我,精彩继续!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值