我已经看到了很多在Raspberry Pi上使用一个温度传感器的示例,但是,如何将5-6个温度传感器复用到Raspberry Pi?我想同时从多个来源读取温度。
我可以简单地在Raspberry Pi上分配GPIO引脚以从每个传感器读取,本质上为一个传感器复制相同的配置,还是我需要某种多路复用器,所有传感器都将插入该多路复用器,然后依次并行发送数据到Raspberry Pi?
我已经看到了很多在Raspberry Pi上使用一个温度传感器的示例,但是,如何将5-6个温度传感器复用到Raspberry Pi?我想同时从多个来源读取温度。
我可以简单地在Raspberry Pi上分配GPIO引脚以从每个传感器读取,本质上为一个传感器复制相同的配置,还是我需要某种多路复用器,所有传感器都将插入该多路复用器,然后依次并行发送数据到Raspberry Pi?
Answers:
假设您的传感器是DS18B20,并且它是1线电路,并且1线是可以在同一条总线上进行多次寻址的协议,并且1线温度内核模块可以读取多达10个温度传感器在同一辆公共汽车上。(检查驱动程序源代码的第49行)。
如果您仅将10个传感器连接到相同的3个引脚(3v3,GND和1线IO引脚-这是连接器上的引脚4(在驱动程序中是硬编码的!)),您将从/读取它们的输出sys / bus / w1 / devices / 28 * / w1_slave,其中28 *是单独的唯一1线地址。请查阅adafruit的出色教程。不要忘记4K7电阻拉起数据引脚(数字4-只有一个!)。 ,因为Pi的内部上拉电路为您提供了大约50K,这对于传感器来说实在是太大了,所以您将需要这个额外的组件。
您应该确保不使用寄生电源。如果连接所有设备的3个引脚,则应该没问题。
You should just make sure you are not trying to use parasitic power.
我基本上已经得到您所说的:这是什么意思?我需要使用外部电源代替Pi GPIO上引脚1的3.3V吗?或者,如果我仅使用GND + Data而不使用3V3,那么寄生电源就是吗?-它拒绝热链接到您的用户名:-(
this is hardcoded in the driver
这是否意味着无法将温度传感器连接到其他GPIO引脚(或多个GPIO引脚)?
作为参考,这是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
通过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 $0000
DDRA EQU $0002
;Program Equates
TxPin EQU %00000001
RxPin EQU %00000010
IntPin EQU %10000000
;Commands
SkipROM EQU $CC
Convert EQU $44
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 #$00,PortA
endm
TxOff macro ;Releases the 1-wire line letting it return to High.
MOVB #$00,DDRA
endm
;-------------------------------------
;Main
;-------------------------------------
ORG $0D00
; Clear registers and initialise ports
Start: MOVB #$00, DDRA
Main: LDD #$00
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 #\1
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 $0000
CMPA $0000
NOP
DECA
BNE Del_ms
CMPA $0000
NOP
PULA
RTS
; display text from address of X to \0
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 $0800
OutUp: DC.B 'The current temperature is ', 0
Rise: DC.B ' and Rising', $0D, $0A, 0
Steady: DC.B ' and Steady', $0D, $0A, 0
Fall: DC.B ' and Falling', $0D, $0A, 0
Temp: DS 2
DC.B 0
TempOld:DS 2
TempNew:DS 2
如果有兴趣,这是我写的关于使用DS18B20温度传感器(如上所述,可以使用Pi上的相同GPIO引脚与任意数量的链式链接)和Raspberry Pi和一些将其发布到Pyhton代码的指南。 RESTful服务,可在网站上汇总并以图表形式显示温度。所有代码在指定的GitHub帐户上公开。 http://macgyverdev.blogspot.se/2014/01/weather-station-using-raspberry-pi.html
您使用哪种温度传感器?如果您有DS18B20之类的东西,那么如果有那么多传感器,则可以链接多达18446744073709551615个传感器。
回答:
如何将5-6个温度传感器复用到Raspberry Pi?
您可以获得一些附加模块,这些模块具有连接到pi的多个总线。
该视频比较了它们的速度:https : //www.youtube.com/watch?v=YbWidNBycls
他最终使用了重新编译的内核来实现与多个传感器通信的多个GPIO。他还没有发布如何获得结果的结果。但是有可能多路复用而不是仅使用一个引脚。
更新。他已经发布了。他将81个传感器连接到9个单独的GPIO,并能够在3秒内获得所有温度:https : //www.youtube.com/watch?v=JW9wzbp35w8
读取多个传感器的理想方法是使用I2C传感器。
这是将多个传感器链接在一起或使用模拟传感器的唯一方法,但是它们将占用大量模拟引脚,而i2c仅使用2条线。假设您使用的是Pi2 / 3,那么我建议您使用带I2C端口的树莓派帽子,这样您就可以在几秒钟内将所有i2c设备与Pi连接起来,并确保您的硬件正确。
现在您有了带有I2C适配器的Pi,让其在传感器部分上移动。TI,AD,NXP,飞思卡尔和许多其他公司都使用I2C来制造温度传感器,但您想连接一个传感器以上,因此有两种选择。
得到6个具有不同I2C地址的不同I2C传感器,如果您有两个具有相同地址的传感器,它将无法工作。
您可以获得带有地址线的传感器,只需更改地址,即可将它们与Pi连接,而不会发生任何地址冲突。我建议使用TMP 100传感器,我更喜欢这种传感器,因为它具有2条地址线和浮动地址线支持,因此您可以将6条传感器与1条i2c线连接起来。
使用相同的传感器的好处是您不必阅读6个数据表来编写代码,您将需要学习一个数据表并以简单的方式编写代码。如果所有传感器都相同,那么您将获得更好的比较结果。