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)
- ESP32/8266固件备份方法
- upyOS:基于 MicroPython 的模块化操作系统,兼容 ESP32、RP2040 等微控制器
- ESP32与STM32哪个更适合初学者?问题解析与对比
- STM32与ESP32核心应用场景解析及PCB设计实践(深度探讨)
- ESP32与STM32:比较并非明智之举
- ESP32与STM32:性能对比分析及选型指南
- STM32与ESP32:核心差异详解
- 串口、并口、USB、UART及RS232/RS485接口与ESP32、STM32的应用解析
- ESP32音频输入-MAX4466,MAX9814,SPH0645LM4H,INMP441
- ESP32 ADF windows开发环境搭建 适配ADF到ESP32A1S
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- 蓝牙信道探测技术原理与开发套件实践
- 意法半导体中国本地造STM32微控制器启动规模量产




