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

树莓派Pico使用DS18X20传感器报错:OneWire无OPEN_DRAIN属性

树莓派Pico使用DS18X20传感器时的AttributeError问题解决

问题背景

  • 硬件配置:树莓派Pico,DS18X20温度传感器连接GPIO16
  • 操作流程:从GitHub获取第三方onewire和ds18x20库,运行测试代码读取温度
  • 报错信息:
>>> %Run -c $EDITOR_CONTENT
init
Traceback (most recent call last):
  File "<stdin>", line 11, in <module>
  File "ds18x20.py", line 33, in __init__
  File "onewire.py", line 30, in __init__
AttributeError: 'OneWire' object has no attribute 'OPEN_DRAIN'
>>> 

错误原因

  1. Pin模式引用错误:你使用的第三方onewire库是为Pycom设备设计的,而树莓派Pico的MicroPython中,OPEN_DRAIN是machine.Pin类的属性,而非Pin实例的属性。原库代码中self.pin.init(pin.OPEN_DRAIN, pin.PULL_UP)的写法不符合Pico的API规范。
  2. 库接口冲突:你同时存在两个不同的DS18X20实现(一个在独立的ds18x20.py,一个在onewire.py内部),且测试代码的调用逻辑与库的接口不匹配——测试代码传入OneWire对象给DS18X20类,但你自己的ds18x20.py中DS18X20类初始化需要的是Pin对象,后续调用必然出错。

解决步骤

1. 修正onewire库的Pin模式调用

修改onewire.py中的__init__和init方法,将Pin实例的属性引用改为类属性引用:

def __init__(self, pin):
    self.pin = pin
    self.pin.init(machine.Pin.OPEN_DRAIN, machine.Pin.PULL_UP)
    print("init")

def init(self, pin):
    self.pin = pin
    self.pin.init(machine.Pin.OPEN_DRAIN, machine.Pin.PULL_UP)
    print("init")

2. 统一DS18X20库实现

删除独立的ds18x20.py文件,使用onewire.py内置的DS18X20类,避免接口冲突。

3. 调整测试代码适配正确接口

修改测试代码如下(注意GPIO16的正确引用):

import time
import machine
import onewire

# 传感器连接GPIO16
dat = machine.Pin(16)

# 创建OneWire对象
ow = onewire.OneWire(dat)
# 使用onewire库内置的DS18X20类
ds = onewire.DS18X20(ow)

# 扫描总线上的设备
roms = ds.roms
print('found devices:', roms)

# 循环读取温度
for i in range(10):
    print('temperatures:', end=' ')
    # 启动每个设备的温度转换
    for rom in roms:
        ds.start_conversion(rom)
    # 等待转换完成(DS18X20至少需要750ms)
    time.sleep_ms(750)
    # 读取每个设备的温度
    for rom in roms:
        temp = ds.read_temp_async(rom)
        print(temp, end=' ')
    print()

4. 更优方案:使用官方内置库

树莓派Pico的MicroPython固件已内置onewire和ds18x20模块,无需第三方库,直接使用官方库更稳定:

import time
import machine
import ds18x20
import onewire

# 传感器连接GPIO16
dat = machine.Pin(16)
ow = onewire.OneWire(dat)
ds = ds18x20.DS18X20(ow)

roms = ds.scan()
print('found devices:', roms)

for _ in range(10):
    ds.convert_temp()
    time.sleep_ms(750)
    print('temperatures:', end=' ')
    for rom in roms:
        print(ds.read_temp(rom), end=' ')
    print()

额外注意事项

  • 接线检查:确保DS18X20的VCC接3.3V,GND接Pico的GND,DATA接GPIO16;若传感器模块无内置上拉电阻,需在DATA和3.3V之间接一个4.7kΩ的电阻。
  • 固件版本:若使用官方内置库,需确保Pico的MicroPython固件为最新版本,避免模块缺失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:45:54