ESP32玩转MicroPython(三) 延时、计时 和GPI
2020-08-14 本文已影响0人
熊爸天下_56c7
一. 延时和计时
使用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口
使用machine.Pin类:
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)