You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DHT22传感器读取失败后无法重试问题求助

问题分析与解决方案

你的问题核心是没注意到新版Adafruit DHT库的缓存机制,以及当前循环逻辑的局限性:

  1. 库的device.temperature属性默认会缓存上次成功读取的值,当传感器断开后,读取操作可能不会抛出RuntimeError,而是直接返回缓存的旧值,导致你的重试逻辑根本不会触发。
  2. 你的内层循环只在每次外层循环启动时执行一次,只要拿到一个值(哪怕是缓存的旧值)就会跳出循环打印,后续不会再尝试重新读取验证传感器状态。

修正后的代码

import time
import adafruit_dht
import board

device1 = adafruit_dht.DHT22(board.D4)

while True:
    t1 = None
    while t1 is None:
        try:
            # 先触发一次主动测量,确保获取最新数据
            device1.measure()
            temp = device1.temperature
            hum = device1.humidity
            # 额外校验数据有效性,避免无效值或缓存
            if temp is not None and hum is not None:
                t1 = temp
            else:
                time.sleep(0.1)
        except RuntimeError:
            # 读取失败时短暂休眠后重试
            time.sleep(0.1)
    print("Device 1:", t1)
    time.sleep(2)

你遗漏的核心概念

  • 硬件库的缓存策略:为了减少硬件访问压力,很多传感器库会缓存读取结果,直接访问属性不一定会触发新的硬件读取,需要调用显式的测量方法(比如measure())来获取最新数据。
  • 数据有效性校验:即使没有抛出异常,传感器返回的数据也可能无效(比如None),必须主动校验才能确保拿到的是有效数据。
  • 循环逻辑的持续性验证:你的原有逻辑只在每次循环开始时尝试获取一次有效值,之后就不再验证传感器状态,需要让重试逻辑覆盖每次读取的全流程,确保打印的始终是最新的有效数据。

内容的提问来源于stack exchange,提问作者poseydoom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:12:23