我可以简单地分配Raspberry Pi上的GPIO引脚以从每个传感器读取,本质上为一个传感器复制相同的配置,还是我需要某种类型的多路复用器,然后所有传感器都可以插入反过来会并行发送数据到Raspberry Pi?
#1 楼
假设您的传感器是使用1-wire协议的DS18B20,并且最新的RPi Linux内核上的1-wire驱动程序可以在同一1-wire总线上执行多达64个不同的地址:如果您只需将所有传感器连接到相同的3个引脚(3v3,GND和GPIO4-连接器上的引脚4),就会从/ sys / bus / w1 / devices / 28 * / w1_slave读取其输出,其中28 *是单独的唯一1线地址。请查阅adafruit的教程。
别忘了您需要在GPIO4上上拉4K7电阻,因为Pi的内部上拉给您大约50K,这对于传感器来说实在是太多了,所以您将需要此额外的组件。对于连接到1线总线上的任意数量的传感器,仅在3V3和GPIO4之间使用一个4K7电阻。
1线总线之所以得名,是因为它在某些情况下只能通过1线提供所需的电源。这称为“寄生功率”。使用协议的此“功能”不适用于多个连接的传感器。因此,请确保将所有3个引脚都连接到18x20s阵列。
评论
嘿,我目前正在设计用一些DS18B20制作10个传感器的温度记录仪,除了寄生功率位以外,我在上面已经说了很多:您应该确保自己没有试图利用寄生功率。这是什么意思我需要使用外部电源代替Pi的GPIO引脚1上的3.3V吗?或者,如果我仅使用GND + Data而不使用3V3,那是寄生功率吗? -它拒绝热链接到您的用户名:-(
– Jim
16-12-12在14:35
@Jim寄生电源是DS18B20的功能,通过该功能,您只能将GND和IO引脚连接到总线,而不是VCC。 Marco Poli说您不应该在此模式下运行它,而应将DS18B20的所有3根线连接到Pi。您不需要外部电源。
– NoChecksum
18年2月20日在16:08
嗨,关于您的评论,驱动程序中对此进行了硬编码,这是否意味着将温度传感器连接到其他GPIO引脚(或多个GPIO引脚)将无法正常工作?
– Bprodz
18 Mar 5 '18 at 18:47
Bprodz“硬编码”表示您无法在编译后对其进行更改。要更改它,您将需要更改源代码并再次编译。因此,鉴于GPIO引脚和传感器的数量都经过硬编码(我的意思是1线总线),因此更改引脚将需要您编辑源代码并重新编译。我不知道是否可以为该总线类型和该驱动程序提供多个引脚。
– Marco Poli
20年5月9日在21:01
#2 楼
作为参考,这是Python的一小段代码,用于对1-wire GPIO进行位绑定并返回第一个传感器的温度读数。修改起来应该很简单,以便以列表或类似的方式返回所有连接的传感器的温度。import subprocess, time
def read_onewire_temp():
'''
Read in the output of /sys/bus/w1/devices/28-*/w1_slave
If the CRC check is bad, wait and try again (up to 20 times).
Return the temp as a float, or None if reading failed.
'''
crc_ok = False
tries = 0
temp = None
while not crc_ok and tries < 20:
# Bitbang the 1-wire interface.
s = subprocess.check_output('cat /sys/bus/w1/devices/28-*/w1_slave', shell=True).strip()
lines = s.split('\n')
line0 = lines[0].split()
if line0[-1] == 'YES': # CRC check was good.
crc_ok = True
line1 = lines[1].split()
temp = float(line1[-1][2:])/1000
# Sleep approx 20ms between attempts.
time.sleep(0.02)
tries += 1
return temp
评论
需要导入子流程导入时间才能运行
– Paul Anderson
2014年5月20日4:24
#3 楼
通过1线总线通话可能会很痛苦。无论您要与1个传感器还是100个传感器通信,都需要考虑时序。几年前,我为DS18B20写了一些代码,但是它是在汇编中。如果有什么用,请在这里:;***************************************************************
;Title: Temperature Logger
;Description: Polls temperature every two seconds and returns a value
; in degC as well as the slope (rising, falling, steady)
;***************************************************************
Screen EQU $F684
;System Equates
PortA EQU q4312078q00
DDRA EQU q4312078q02
;Program Equates
TxPin EQU %00000001
RxPin EQU %00000010
IntPin EQU %10000000
;Commands
SkipROM EQU $CC
Convert EQU
ReadPad EQU $BE
;Constants
ASCII_0 EQU 48
Poll_D EQU 2000
;Macros
TxOn macro ; Send the 1-wire line Low
MOVB #TxPin,DDRA
MOVB #q4312078q,PortA
endm
TxOff macro ;Releases the 1-wire line letting it return to High.
MOVB #q4312078q,DDRA
endm
;-------------------------------------
;Main
;-------------------------------------
ORG q4312078qD00
; Clear registers and initialise ports
Start: MOVB #q4312078q, DDRA
Main: LDD #q4312078q
JSR Init
LDAA #SkipROM
JSR Write
LDAA #Convert
JSR Write
JSR Wait
JSR Init
LDAA #SkipROM
JSR Write
LDAA #ReadPad
JSR Write
JSR Read ; read first 8 bits
TFR A, B
JSR Read ; read second 8 bits
; Convert bytes to BCD
LSRB
LSRB
LSRB
LSRB
STD TempNew
PSHA
PSHB
LDAB #6
MUL
TBA
PULB
ABA
CLRB
Conv_Lp:SUBA #10
BMI Conv_Dn
INCB
BRA Conv_Lp
Conv_Dn:ADDA #10
TFR A, Y
PULA
ABA
TFR Y, B
; convert BCD bytes to ASCII and store in temp register
LDX #Temp
ADDA #ASCII_0
STAA 0, X
INX
ADDB #ASCII_0
STAB 0, X
LDX #OutUp ; print 'The current temp is '
JSR Echo
LDX #Temp ; print ASCII bytes
JSR Echo
; compare stored temp with previously stored and print 'rising', 'falling' or 'steady'
LDD TempNew
SUBD TempOld
BGT Rising
BEQ Same
LDX #Fall
BRA EchDir
Rising: LDX #Rise
BRA EchDir
Same: LDX #Steady
EchDir: JSR Echo
; wait 2 seconds
LDX #Poll_D
Bla_Lp: JSR Del1ms
DBNE X, Bla_Lp
; set new temp as old temp and loop
LDD TempNew
STD TempOld
JMP Main
SWI
;-------------------------------------
;Subroutines
;-------------------------------------
Init: TxOn ; turn pin on
uDelay 500 ; for 480us
TxOff ; turn pin off
uDelay 70 ; wait 100us before reading presence pulse
JSR Wait
RTS
Wait: LDX #120
Wait_Lp:JSR Del1ms
DBNE X, Wait_Lp
RTS
Write: PSHX
PSHA
LDX #8 ; 8 bits in a byte
Wr_Loop:BITA #%00000001
BNE Wr_S1 ; bit is set, send a 1
BEQ Wr_S0 ; bit is clear, send a 0
Wr_Cont:LSRA ; shift input byte
uDelay 100
DBNE X, Wr_Loop ; shifted < 8 times? loop else end
BRA Wr_End
Wr_S1: TxOn ; on for 6, off for 64
uDelay 6
TxOff
uDelay 64
BRA Wr_Cont
Wr_S0: TxOn ; on for 60, off for 10
uDelay 60
TxOff
uDelay 10
BRA Wr_Cont
Wr_End: PULA
PULX
RTS
Read: PSHB
LDAB #%00000001
CLRA
Rd_Loop:TxOn ; on for 6, off for 10
uDelay 6
TxOff
uDelay 10
BRSET PortA, #RxPin, Rd_Sub1 ; high? add current bit to output byte
Rd_Cont:uDelay 155 ; delay and shift.. 0? shifted 8 times, end
LSLB
BNE Rd_Loop
BRA Rd_End
Rd_Sub1:ABA
BRA Rd_Cont
Rd_End: PULB
RTS
uDelay macro ;Delay a mutliple of 1us (works exactly for elays > 1us)
PSHD
LDD #
SUBD #1
LSLD
\@LOOP NOP
DBNE D, \@LOOP
PULD
endm
;-------------------------------------
;General Functions
;-------------------------------------
; delays
Del1us: RTS
Del1ms: PSHA
LDAA #252
Del_ms: JSR Del1us
JSR Del1us
JSR Del1us
CMPA q4312078q00
CMPA q4312078q00
NOP
DECA
BNE Del_ms
CMPA q4312078q00
NOP
PULA
RTS
; display text from address of X to q4312078q
Echo: PSHY
PSHB
LDAB 0, X
Ech_Lp: LDY Screen
JSR 0, Y
INX
LDAB 0, X
CMPB #0
BNE Ech_Lp
PULB
PULY
RTS
Interrupt:
SWI
RTI
;-------------------------------------
;Variables
;-------------------------------------
ORG 00
OutUp: DC.B 'The current temperature is ', 0
Rise: DC.B ' and Rising', q4312078qD, q4312078qA, 0
Steady: DC.B ' and Steady', q4312078qD, q4312078qA, 0
Fall: DC.B ' and Falling', q4312078qD, q4312078qA, 0
Temp: DS 2
DC.B 0
TempOld:DS 2
TempNew:DS 2
评论
Raspberry pi已经有一个用于1-wire的内核模块,另一个专门用于1-wire温度传感器的内核模块(包括de DS18B20)。只需加载模块,即可通过重新读取文件的命令从文件中读取温度。如果您选择使用ready-modules,则无需手动实现协议。
– Marco Poli
2013年8月7日14:41
#4 楼
如果感兴趣的话,这是我写的关于使用DS18B20温度传感器(使用Pi上的相同GPIO引脚可以与您想要的任意数量链接的温度传感器)与Raspberry Pi和一些将其发布到Pyhton代码的指南。 RESTful服务,可在网站上汇总并以图表形式显示温度。所有代码在指定的GitHub帐户上公开。
http://macgyverdev.blogspot.se/2014/01/weather- station-using-raspberry-pi.html
#5 楼
您使用哪种温度传感器?如果您有DS18B20之类的东西,那么如果有那么多传感器,则可以链接多达18446744073709551615个传感器。评论
该传感器的确是DS18B20型,但是您能否详细说明链接的含义,并在可能的情况下指出实现该技术的来源。如果将它们链接在一起,如何区分传感器输入?我需要获取图形温度传感器1,温度传感器2 ...温度传感器n的输出。
– jc303
13年8月6日在18:16
@JadCooper的每个ds18b20传感器中都有一个16位序列号。在使用该地址寻址传感器时,它仅从该传感器返回数据。参见(本教程)[learn.adafruit.com/…以在pi上使用它们
– TheDoctor
13年8月11日在1:48
#6 楼
要回答:如何将5-6个温度传感器多路复用到Raspberry Pi?
有一些附加模块,您可以将其连接到pi 。
此视频比较了它们的速度:https://www.youtube.com/watch?v=YbWidNBycls
他最终使用了重新编译的内核来实现与多个传感器的多个GPIO通信。他尚未发布如何获得结果的结果。但是有可能多路复用,而不是仅使用一个引脚。
更新。他已经发布了。他将81个传感器连接到9个单独的GPIO,并能够在3秒内获得所有温度:https://www.youtube.com/watch?v = JW9wzbp35w8
#7 楼
读取多个传感器的理想方式是使用I2C传感器。这是将多个传感器链接在一起的唯一方法,也可以使用模拟传感器,但是它们将占用大量模拟引脚,但是i2c仅使用2行。
假设您使用的是Pi2 / 3,那么我建议您使用带I2C端口的树莓派帽子,这样您就可以在数秒内将所有i2c设备与Pi连接起来,并确保您的硬件是正确。
现在您有了带有I2C适配器的Pi,让它在传感器部分上移动。 TI,AD,NXP,飞思卡尔和其他许多公司都使用I2C制造温度传感器,但是您要连接一个以上的传感器,因此有两种选择。具有不同的不同I2C地址,如果您有两个具有相同地址的传感器,它将无法正常工作。
您可以获得带地址线的传感器,只需更改地址,即可将它们与Pi连接,而不会发生任何地址冲突。我建议使用TMP 100传感器,我更喜欢这种传感器,因为它具有2条地址线和浮动地址线支持,因此您可以用一条i2c线连接6条传感器。您不必阅读6个数据表即可编写代码,您将需要学习一个数据表并轻松编写代码。如果所有传感器都相同,那么您将获得更好的比较结果。
评论
从数据表中:“每个DS18B20都有唯一的64位串行代码,它允许多个DS18B20在同一1-Wire总线上工作。”。尝试阅读数据表(如果您不了解所有内容,请不要担心)。