ZetCode

Python time.sleep_ms 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 time.sleep_ms 函数,该函数会暂停执行指定毫秒数。我们将介绍基本用法、定时操作以及使用微控制器的实际示例。

基本定义

time.sleep_ms 函数会暂停程序执行指定的毫秒数。它通常在 MicroPython 和其他嵌入式 Python 实现中可用。

主要特点:毫秒精度、提供非阻塞替代方案,并且对于硬件项目中的定时控制非常有用。与 time.sleep 不同,它采用整数毫秒而不是浮点秒。

基本延迟示例

time.sleep_ms 最简单的用法是在毫秒内创建延迟。此示例显示了不同延迟持续时间的基本用法。

basic_delay.py
import time

print("Starting...")
time.sleep_ms(500)  # Delay for 500 milliseconds
print("Half second passed")
time.sleep_ms(1000) # Delay for 1 second
print("One second passed")
time.sleep_ms(2000) # Delay for 2 seconds
print("Two seconds passed")

此示例演示了打印语句之间的简单延迟。该函数接受一个整数参数,表示暂停执行的毫秒数。

请注意,在嵌入式环境中,使用 sleep_ms 比使用 sleep 将秒转换为毫秒更精确。

闪烁 LED 示例

time.sleep_ms 通常用于硬件项目中来控制定时。此示例显示了一个 LED 闪烁模式。

blink_led.py
from machine import Pin
import time

led = Pin(2, Pin.OUT)  # Configure GPIO2 as output

while True:
    led.value(1)       # Turn LED on
    time.sleep_ms(500) # Wait 500ms
    led.value(0)       # Turn LED off
    time.sleep_ms(500) # Wait 500ms

这将创建一个具有 500 毫秒间隔的可见闪烁模式。定时以毫秒为单位精确控制闪烁速率。

对于带有内置 LED 的 MicroPython 板,这无需额外的硬件即可提供即时的视觉反馈。

按钮去抖

time.sleep_ms 通过在检测后添加延迟来帮助机械按钮去抖。此示例显示了简单的去抖逻辑。

debounce.py
from machine import Pin
import time

button = Pin(0, Pin.IN, Pin.PULL_UP)  # Configure GPIO0 as input

while True:
    if button.value() == 0:  # Button pressed
        time.sleep_ms(50)    # Debounce delay
        if button.value() == 0:  # Still pressed
            print("Button pressed!")
            while button.value() == 0:  # Wait for release
                time.sleep_ms(10)

初始延迟会滤除机械抖动。第二次检查会在抖动期后确认真正的按下。

典型的去抖时间范围为 10-50 毫秒,具体取决于开关特性。

非阻塞延迟

此示例演示了使用带有时间戳的 time.sleep_ms 进行的非阻塞延迟,允许其他代码在等待期间运行。

non_blocking.py
import time

last_print = 0
print_interval = 1000  # 1 second

while True:
    current_time = time.ticks_ms()
    
    if time.ticks_diff(current_time, last_print) >= print_interval:
        print("Regular message every second")
        last_print = current_time
    
    # Other tasks can run here
    # while waiting for the interval

此示例没有使用 sleep_ms 进行阻塞,而是使用 ticks_msticks_diff 检查经过的时间。

这种模式对于需要同时执行多个任务的响应式应用程序至关重要。

脉冲宽度调制 (PWM)

time.sleep_ms 可以创建简单的 PWM 信号,用于控制 LED 亮度或电机速度。此示例显示了手动 PWM。

pwm.py
from machine import Pin
import time

led = Pin(2, Pin.OUT)
duty_cycle = 30  # 30% brightness

while True:
    # On time
    led.value(1)
    time.sleep_ms(duty_cycle)
    
    # Off time
    led.value(0)
    time.sleep_ms(100 - duty_cycle)

占空比通过改变开/关比率来控制亮度。这将创建一个具有可调占空比的 100Hz PWM 信号。

为了获得更好的性能,请在可用时使用硬件 PWM 而不是软件定时。

定时传感器读数

time.sleep_ms 帮助间隔传感器读数以防止过载。此示例显示了定时 DHT22 传感器读数。

sensor_timing.py
import dht
from machine import Pin
import time

sensor = dht.DHT22(Pin(4))
read_interval = 2000  # 2 seconds between reads

while True:
    try:
        sensor.measure()
        temp = sensor.temperature()
        hum = sensor.humidity()
        print(f"Temp: {temp}°C, Humidity: {hum}%")
    except Exception as e:
        print("Sensor read error:", e)
    
    time.sleep_ms(read_interval)

延迟确保了传感器读数之间的正确定时。许多传感器需要测量之间的最小间隔。

错误处理很重要,因为传感器可能会在读取期间发生故障,尤其是在嘈杂的环境中。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 Python 教程