单片机
返回首页

ESP32玩转MicroPython(三) 延时、计时 和GPIO操作

2025-04-07 来源:jianshu

一.  延时和计时

使用time模块:


import time


time.sleep(1)           # sleep for 1 secondtime.sleep_ms(500)      # sleep for 500 millisecondstime.sleep_us(10)       # sleep for 10 microsecondsstart = time.ticks_ms() # get millisecond counterdelta = time.ticks_diff(time.ticks_ms(), start) # compute time difference

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


二. 计时器

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


from machine import Timertim0 = 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 timefrom 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 GPIO2print(p2.value())       # get value, 0 or 1p4 = 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,Timerimport 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 pinpwm0.freq()             # 获取当前PWM频率    get current frequencypwm0.freq(1000)         # 设置PWM的频率   set frequencypwm0.duty()             # 获取当前PWM的占空比   get current duty cyclepwm0.duty(200)          # 设置PWM的占空比set duty cyclepwm0.deinit()           # 失能PWM turn off PWM on the pinpwm2 = PWM(Pin(2), freq=20000, duty=512) #简便写法 create and configure in one go 

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


from machine import Pin, PWMimport 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)



进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 锂离子/锂聚合物USB电池充电器

  • 6晶体管H桥

  • AVR LCD温度计—LM35

  • AVR PC步进电机驱动器

  • AVR温度计TCN75

  • JDM2 PIC 18F 编程器

    相关电子头条文章