熊爸的学习时间

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)
上一篇 下一篇

猜你喜欢

热点阅读