带有Raspberry Pi的多个温度传感器


19

我已经看到了很多在Raspberry Pi上使用一个温度传感器的示例,但是,如何将5-6个温度传感器复用到Raspberry Pi?我想同时从多个来源读取温度。

我可以简单地在Raspberry Pi上分配GPIO引脚以从每个传感器读取,本质上为一个传感器复制相同的配置,还是我需要某种多路复用器,所有传感器都将插入该多路复用器,然后依次并行发送数据到Raspberry Pi?


1
数据表中:“每个DS18B20都有唯一的64位串行代码,它允许多个DS18B20在同一1-Wire总线上工作。”。尝试阅读数据表(如果您不了解所有内容,请不要担心)。
Gerben

Answers:


18

假设您的传感器是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个引脚,则应该没问题。


嘿,我目前正在设计用一些DS18B20制作10个传感器的温度记录仪,除了寄生功率位以外,You should just make sure you are not trying to use parasitic power.我基本上已经得到您所说的:这是什么意思?我需要使用外部电源代替Pi GPIO上引脚1的3.3V吗?或者,如果我仅使用GND + Data而不使用3V3,那么寄生电源就是吗?-它拒绝热链接到您的用户名:-(
吉姆(Jim)

2
@Jim寄生电源是DS18B20的功能,通过该功能,您只能将GND和IO引脚连接到总线,而不是VCC。Marco Poli说您不应该在此模式下运行它,而应将DS18B20的所有3条线连接到Pi。您不需要外部电源。
NoChecksum

您好,关于您的评论,this is hardcoded in the driver这是否意味着无法将温度传感器连接到其他GPIO引脚(或多个GPIO引脚)?
Bprodz

4

作为参考,这是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

2

通过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

3
Raspberry pi已经有一个用于1-wire的内核模块,另一个专门用于1-wire温度传感器的内核模块(包括de DS18B20)。只需加载模块,即可通过重新读取文件的命令从文件中读取温度。如果您选择使用现成的模块,则无需手动实施该协议。
Marco Poli 2013年


1

您使用哪种温度传感器?如果您有DS18B20之类的东西,那么如果有那么多传感器,则可以链接多达18446744073709551615个传感器。


该传感器的确是DS18B20型,但是您能否详细说明链接的含义,并在可能的情况下指出实现该技术的来源。如果将传感器输入链接在一起,如何区分它们?我需要获取图形温度传感器1,温度传感器2 ...温度传感器n的输出。
jc303

2
@JadCooper的每个ds18b20传感器中都有一个16位序列号。在使用该地址寻址传感器时,它仅从该传感器返回数据。请参阅(本教程)[ learn.adafruit.com/…在pi上使用它们
TheDoctor 2013年

0

回答:

如何将5-6个温度传感器复用到Raspberry Pi?

您可以获得一些附加模块,这些模块具有连接到pi的多个总线。
该视频比较了它们的速度:https : //www.youtube.com/watch?v=YbWidNBycls 他最终使用了重新编译的内核来实现与多个传感器通信的多个GPIO。他还没有发布如何获得结果的结果。但是有可能多路复用而不是仅使用一个引脚。

更新。他已经发布了。他将81个传感器连接到9个单独的GPIO,并能够在3秒内获得所有温度:https : //www.youtube.com/watch?v=JW9wzbp35w8


0

读取多个传感器的理想方法是使用I2C传感器。

这是将多个传感器链接在一起或使用模拟传感器的唯一方法,但是它们将占用大量模拟引脚,而i2c仅使用2条线。假设您使用的是Pi2 / 3,那么我建议您使用带I2C端口的树莓派帽子,这样您就可以在几秒钟内将所有i2c设备与Pi连接起来,并确保您的硬件正确。

现在您有了带有I2C适配器的Pi,让其在传感器部分上移动。TI,AD,NXP,飞思卡尔和许多其他公司都使用I2C来制造温度传感器,但您想连接一个传感器以上,因此有两种选择。

  1. 得到6个具有不同I2C地址的不同I2C传感器,如果您有两个具有相同地址的传感器,它将无法工作。

  2. 您可以获得带有地址线的传感器,只需更改地址,即可将它们与Pi连接,而不会发生任何地址冲突。我建议使用TMP 100传感器,我更喜欢这种传感器,因为它具有2条地址线和浮动地址线支持,因此您可以将6条传感器与1条i2c线连接起来。

使用相同的传感器的好处是您不必阅读6个数据表来编写代码,您将需要学习一个数据表并以简单的方式编写代码。如果所有传感器都相同,那么您将获得更好的比较结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.