0

OWFS让我们通过其他接口读取 1-wire 设备,在我的例子中是I2C ( DS2484 )。我可以通过 owhttpd 接口一次成功读取一个温度(DS18B20http://localhost:4305/28.2F3915060000 s) 。我也可以使用 python 接口阅读它们:

import pyownet
ow = pyownet.protocol.proxy(host='localhost', port=4304)
for ts in ow.dir():
    print(ow.read(ts + 'temperature12'))

但是,我有 30 个传感器。此方法一次读取一个。每个需要 500-750ms,所以整个过程可能需要 17s。

1 线的一个巧妙之处在于,您可以请求所有传感器一次并行读取,这是一个缓慢的步骤,然后让它们按顺序报告,这非常快。OWFS 是否支持以某种方式读取它们?

4

1 回答 1

1

我想出了一个非常不优雅的解决方案,但它确实有效。这个旧的讨论板消息表明使用 OWFS 的伪文件simultaneous/temperature是正确的开始。该消息没有解决之后要做什么,似乎所有温度功能都需要新的温度读数。但是您可以在不请求新读取的情况下读取暂存器。

这是我开始工作的代码:

import pyownet
from time import sleep


ow = pyownet.protocol.proxy(host='localhost', port=4304)
ow.write('simultaneous/temperature', data=b'1')    # begin conversions
sleep(0.75)                                        # need to wait for conversion
for ts in ow.dir():
    sp = ow.read(ts + 'scratchpad')
    b = sp[:2]                                     # first two bytes are temp
    if b[1] <= 0x01:
        t = ((b[1] << 8) + b[0]) * 0.0625          # positive temps
    else:
        t = 4096. - ((b[1] << 8) + b[0]) * 0.0625  # negative temps
    addr = ow.read(ts + 'address')
    print((addr, sp, t))

我很想看看是否有人有不需要手动温度转换的解决方案。我仍然认为它可能,我只是找不到文档。

于 2017-08-11T23:14:52.640 回答