Nhiều cảm biến nhiệt độ với Raspberry Pi


19

Tôi đã thấy rất nhiều ví dụ cho việc sử dụng một cảm biến nhiệt độ với Raspberry Pi, tuy nhiên, làm cách nào tôi có thể ghép cảm biến nhiệt độ 5-6 với Raspberry Pi? Tôi muốn đọc nhiệt độ từ một số nguồn cùng một lúc.

Tôi có thể chỉ cần gán các chân GPIO trên Raspberry Pi để đọc từ mỗi cảm biến, về cơ bản sao chép cùng một cấu hình cho một cảm biến hay tôi cần một loại bộ ghép kênh mà tất cả các cảm biến sẽ cắm vào sau đó sẽ gửi dữ liệu song song đến Raspberry Pi?


1
Từ biểu dữ liệu : "Mỗi DS18B20 có một mã nối tiếp 64 bit duy nhất, cho phép nhiều DS18B20 hoạt động trên cùng một bus 1 dây.". Hãy thử đọc biểu dữ liệu (đừng lo lắng nếu bạn không hiểu mọi thứ).
Gerben

Câu trả lời:


18

Cho rằng cảm biến của bạn là DS18B20, và đó là mạch 1 dây và 1 dây là giao thức có thể thực hiện nhiều lần nhấn trên cùng một bus và mô-đun hạt nhân nhiệt độ 1 dây có thể đọc tới 10 cảm biến nhiệt độ trên cùng một xe buýt. (kiểm tra dòng 49 của mã nguồn trình điều khiển ).

Nếu bạn chỉ kết nối 10 cảm biến của mình với cùng 3 chân (3v3, GND và chân IO 1 dây - là chân số 4 trên đầu nối (đây là mã hóa cứng trong trình điều khiển!) Và bạn sẽ đọc kết quả đầu ra của chúng từ / sys / bus / w1 / thiết bị / 28 * / w1_slave trong đó 28 * là địa chỉ 1 dây duy nhất riêng lẻ. Hãy xem hướng dẫn tuyệt vời của adafbean . Đừng quên điện trở 4K7 kéo lên pin dữ liệu (số 4 - CHỈ MỘT!) , vì Pi kéo lên bên trong cung cấp cho bạn khoảng 50K và đó là quá nhiều cho cảm biến, vì vậy bạn sẽ cần thành phần bổ sung này.

Bạn chỉ nên đảm bảo rằng bạn không cố gắng sử dụng sức mạnh ký sinh. Nếu bạn kết nối 3 chân của tất cả các thiết bị, bạn sẽ ổn thôi.


Xin chào, hiện tại tôi đang trong quá trình thiết kế để tạo một bộ ghi nhiệt độ 10 cảm biến với một số DS18B20, tôi đã hiểu được nhiều điều bạn đang nói ở trên ngoại trừ bit sức mạnh ký sinh: You should just make sure you are not trying to use parasitic power.Ý của bạn là gì? Tôi có cần sử dụng nguồn điện bên ngoài thay vì 3,3V từ pin1 trên GPIO của Pi không? Hoặc là sức mạnh ký sinh nếu tôi chỉ sử dụng Dữ liệu GND + chứ không phải 3V3? - nó từ chối liên kết nóng đến tên người dùng của bạn :-(
Jim

2
@Jim Sức mạnh ký sinh là một tính năng của DS18B20, theo đó bạn chỉ kết nối các chân GND và IO với xe buýt chứ không phải VCC. Marco Poli đang nói rằng bạn không nên chạy nó trong chế độ này, thay vào đó kết nối cả 3 dây từ DS18B20 với Pi. Bạn sẽ không cần một nguồn cung cấp năng lượng bên ngoài.
NoChecksum

Xin chào về nhận xét của bạn, this is hardcoded in the driverđiều đó có nghĩa là việc kết nối các cảm biến nhiệt độ với một chân GPIO khác (hoặc nhiều chân GPIO) sẽ không hoạt động?
Bprodz

4

Để tham khảo, đây là một đoạn ngắn của Python để bitbang GPIO 1 dây và trả về giá trị nhiệt độ cho cảm biến đầu tiên. Nó phải đủ đơn giản để sửa đổi để trả về temps cho tất cả các cảm biến được kết nối dưới dạng một danh sách hoặc một cái gì đó tương tự.

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

cần thời gian nhập quy trình nhập để chạy
Paul Anderson

2

Nói chuyện trên xe buýt 1 dây có thể gây đau đớn. Cho dù bạn đang nói chuyện với 1 cảm biến hay 100, bạn sẽ cần suy nghĩ về thời gian. Tôi đã viết một số mã cho DS18B20 một vài năm trước đây, nhưng nó đã được lắp ráp. Nếu nó được sử dụng, ở đây:

;***************************************************************
;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 đã có một mô-đun hạt nhân cho 1 dây và một mô-đun khác dành riêng cho cảm biến nhiệt độ 1 dây (bao gồm de DS18B20). Chỉ cần tải các mô-đun và nhiệt độ được đọc từ một tệp, với lệnh đọc tệp thử nghiệm. Bạn không cần phải thực hiện thủ công giao thức, nếu bạn chọn sử dụng các mô-đun sẵn sàng.
Marco Poli

2

Nếu quan tâm, đây là hướng dẫn tôi đã viết để sử dụng cảm biến tạm thời DS18B20 (như đã nêu ở trên có thể được kết nối với nhiều như bạn muốn sử dụng cùng một pin GPIO trên Pi) với Raspberry Pi và một số mã Pyhton gửi nó lên một Dịch vụ RESTful tổng hợp và hiển thị nhiệt độ trong biểu đồ và sơ đồ trên trang web. Tất cả mã công khai trên tài khoản GitHub được chỉ định. http://macgyverdev.blogspot.se/2014/01/weather-station-USE-raspberry-pi.html


1

Bạn đang sử dụng loại cảm biến nhiệt độ nào? Nếu bạn có một cái gì đó giống như DS18B20 thì bạn có thể xâu chuỗi tới 18446744073709551615, nếu bạn có nhiều.


Cảm biến thực sự là một loại DS18B20, tuy nhiên bạn có thể vui lòng giải thích ý nghĩa của việc xâu chuỗi và nếu có thể, hãy chỉ ra một nguồn để thực hiện kỹ thuật đó. Làm thế nào một người sẽ phân biệt giữa các đầu vào cảm biến nếu chúng bị xiềng xích? Tôi cần phải có được và đầu ra của cảm biến nhiệt độ đồ thị 1, cảm biến nhiệt độ 2 .... cảm biến nhiệt độ n.
jc303

2
@JadCooper mỗi cảm biến DS18b20 có số sê-ri 16 bit trong đó. Khi bạn giải quyết một cảm biến với nó, nó sẽ trả về dữ liệu từ chỉ cảm biến đó. Xem (hướng dẫn này) [ learn.adafbean.com/ Từ để sử dụng chúng trên pi
TheDoctor

0

Để trả lời:

Làm thế nào tôi có thể ghép các cảm biến nhiệt độ 5-6 với Raspberry Pi?

Có thêm các mô-đun bạn có thể nhận được có nhiều xe buýt để kết nối với pi.
Video này so sánh tốc độ của chúng: https://www.youtube.com/watch?v=YbWidNBycls Anh ấy kết thúc bằng cách sử dụng kernel được biên dịch lại để đạt được nhiều GPIO giao tiếp với nhiều cảm biến. Anh ấy đã không đăng kết quả của mình về cách anh ấy nhận được nó. Nhưng có thể ghép nó thay vì chỉ sử dụng một pin.

Cập nhật. Anh ấy đã đăng bây giờ. Anh ấy đã kết nối 81 cảm biến với 9 GPIO riêng biệt và có thể nhận được tất cả nhiệt độ trong vòng dưới 3 giây: https://www.youtube.com/watch?v=JW9wzbp35w8


0

cách lý tưởng để đọc nhiều cảm biến là sử dụng cảm biến I2C.

đây là cách duy nhất để bạn có thể xâu chuỗi nhiều cảm biến lại với nhau hoặc bạn có thể sử dụng cảm biến analog nhưng chúng sẽ mất rất nhiều chân analog nhưng i2c sẽ chỉ sử dụng 2 dòng. giả sử bạn đang sử dụng Pi2 / 3, sau đó tôi sẽ đề nghị lấy mũ Pi mâm xôi có cổng I2C để bạn có thể kết nối tất cả các thiết bị i2c của mình với Pi trong vài giây và nó sẽ đảm bảo phần cứng của bạn chính xác.

bây giờ bạn có Pi với bộ điều khiển I2C, hãy di chuyển trên phần cảm biến. TI, AD, NXP, freescale và rất nhiều công ty khác tạo cảm biến tạm thời với I2C nhưng bạn muốn kết nối nhiều hơn một cảm biến để có hai tùy chọn.

  1. nhận được 6 cảm biến I2C khác nhau với địa chỉ I2C khác nhau, nếu bạn có hai cảm biến có cùng địa chỉ thì nó sẽ không hoạt động.

  2. bạn có thể nhận được các cảm biến với dòng địa chỉ và chỉ cần thay đổi địa chỉ và bạn có thể kết nối chúng với Pi mà không có bất kỳ xung đột địa chỉ nào. Tôi sẽ đề nghị sử dụng cảm biến TMP 100 này, tôi thích cái này hơn vì nó có 2 dòng địa chỉ với hỗ trợ dòng địa chỉ nổi để bạn có thể kết nối 6 cảm biến với một dòng i2c.

Có một lợi thế của việc sử dụng các cảm biến tương tự là bạn không cần phải đọc 6 biểu dữ liệu để viết mã, bạn sẽ cần nghiên cứu một biểu dữ liệu và viết mã theo cách dễ dàng. nếu tất cả các cảm biến của bạn đều giống nhau thì bạn sẽ có kết quả tốt hơn để so sánh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.