我有一个Raspberry Pi B+和最新的Raspbian。我通过命令中的接口选项激活了1wire支持raspi-config
并将DS2408芯片连接到GPIO 4。
当我尝试检查设备列表时,它们都显示出来
ls -la /sys/bus/w1/devices/
当我尝试cat
他们的输出或状态时,我会收到?
.当我尝试写入输出文件时,没有任何反应。
我有两个问题:
- 有没有更简单的软件接口与DS2408通信?有很多关于读取温度传感器数据的文档,但DS2408不能这样工作。
- 我尝试使用1wire USB加密狗和OWFS工作,但是是否有可能使GPIO 4作为OWFS的总线主站并使用OWFS软件接口进行通信?
回答这些问题中的任何一个都可以解决我与连接到RPI B+的GPIO 4的DS2408对话的问题
我已经设法用树莓派 4 操作 DS2408,但我很难让它工作。首先,它必须正确连接:RSTZ 通过 10k 电阻连接到 Vcc,I/O 引脚连接到 GPIO4,GPIO4 到 3V3 通过 4,7k 电阻。之后,我能够使用"echo -n -e '\x02'>输出"进行读写,其中输出在/sys/bus/w1/devices/29 中-...
我用23 1wire总线实现了我的345个节点。我们的想法是通过在RPi上使用1wire GPIO来简化成本,但实现受到限制,或者我无法在RPi的1wire接口上轻松找到DS2408驱动程序实现。
因此,沿着这条道路走下去,每个RPi都有一个加密狗来使用OWFS驱动1wire。
回答我自己的问题:
- RPi 中的 1wire 实现是有限的。
- 带 OWFS 的 USB 加密狗是驱动 DS2408 的唯一方法。如果不可能,则必须编写自己的扩展。
DS2408 与使用 1 线的 Raspberry Pi 配合使用,我使用的是 http://denkovi.com 的 8 端口继电器。
要打开继电器,您所要做的就是在"/sys/bus/w1/devices/29-xxxxx/output"文件中设置正确的位,但是为了确保您不会更改任何其他继电器,最好读取"/sys/bus/w1/devices/29-xxxx/state"和 OR 或 XOR 打开或关闭继电器。
这是一个非常基本的python脚本(我绝不是程序员(:
#!/usr/bin/python
import sys
from time import sleep
readfile = "/sys/bus/w1/devices/29-xxxxx/state"
writefile = "/sys/bus/w1/devices/29-xxxxx/output"
def getTheState():
try:
f = open(readfile, 'rb')
while True:
binarycontent = f.read(-1)
if not binarycontent:
break
mynum = int.from_bytes(binarycontent,byteorder=sys.byteorder)
f.close()
except IOError:
print('Error While Opening the file!')
return(mynum)
def turnOnRelay(theRelay,theState):
theTag = theRelay
# Turn On Relay
if theTag == 1 :
tagMask = 0b11111110
elif theTag == 2 :
tagMask = 0b11111101
elif theTag == 3 :
tagMask = 0b11111011
elif theTag == 4 :
tagMask = 0b11110111
elif theTag == 5 :
tagMask = 0b11101111
elif theTag == 6 :
tagMask = 0b11011111
elif theTag == 7 :
tagMask = 0b10111111
elif theTag == 8 :
tagMask = 0b01111111
else:
print("Error")
theNewState = theState & tagMask
print("theNewState",theNewState)
return theNewState
def turnOffRelay(theRelay,theState):
theTag = theRelay
# Turn Off Relay
if theTag == 1 :
tagMask = 0b00000001
elif theTag == 2 :
tagMask = 0b00000010
elif theTag == 3 :
tagMask = 0b00000100
elif theTag == 4 :
tagMask = 0b00001000
elif theTag == 5 :
tagMask = 0b00010000
elif theTag == 6 :
tagMask = 0b00100000
elif theTag == 7 :
tagMask = 0b01000000
elif theTag == 8 :
tagMask = 0b10000000
else:
print("Error")
theNewState = theState ^ tagMask
print("theNewState",theNewState)
return theNewState
def updateTheState(theNewState):
try:
newFileBytes = [theNewState]
newFile = open(writefile, "wb")
# write to file
for byte in newFileBytes:
newFile.write(byte.to_bytes(1, byteorder='big'))
except:
print('Error While Opening the file!')
def main():
print("turn relay 1 on")
x = getTheState()
y = turnOnRelay(1,x)
updateTheState(y)
sleep(5)
print("turn relay 1 off")
x = getTheState()
y = turnOffRelay(1,x)
updateTheState(y)
if __name__ == '__main__':
main()
祝你好运,希望这有帮助。
J.