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

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

评论

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

#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个数据表即可编写代码,您将需要学习一个数据表并轻松编写代码。如果所有传感器都相同,那么您将获得更好的比较结果。