라즈베리 파이가 장착 된 다중 온도 센서


19

Raspberry Pi와 함께 하나의 온도 센서를 사용하는 데 대한 많은 예를 보았지만 어떻게 5-6 온도 센서를 Raspberry Pi에 멀티플렉싱 할 수 있습니까? 여러 소스의 온도를 동시에 읽고 싶습니다.

Raspberry Pi의 GPIO 핀을 각 센서에서 읽도록 할당 할 수 있습니까? 본질적으로 하나의 센서에 대해 동일한 구성을 복제하거나 모든 센서를 연결 한 다음 병렬로 데이터를 전송하는 일종의 멀티플렉서가 필요합니까? 라즈베리 파이에게?


1
로부터 시트 "각 DS18B20 동일한 1 선 버스의 기능에 여러 DS18B20s 수있는 64 비트의 고유 일련 번호를 갖는다.". 데이터 시트를 읽어보십시오 (모든 내용을 이해하지 않아도 걱정하지 마십시오).
Gerben

답변:


18

센서가 DS18B20이고 1- 와이어 회로이고 1- 와이어는 동일한 버스에서 다중 주소 지정을 수행 할 수있는 프로토콜이며 1- 와이어 온도 커널 모듈은 최대 10 개의 온도 센서를 읽을 수 있습니다 같은 버스에서. ( 드라이버 소스 코드의 49 행을 확인하십시오 ).

센서 10 개를 동일한 3 핀 (3v3, GND 및 1 선 IO 핀-커넥터의 핀 번호 4 (드라이버에 하드 코딩되어 있음)에 연결하면 /에서 출력을 읽습니다) sys / bus / w1 / devices / 28 * / w1_slave 여기서 28 *는 고유 한 1-wire 주소입니다 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 대신 외부 전원 공급 장치를 사용해야합니까? 아니면 3V3이 아닌 GND + Data 만 사용하면 기생 전력입니까? -그것은 귀하의 사용자 이름으로 핫 링크를 거부했습니다 :-(
Jim

2
@Jim 기생 전력은 VCC가 아닌 버스에 GND 및 IO 핀만 연결하는 DS18B20의 기능입니다. Marco Poli는 DS18B20에서 Pi로 3 개의 와이어를 모두 연결하는 대신이 모드에서 실행하면 안된다고 말합니다. 외부 전원 공급 장치가 필요하지 않습니다.
NoChecksum

안녕하십니까, this is hardcoded in the driver온도 센서를 다른 GPIO 핀 (또는 여러 GPIO 핀)에 연결하면 작동하지 않습니까?
Bprodz

4

참고로, 여기에는 1- 와이어 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 온도 센서 (DS18B20 포함)를위한 커널 모듈이 있습니다. 모듈을로드하기 만하면 온도가 reagular 파일 읽기 명령으로 파일에서 읽 힙니다. 준비 모듈을 사용하기로 선택한 경우 프로토콜을 수동으로 구현할 필요가 없습니다.
Marco Poli

2

관심이 있다면, 여기에 Rasberry Pi 및 Pyhton 코드를 게시하는 DS18B20 온도 센서 (위에서 언급 한 것처럼 Pi에서 동일한 GPIO 핀을 사용하여 원하는만큼 체인으로 연결할 수 있음)를 사용하기 위해 작성한 가이드가 있습니다. 웹 사이트에서 온도를 집계하여 차트와 다이어그램으로 표시하는 RESTful 서비스입니다. 지정된 GitHub 계정에서 모든 코드가 공개됩니다. http://macgyverdev.blogspot.se/2014/01/weather-station-using-raspberry-pi.html


1

어떤 온도 센서를 사용하고 있습니까? DS18B20과 같은 것이 있다면 최대 18446744073709551615 센서를 연결할 수 있습니다.


이 센서는 실제로 DS18B20 유형이지만 체인의 의미를 정교하게 설명하고 가능한 경우 그러한 기술의 구현을위한 소스를 가리킬 수 있습니다. 센서 입력이 연결된 경우 어떻게 센서 입력을 구별합니까? 그래프 온도 센서 1, 온도 센서 2, 온도 센서 n의 출력을 얻어야합니다.
jc303

2
@JadCooper 각 ds18b20 센서에는 16 비트 일련 번호가 있습니다. 센서로 주소를 지정하면 해당 센서의 데이터 만 반환합니다. 파이에서 그것들을 사용하기 위해서는 (이 튜토리얼) [ learn.adafruit.com/… 참조
TheDoctor

0

대답하려면 :

5-6 온도 센서를 Raspberry 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 장치를 Pi와 연결할 수 있고 하드웨어가 올바른지 확인하기 위해 I2C 포트가 있는 라즈베리 파이 모자 를 얻을 것을 제안 합니다.

이제 센서 부분에 I2C 어댑터가있는 Pi가 있습니다. TI, AD, NXP, 프리 스케일 및 기타 여러 회사에서 I2C로 온도 센서를 만들지 만 하나 이상의 센서를 연결하여 두 가지 옵션이 있습니다.

  1. 서로 다른 I2C 주소를 가진 6 개의 서로 다른 I2C 센서를 얻습니다. 동일한 주소를 가진 두 개의 센서가 있으면 작동하지 않습니다.

  2. 주소 라인이있는 센서를 가져오고 주소를 변경하면 주소 충돌없이 Pi와 연결할 수 있습니다. 이 TMP 100 센서를 사용하는 것이 좋습니다. 부동 주소 라인을 지원하는 2 개의 주소 라인이 있으므로 6 개의 센서를 하나의 i2c 라인으로 연결할 수 있기 때문에 이것을 선호합니다.

동일한 센서를 사용하면 코드를 작성하기 위해 6 개의 데이터 시트를 읽을 필요가 없다는 장점이 있습니다. 하나의 데이터 시트를 연구하고 코드를 쉽게 작성해야합니다. 모든 센서가 동일하면 더 나은 결과를 얻을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.