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

树莓派使用adafruit_dht读AM2301 重复运行报unable to set line to input错

故障根因

你遇到的unable to set line 24 to input报错和传感器适配无关,AM2301(DHT21)的通信时序和DHT22完全兼容,用adafruit_dht库的DHT22类驱动完全可行。
报错的核心原因是库默认启用的pulseio采集模式,在程序首次运行退出时不会主动释放占用的GPIO线路,Linux内核会持续标记对应引脚为已占用状态,二次运行时无法重新申请引脚操作权限就会触发报错,更换引脚后首次运行正常、后续复现同样问题也是这个原因导致的。

运行报错截图

修复步骤
  • 初始化DHT设备时传入use_pulseio=False参数,禁用pulseio模式——这也是库官方专门标注的、树莓派这类Linux单板机的必需适配项
  • 补上全局的资源释放逻辑,确保程序无论正常退出还是异常退出,都主动释放GPIO占用,避免残留
  • 删除冗余的无用导入from pulseio import PulseIn,禁用pulseio后该模块不会被调用

修改后的完整可运行代码如下:

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

import time
import board
import adafruit_dht

# 初始化DHT设备,指定数据引脚为D17,禁用pulseio模式
dhtDevice = adafruit_dht.DHT22(board.D17, use_pulseio=False)

if __name__ == "__main__":
    try:
        while True:
            try:
                # 读取温湿度数值
                temperature_c = dhtDevice.temperature
                temperature_f = temperature_c * (9 / 5) + 32
                humidity = dhtDevice.humidity
                print(
                    "Temp: {:.1f} F / {:.1f} C    Humidity: {}% ".format(
                        temperature_f, temperature_c, humidity
                    )
                )

            except RuntimeError as error:
                # DHT系列传感器读取偶发报错属于正常现象,等待后重试即可
                print(error.args[0])
                time.sleep(2.0)
                continue

            time.sleep(2.0)
    finally:
        # 退出前主动释放GPIO资源
        dhtDevice.exit()
注意事项
  • 如果修改代码后第一次运行仍触发相同报错,重启一次开发板清除之前运行残留的GPIO占用即可,后续重复启停程序不会再出现该问题
  • 不需要额外寻找AM2301专属适配库,现有DHT22驱动可以完全兼容该传感器,读数不会出现偏差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:12:24