2022年 11月 8日

python的延时函数delay_ESP32玩转MicroPython(三) 延时、计时 和GPIO操作

一. 延时和计时

使用time模块:

import time

time.sleep(1) # sleep for 1 second

time.sleep_ms(500) # sleep for 500 milliseconds

time.sleep_us(10) # sleep for 10 microseconds

start = time.ticks_ms() # get millisecond counter

delta = time.ticks_diff(time.ticks_ms(), start) # compute time difference

这些延时是阻塞式延时, 后续程序需要等待其完成

二. 计时器

ESP32端口有四个硬件计时器。使用machine.Timer类,其计时器ID为0到3(包括3):

from machine import Timer

tim0 = Timer(0)

tim0.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(0))

tim0.deinit()

tim1 = Timer(1)

tim1.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(1))

tim1.deinit()

这些延时是计数器延时, 不会阻塞其他程序

下面这个例子能够很好的看出这一点

import time

from machine import Timer

tim0 = Timer(0)

tim0.init(period=5000, mode=Timer.PERIODIC, callback=lambda t:print(‘beep’))

while 1:

print(‘blink’)

time.sleep(3)

值得注意的是, 回调函数必须有一个形参t来接收定时器本身 ,这样可以从回调中停止定时器了

三. IO口

from machine import Pin

p0 = Pin(0, Pin.OUT) # create output pin on GPIO0

p0.on() # set pin to “on” (high) level //测试无效😂😂😂

p0.off() # set pin to “off” (low) level //测试无效😂😂😂

p0.value(1) # set pin to on/high

p2 = Pin(2, Pin.IN) # create input pin on GPIO2

print(p2.value()) # get value, 0 or 1

p4 = Pin(4, Pin.IN, Pin.PULL_UP) # enable internal pull-up resistor

p5 = Pin(5, Pin.OUT, value=1) # set pin high on creation

可用的引脚来自以下范围(包括以下范围):0-19、21-23、25-27、32-39。这些对应于ESP32芯片的实际GPIO引脚号。

引脚1和3分别是REPL UART TX和RX

引脚6、7、8、11、16和17用于连接嵌入式闪存,不建议用于其他用途

引脚34-39仅用于输入,也没有内部上拉电阻

可以设置某些引脚的上拉值Pin.PULL_HOLD以降低深度睡眠期间的功耗。

小例子(闪灯带暂停)

如果按下按键, 则暂停/重启 闪灯

from machine import Pin,Timer

import time

# 初始化

tim0 = Timer(0)

led_blue = Pin(2, Pin.OUT)

key = Pin(0, Pin.IN)

pause = 0

# 闪灯函数

def led_blue_blink(t):

led_blue.value(not led_blue.value())

# 按键暂停函数

def key_pause():

global pause

if not key.value():

#按键弹起检测

while not key.value():

pass

pause = not pause

if pause :

tim0.deinit()

#如果暂停, 失能tim0

else :

tim0.init(period=1000, mode=Timer.PERIODIC, callback=led_blue_blink)

#如果不暂停, 使能tim0

# 主循环函数

def main_loop():

tim0.init(period=1000, mode=Timer.PERIODIC, callback=led_blue_blink)

while 1:

key_pause()

四. PWM

from machine import Pin, PWM

pwm0 = PWM(Pin(0)) # 在一个pin口实现PWM, create PWM object from a pin

pwm0.freq() # 获取当前PWM频率 get current frequency

pwm0.freq(1000) # 设置PWM的频率 set frequency

pwm0.duty() # 获取当前PWM的占空比 get current duty cycle

pwm0.duty(200) # 设置PWM的占空比set duty cycle

pwm0.deinit() # 失能PWM turn off PWM on the pin

pwm2 = PWM(Pin(2), freq=20000, duty=512) #简便写法 create and configure in one go

下面的例子做了一个简易呼吸灯效果:

from machine import Pin, PWM

import time

pwm_freq = 2000 #PWM频率

duty_range = 1000 #PWM最大占空比 千分之多少

delay_rgs = 3 #延迟系数

while 1:

for i in range(0,duty_range):

pwm2 = PWM(Pin(2), freq=pwm_freq, duty=i)

time.sleep_ms(delay_rgs)

for i in range(0,duty_range):

pwm2 = PWM(Pin(2), freq=pwm_freq, duty=duty_range-i)

time.sleep_ms(delay_rgs)