树莓派使用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
相关产品推荐
相关产品推荐

